diff --git a/exe/gold_miner b/exe/gold_miner index c3cc10c..09849e2 100755 --- a/exe/gold_miner +++ b/exe/gold_miner @@ -16,9 +16,9 @@ t0 = Time.now GoldMiner .mine_in(channel) - .fmap { |messages| - debug "Found #{messages.size} messages in #{Time.now - t0} seconds." - puts GoldMiner.convert_messages_to_blogpost(channel, messages) + .fmap { |gold_container| + debug "Found #{gold_container.gold_nuggets.size} messages in #{Time.now - t0} seconds." + puts GoldMiner.convert_messages_to_blogpost(channel, container) } .or { |error| abort "[ERROR] #{error}" } diff --git a/lib/gold_miner.rb b/lib/gold_miner.rb index 8cb83f8..4a47b75 100644 --- a/lib/gold_miner.rb +++ b/lib/gold_miner.rb @@ -16,11 +16,11 @@ def mine_in(slack_channel, slack_client: GoldMiner::Slack::Client, env_file: ".e .fmap { |client| explore(slack_channel, client) } end - def convert_messages_to_blogpost(channel, gold_nuggets, blog_post_builder: GoldMiner::BlogPost) + def convert_messages_to_blogpost(channel, container, blog_post_builder: GoldMiner::BlogPost) blog_post_builder.new( - slack_channel: channel, - gold_nuggets: gold_nuggets, - since: Helpers::Time.last_friday, + slack_channel: container.origin, + gold_nuggets: container.gold_nuggets, + since: container.packing_date, writer: BlogPost::Writer.from_env ) end diff --git a/lib/gold_miner/gold_container.rb b/lib/gold_miner/gold_container.rb new file mode 100644 index 0000000..efcff20 --- /dev/null +++ b/lib/gold_miner/gold_container.rb @@ -0,0 +1,3 @@ +module GoldMiner + GoldContainer = Data.define(:gold_nuggets, :origin, :packing_date) +end diff --git a/lib/gold_miner/slack_explorer.rb b/lib/gold_miner/slack_explorer.rb index debcbb3..470e09a 100644 --- a/lib/gold_miner/slack_explorer.rb +++ b/lib/gold_miner/slack_explorer.rb @@ -8,14 +8,16 @@ def initialize(slack_client, author_config) end def explore(channel, start_on:) + start_on = Date.parse(start_on.to_s) interesting_messages = interesting_messages_query(channel, start_on) Sync do til_messages_task = Async { search_messages(interesting_messages.with_topic("TIL")) } tip_messages_task = Async { search_messages(interesting_messages.with_topic("tip")) } hand_picked_messages_task = Async { search_messages(interesting_messages.with_reaction("rupee-gold")) } + nuggets = extract_nuggets(til_messages_task, tip_messages_task, hand_picked_messages_task) - merge_messages(til_messages_task, tip_messages_task, hand_picked_messages_task) + GoldContainer.new(gold_nuggets: nuggets, origin: channel, packing_date: start_on) end end @@ -25,10 +27,10 @@ def interesting_messages_query(channel, start_on) Slack::MessagesQuery .new .on_channel(channel) - .sent_after(Date.parse(start_on.to_s)) + .sent_after(start_on) end - def merge_messages(*search_tasks) + def extract_nuggets(*search_tasks) search_tasks .flat_map(&:wait) .uniq { |message| message[:permalink] } diff --git a/spec/gold_miner/slack_explorer_spec.rb b/spec/gold_miner/slack_explorer_spec.rb index 9f3360e..f6c10bf 100644 --- a/spec/gold_miner/slack_explorer_spec.rb +++ b/spec/gold_miner/slack_explorer_spec.rb @@ -40,21 +40,24 @@ "user" => user3, "permalink" => "https:///message-4-permalink.com" ) + slack_channel = "dev" stub_slack_message_search_requests(slack_client, { - "TIL in:dev after:#{date}" => [msg1, msg2], - "tip in:dev after:#{date}" => [msg2, msg3], - "in:dev after:#{date} has::rupee-gold:" => [msg2, msg4] + "TIL in:#{slack_channel} after:#{date}" => [msg1, msg2], + "tip in:#{slack_channel} after:#{date}" => [msg2, msg3], + "in:#{slack_channel} after:#{date} has::rupee-gold:" => [msg2, msg4] }) explorer = described_class.new(slack_client, author_config) - messages = explorer.explore("dev", start_on: date) + container = explorer.explore(slack_channel, start_on: date) - expect(messages).to match_array [ + expect(container.gold_nuggets).to match_array [ TestFactories.create_gold_nugget(content: msg1.text, author: author1, source: msg1.permalink), TestFactories.create_gold_nugget(content: msg2.text, author: author2, source: msg2.permalink), TestFactories.create_gold_nugget(content: msg3.text, author: author2, source: msg3.permalink), TestFactories.create_gold_nugget(content: msg4.text, author: author3, source: msg4.permalink) ] + expect(container.origin).to eq slack_channel + expect(container.packing_date).to eq Date.parse(date) end end diff --git a/spec/gold_miner_spec.rb b/spec/gold_miner_spec.rb index 85af6fd..791b343 100644 --- a/spec/gold_miner_spec.rb +++ b/spec/gold_miner_spec.rb @@ -23,8 +23,9 @@ slack_client_builder = double(GoldMiner::Slack::Client, build: Success(slack_client)) result = GoldMiner.mine_in("dev", slack_client: slack_client_builder, env_file: "./spec/fixtures/.env.test") + gold_nuggets = result.value!.gold_nuggets - expect(result.value!).to eq [ + expect(gold_nuggets).to eq [ TestFactories.create_gold_nugget( content: slack_message.text, author: TestFactories.create_author( @@ -40,7 +41,8 @@ describe ".convert_messages_to_blogpost" do it "converts slack messages to a blogpost" do - travel_to "2022-10-07" do + date = "2022-10-07" + travel_to date do with_env("OPEN_AI_API_TOKEN" => nil) do channel = "dev" gold_nuggets = [ @@ -48,13 +50,18 @@ TestFactories.create_gold_nugget ] blog_post_builder = spy("BlogPost builder") + container = TestFactories.create_gold_container( + gold_nuggets: gold_nuggets, + origin: channel, + packing_date: Date.today + ) - GoldMiner.convert_messages_to_blogpost(channel, gold_nuggets, blog_post_builder: blog_post_builder) + GoldMiner.convert_messages_to_blogpost(channel, container, blog_post_builder: blog_post_builder) expect(blog_post_builder).to have_received(:new).with( slack_channel: channel, gold_nuggets: gold_nuggets, - since: "2022-09-30", + since: Date.parse(date), writer: instance_of(GoldMiner::BlogPost::SimpleWriter) ) end @@ -63,18 +70,24 @@ context "when the OPEN_AI_API_TOKEN is set" do it "uses the OpenAiWriter" do - travel_to "2022-10-07" do + date = "2022-10-07" + travel_to date do with_env("OPEN_AI_API_TOKEN" => "test-token") do channel = "dev" gold_nuggets = [] blog_post_builder = spy("BlogPost builder") + container = TestFactories.create_gold_container( + gold_nuggets: gold_nuggets, + origin: channel, + packing_date: Date.today + ) - GoldMiner.convert_messages_to_blogpost(channel, gold_nuggets, blog_post_builder: blog_post_builder) + GoldMiner.convert_messages_to_blogpost(channel, container, blog_post_builder: blog_post_builder) expect(blog_post_builder).to have_received(:new).with( slack_channel: channel, gold_nuggets: gold_nuggets, - since: "2022-09-30", + since: Date.parse(date), writer: instance_of(GoldMiner::BlogPost::OpenAiWriter) ) end diff --git a/spec/support/test_factories.rb b/spec/support/test_factories.rb index 5aadcd1..520a9a2 100644 --- a/spec/support/test_factories.rb +++ b/spec/support/test_factories.rb @@ -10,6 +10,15 @@ def create_author(overriden_attributes = {}) GoldMiner::Author.new(**default_attributes.merge(overriden_attributes)) end + def create_gold_container(overriden_attributes = {}) + default_attributes = { + gold_nuggets: [], + origin: "some-channel", + packing_date: Date.today + } + GoldMiner::GoldContainer.new(**default_attributes.merge(overriden_attributes)) + end + def create_gold_nugget(overriden_attributes = {}) default_attributes = { content: "TIL about the difference betweeen .size and .count in Rails",