Skip to content

Commit 909db49

Browse files
committed
Add builder, job and generator for json data with provider regions #444
1 parent 55727e7 commit 909db49

File tree

8 files changed

+129
-1
lines changed

8 files changed

+129
-1
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
class ProviderRegionDataJob < ApplicationJob
2+
limits_concurrency to: 1, key: ->(language_id) { "hard-limit" }
3+
4+
def perform(language_id)
5+
language = Language.find(language_id)
6+
deliver_provider_region_data(language)
7+
end
8+
9+
private
10+
11+
def deliver_provider_region_data(language)
12+
provider_region_data(language).tap { |file| deliver(file) }
13+
end
14+
15+
def provider_region_data(language)
16+
FileToUpload.new(
17+
content: JsonGenerator::ProviderRegions.new(language).perform,
18+
name: "#{language.file_storage_prefix}provider_region_data.json",
19+
path: "#{language.file_storage_prefix}CMES-v2",
20+
)
21+
end
22+
23+
def deliver(file)
24+
FileWorker.new(
25+
share: ENV["AZURE_STORAGE_SHARE_NAME"],
26+
name: file.name,
27+
path: file.path,
28+
file: file.content,
29+
).send
30+
end
31+
end
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class JsonGenerator::Base
2+
def perform
3+
json_content
4+
end
5+
end
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class JsonGenerator::ProviderRegions < JsonGenerator::Base
2+
def initialize(language, **args)
3+
@language = language
4+
@args = args
5+
end
6+
7+
private
8+
9+
attr_reader :language, :args
10+
11+
def json_content
12+
scope
13+
.map { |provider| { name: provider.name, prefix: provider.file_name_prefix, regions: provider.regions } }
14+
.to_json
15+
end
16+
17+
def scope
18+
language.providers.includes(:regions)
19+
end
20+
end
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class ProviderRegionDataBuilder
2+
def perform
3+
ProviderRegionDataJob.perform_later
4+
end
5+
end

config/recurring.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ default: &default
44
command: LanguageFilesScheduler.new.perform
55
queue: default
66
schedule: "@hourly"
7+
provider_region_data:
8+
command: ProviderRegionDataBuilder.new.perform
9+
queue: default
10+
schedule: "@daily"
711
clear_solid_queue_finished_jobs:
812
command: "SolidQueue::Job.clear_finished_in_batches(sleep_between_batches: 0.3)"
913
schedule: every hour at minute 12
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
require "rails_helper"
2+
3+
RSpec.describe ProviderRegionDataJob, type: :job do
4+
let(:language) { create(:language) }
5+
6+
describe "#perform" do
7+
it "generates provider region data" do
8+
generator = instance_double(JsonGenerator::ProviderRegions)
9+
allow(JsonGenerator::ProviderRegions).to receive(:new).with(language).and_return(generator)
10+
expect(generator).to receive(:perform)
11+
12+
described_class.perform_now(language.id)
13+
end
14+
15+
context "when language does not exist" do
16+
it "raises an error" do
17+
expect { described_class.perform_now(-1) }.to raise_error(ActiveRecord::RecordNotFound)
18+
end
19+
end
20+
end
21+
end
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
require "rails_helper"
2+
3+
RSpec.describe JsonGenerator::ProviderRegions do
4+
subject { described_class.new(language) }
5+
6+
let(:language) { create(:language) }
7+
8+
it "generates empty json" do
9+
expect(subject.perform).to eq("[]")
10+
end
11+
12+
context "when providers exist" do
13+
let!(:provider) { create(:provider) }
14+
15+
before do
16+
create(:topic, provider:, language:)
17+
end
18+
19+
it "generates json with provider data" do
20+
expect(subject.perform).to eq([
21+
{
22+
name: provider.name,
23+
prefix: provider.file_name_prefix,
24+
regions: provider.regions,
25+
},
26+
].to_json)
27+
end
28+
end
29+
30+
context "when provider does not belong to language" do
31+
let(:other_language) { create(:language) }
32+
let!(:provider) { create(:provider) }
33+
34+
before do
35+
create(:topic, provider:, language: other_language)
36+
end
37+
38+
it "generates empty json" do
39+
expect(subject.perform).to eq("[]")
40+
end
41+
end
42+
end

spec/services/text_generator/tags_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
before do
1616
tag_names = [ "cold", "flu", "cough" ]
1717
tag_names.each do |tag_name|
18-
tag = create(:tag, name: tag_name)
18+
create(:tag, name: tag_name)
1919
end
2020
topic.tag_list.add(tag_names)
2121
topic.save

0 commit comments

Comments
 (0)