asker-tool 2.1.5 → 2.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/{LICENSE → LICENSE.txt} +0 -0
- data/README.md +2 -3
- data/bin/asker +1 -0
- data/lib/asker.rb +10 -6
- data/lib/asker/ai/ai.rb +4 -0
- data/lib/asker/ai/code/base_code_ai.rb +104 -0
- data/lib/asker/{code/ai → ai/code}/code_ai_factory.rb +11 -1
- data/lib/asker/{code/ai → ai/code}/javascript_code_ai.rb +2 -5
- data/lib/asker/ai/code/problem_code_ai.rb +176 -0
- data/lib/asker/{code/ai → ai/code}/python_code_ai.rb +2 -5
- data/lib/asker/{code/ai → ai/code}/ruby_code_ai.rb +14 -7
- data/lib/asker/{code/ai → ai/code}/sql_code_ai.rb +2 -5
- data/lib/asker/ai/concept_ai.rb +1 -0
- data/lib/asker/ai/stages/stage_t.rb +76 -76
- data/lib/asker/application.rb +18 -2
- data/lib/asker/checker.rb +112 -30
- data/lib/asker/cli.rb +12 -25
- data/lib/asker/data/code.rb +73 -0
- data/lib/asker/data/column.rb +31 -21
- data/lib/asker/data/concept.rb +42 -45
- data/lib/asker/data/data_field.rb +14 -0
- data/lib/asker/data/row.rb +75 -52
- data/lib/asker/data/table.rb +89 -42
- data/lib/asker/data/world.rb +57 -33
- data/lib/asker/displayer/concept_ai_displayer.rb +56 -37
- data/lib/asker/displayer/concept_displayer.rb +7 -5
- data/lib/asker/displayer/stats_displayer.rb +4 -3
- data/lib/asker/exporter/concept_ai_gift_exporter.rb +5 -3
- data/lib/asker/exporter/concept_ai_yaml_exporter.rb +7 -3
- data/lib/asker/exporter/output_file_exporter.rb +1 -1
- data/lib/asker/files/config.ini +37 -0
- data/lib/asker/files/example-concept.haml +0 -1
- data/lib/asker/{lang/locales → files/language}/du/templates.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/en/connectors.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/en/mistakes.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/en/templates.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/es/connectors.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/es/mistakes.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/es/templates.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/fr/connectors.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/fr/mistakes.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/fr/templates.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/javascript/connectors.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/javascript/mistakes.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/javascript/templates.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/math/connectors.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/math/mistakes.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/math/templates.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/python/connectors.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/python/mistakes.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/python/templates.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/ruby/connectors.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/ruby/mistakes.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/ruby/templates.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/sql/connectors.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/sql/mistakes.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/sql/templates.yaml +0 -0
- data/lib/asker/lang/lang.rb +17 -10
- data/lib/asker/lang/lang_factory.rb +26 -5
- data/lib/asker/lang/text_actions.rb +87 -69
- data/lib/asker/loader/code_loader.rb +3 -3
- data/lib/asker/loader/content_loader.rb +9 -5
- data/lib/asker/loader/file_loader.rb +2 -11
- data/lib/asker/loader/haml_loader.rb +15 -0
- data/lib/asker/loader/image_url_loader.rb +5 -8
- data/lib/asker/loader/input_loader.rb +8 -9
- data/lib/asker/loader/project_loader.rb +10 -8
- data/lib/asker/logger.rb +3 -3
- data/lib/asker/project.rb +24 -50
- data/lib/asker/skeleton.rb +22 -13
- metadata +39 -37
- data/lib/asker/code/ai/base_code_ai.rb +0 -48
- data/lib/asker/code/code.rb +0 -53
data/lib/asker/data/row.rb
CHANGED
@@ -1,93 +1,116 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
|
2
3
|
require_relative 'column'
|
3
4
|
|
5
|
+
##
|
6
|
+
# Row objects
|
4
7
|
class Row
|
5
8
|
attr_reader :table, :index, :id
|
6
9
|
attr_reader :langs, :types, :raws, :columns
|
7
10
|
attr_reader :simple
|
8
11
|
|
9
|
-
|
12
|
+
##
|
13
|
+
# Initialize Row Object
|
14
|
+
# @param table (Table)
|
15
|
+
# @param index (Integer)
|
16
|
+
# @param xml_data (XML)
|
17
|
+
def initialize(table, index, xml_data)
|
10
18
|
@table = table
|
11
19
|
@index = index
|
12
|
-
@id = @table.id
|
20
|
+
@id = "#{@table.id}.#{@index}"
|
13
21
|
@langs = @table.langs
|
14
22
|
@types = @table.types
|
15
23
|
@raws = []
|
16
24
|
@columns = []
|
17
|
-
@simple = { :
|
25
|
+
@simple = { lang: true, type: true }
|
18
26
|
read_data_from_xml(xml_data)
|
19
27
|
end
|
20
28
|
|
21
29
|
def simple_off(option)
|
22
|
-
@simple[option]=false
|
30
|
+
@simple[option] = false
|
23
31
|
@table.simple_off(option)
|
24
32
|
end
|
25
33
|
|
26
|
-
private
|
34
|
+
private
|
27
35
|
|
28
|
-
def read_data_from_xml(
|
29
|
-
if
|
30
|
-
build_row_with_1_column(
|
36
|
+
def read_data_from_xml(xml_data)
|
37
|
+
if xml_data.elements.count.zero?
|
38
|
+
build_row_with_1_column(xml_data)
|
31
39
|
else
|
32
|
-
|
40
|
+
build_row_with_n_columns(xml_data)
|
33
41
|
end
|
34
42
|
|
35
|
-
raise "[ERROR] Row: #{
|
43
|
+
raise "[ERROR] Row: #{xml_data}" unless @columns.size == @table.fields.size
|
36
44
|
end
|
37
45
|
|
38
|
-
def build_row_with_1_column(
|
46
|
+
def build_row_with_1_column(xml_data)
|
39
47
|
# When row tag only has text, we add this text as one value array
|
40
48
|
# This is usefull for tables with only one columns
|
41
|
-
@columns = [
|
42
|
-
@raws = [
|
43
|
-
|
44
|
-
#read attributes from XML data
|
45
|
-
if pXMLdata.attributes['lang'] then
|
46
|
-
code = pXMLdata.attributes['lang'].strip
|
47
|
-
if code != @langs[0].code then
|
48
|
-
@langs = [ LangFactory.instance.get(code) ]
|
49
|
-
@simple[:lang]= false
|
50
|
-
@table.simple_off(:lang)
|
51
|
-
end
|
52
|
-
end
|
49
|
+
@columns = [Column.new(self, @raws.size, xml_data)]
|
50
|
+
@raws = [xml_data.text.strip.to_s]
|
53
51
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
@types = [ type ]
|
58
|
-
@simple[:type]= false
|
59
|
-
@table.simple_off(:type)
|
60
|
-
end
|
61
|
-
end
|
52
|
+
# read attributes from XML data
|
53
|
+
read_lang_from_xml(xml_data)
|
54
|
+
read_type_from_xml(xml_data)
|
62
55
|
end
|
63
56
|
|
64
|
-
def
|
65
|
-
|
57
|
+
def read_lang_from_xml(xml_data)
|
58
|
+
return unless xml_data.attributes['lang']
|
59
|
+
|
60
|
+
code = xml_data.attributes['lang'].strip
|
61
|
+
return if code == @langs[0].code
|
62
|
+
|
63
|
+
@langs = [LangFactory.instance.get(code)]
|
64
|
+
@simple[:lang] = false
|
65
|
+
@table.simple_off(:lang)
|
66
|
+
end
|
67
|
+
|
68
|
+
def read_type_from_xml(xml_data)
|
69
|
+
return unless xml_data.attributes['type']
|
70
|
+
|
71
|
+
type = xml_data.attributes['type'].strip
|
72
|
+
return if type == @types[0]
|
73
|
+
|
74
|
+
@types = [type]
|
75
|
+
@simple[:type] = false
|
76
|
+
@table.simple_off(:type)
|
77
|
+
end
|
78
|
+
|
79
|
+
# rubocop:disable Metrics/MethodLength
|
80
|
+
def build_row_with_n_columns(xml_data)
|
81
|
+
xml_data.elements.each do |i|
|
66
82
|
case i.name
|
67
83
|
when 'lang'
|
68
|
-
|
69
|
-
codes = @langs.map {|i| i.code }
|
70
|
-
|
71
|
-
if j.join(",")!=codes.join(",")
|
72
|
-
@langs = []
|
73
|
-
j.each { |k| @langs << LangFactory.instance.get(k.strip.to_s) }
|
74
|
-
@simple[:lang]=false
|
75
|
-
@table.simple_off(:lang)
|
76
|
-
end
|
84
|
+
read_langs_from_xml(i)
|
77
85
|
when 'type'
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
@simple[:type]=false
|
83
|
-
@table.simple_off(:type)
|
84
|
-
end
|
85
|
-
when 'col' # When row tag has several columns, we add every value to the array
|
86
|
-
#Column Objects
|
87
|
-
@columns << Column.new( self, @raws.size, i)
|
86
|
+
read_types_from_xml(i)
|
87
|
+
when 'col'
|
88
|
+
# When row has several columns, we add every value to the array
|
89
|
+
@columns << Column.new(self, @raws.size, i) # Column Objects
|
88
90
|
@raws << i.text.to_s
|
89
91
|
end
|
90
92
|
end
|
91
93
|
end
|
94
|
+
# rubocop:enable Metrics/MethodLength
|
95
|
+
|
96
|
+
def read_langs_from_xml(xml_data)
|
97
|
+
j = xml_data.text.split(',')
|
98
|
+
codes = @langs.map(&:code)
|
99
|
+
return if j.join(',') == codes.join(',')
|
100
|
+
|
101
|
+
@langs = []
|
102
|
+
j.each { |k| @langs << LangFactory.instance.get(k.strip.to_s) }
|
103
|
+
@simple[:lang] = false
|
104
|
+
@table.simple_off(:lang)
|
105
|
+
end
|
92
106
|
|
107
|
+
def read_types_from_xml(xml_data)
|
108
|
+
j = xml_data.text.split(',')
|
109
|
+
return if j.join(',') == @types.join(',')
|
110
|
+
|
111
|
+
@types = []
|
112
|
+
j.each { |k| @types << k.strip.to_s }
|
113
|
+
@simple[:type] = false
|
114
|
+
@table.simple_off(:type)
|
115
|
+
end
|
93
116
|
end
|
data/lib/asker/data/table.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative 'row'
|
4
4
|
require_relative 'template'
|
@@ -6,75 +6,96 @@ require_relative 'template'
|
|
6
6
|
# Contains data table information
|
7
7
|
class Table
|
8
8
|
attr_reader :name, :id
|
9
|
-
attr_reader :fields, :
|
10
|
-
attr_reader :
|
9
|
+
attr_reader :fields, :sequence
|
10
|
+
attr_reader :langs
|
11
|
+
attr_reader :datarows # DEV: experimental replace for Row objects
|
12
|
+
attr_reader :rows # Row objects are Datarows.raws values
|
13
|
+
# Table is simple when all their rows and col has the same lang and type value
|
11
14
|
attr_reader :simple
|
12
15
|
|
16
|
+
##
|
17
|
+
# initialize Table object
|
18
|
+
# @param concept (Concept)
|
19
|
+
# @param xml_data (XML)
|
13
20
|
def initialize(concept, xml_data)
|
14
21
|
@concept = concept
|
22
|
+
read_attributes_from_xml(xml_data)
|
15
23
|
|
16
|
-
|
17
|
-
t = xml_data.attributes['fields'].to_s.strip.split(',')
|
18
|
-
t.each { |i| i.strip! }
|
19
|
-
@fields = t || []
|
24
|
+
@simple = { lang: true, type: true }
|
20
25
|
@types = ['text'] * @fields.size
|
21
26
|
@langs = [@concept.lang] * @fields.size
|
22
27
|
|
23
|
-
@
|
24
|
-
@fields.each { |i| @name=@name + '$' + i.to_s.strip.downcase}
|
25
|
-
@id = @concept.name.to_s + '.' + @name
|
26
|
-
@simple = { lang: true, type: true }
|
27
|
-
|
28
|
-
@sequence = []
|
29
|
-
if xml_data.attributes['sequence']
|
30
|
-
t = xml_data.attributes['sequence'].to_s || ""
|
31
|
-
@sequence = t.split(",")
|
32
|
-
# puts "[DEPRECATED] sequence attr on table <#{@name}>"
|
33
|
-
end
|
34
|
-
|
35
|
-
@datarows = [] #DEV experiment replace row data with row objects
|
28
|
+
@datarows = [] # DEV experiment replace row data with row objects
|
36
29
|
read_data_from_xml(xml_data)
|
37
|
-
@rows = @datarows.map
|
30
|
+
@rows = @datarows.map(&:raws)
|
38
31
|
end
|
39
32
|
|
33
|
+
##
|
34
|
+
# Return table name
|
40
35
|
def to_s
|
41
36
|
@name.to_s
|
42
37
|
end
|
43
38
|
|
39
|
+
##
|
40
|
+
# Return true if table has a sequence defined
|
44
41
|
def sequence?
|
45
|
-
@sequence.size
|
42
|
+
@sequence.size.positive?
|
46
43
|
end
|
47
44
|
|
45
|
+
##
|
46
|
+
# Return fields type:
|
47
|
+
# * types(:all) => Return an Array with all field types
|
48
|
+
# * types(index) => Return type for fields[index]
|
49
|
+
# @param index (Integer)
|
48
50
|
def types(index = :all)
|
49
51
|
@types = (['text'] * @fields.size) if @types.nil?
|
50
52
|
return @types if index == :all
|
53
|
+
|
51
54
|
@types[index]
|
52
55
|
end
|
53
56
|
|
57
|
+
##
|
58
|
+
# Set table to simple off
|
59
|
+
# * simple_off(:lang) => Set table simple lang FALSE
|
60
|
+
# * simple_off(:type) => Set table simple type FALSE
|
61
|
+
# @param option (Symbol)
|
54
62
|
def simple_off(option)
|
55
63
|
@simple[option] = false
|
56
64
|
end
|
57
65
|
|
58
66
|
private
|
59
67
|
|
68
|
+
##
|
69
|
+
# Fill:fields, name and id from XML input
|
70
|
+
# @param xml_data (XML)
|
71
|
+
# rubocop:disable Metrics/AbcSize
|
72
|
+
def read_attributes_from_xml(xml_data)
|
73
|
+
# read attributes from XML data
|
74
|
+
t = xml_data.attributes['fields'].to_s.strip.split(',')
|
75
|
+
t.each(&:strip!)
|
76
|
+
@fields = t || []
|
77
|
+
|
78
|
+
@name = ''
|
79
|
+
@fields.each { |i| @name = "#{@name}$#{i.to_s.strip.downcase}" }
|
80
|
+
@id = "#{@concept.name}.#{@name}"
|
81
|
+
|
82
|
+
@sequence = []
|
83
|
+
return unless xml_data.attributes['sequence']
|
84
|
+
|
85
|
+
@sequence = xml_data.attributes['sequence'].to_s.split(',')
|
86
|
+
end
|
87
|
+
# rubocop:enable Metrics/AbcSize
|
88
|
+
|
89
|
+
##
|
90
|
+
# Build table data from xml input
|
91
|
+
# @param xml_data (XML)
|
92
|
+
# rubocop:disable Metrics/MethodLength
|
93
|
+
# rubocop:disable Metrics/AbcSize
|
60
94
|
def read_data_from_xml(xml_data)
|
61
95
|
xml_data.elements.each do |i|
|
62
96
|
case i.name
|
63
97
|
when 'lang'
|
64
|
-
|
65
|
-
codes = @langs.map(&:code)
|
66
|
-
|
67
|
-
if j.join(',') != codes.join(',')
|
68
|
-
simple_off(:lang)
|
69
|
-
@langs = []
|
70
|
-
j.each do |k|
|
71
|
-
if k.strip == '*' || k.strip == ''
|
72
|
-
@langs << @concept.lang
|
73
|
-
else
|
74
|
-
@langs << LangFactory.instance.get(k.strip.to_s)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
98
|
+
read_lang_from_xml(i)
|
78
99
|
when 'row'
|
79
100
|
@datarows << Row.new(self, @datarows.size, i)
|
80
101
|
when 'sequence'
|
@@ -82,15 +103,41 @@ class Table
|
|
82
103
|
when 'template'
|
83
104
|
@datarows += Template.new(self, @datarows.size, i).datarows
|
84
105
|
when 'type'
|
85
|
-
|
86
|
-
if j.join(',') != @types.join(',')
|
87
|
-
simple_off(:type)
|
88
|
-
@types = []
|
89
|
-
j.each { |k| @types << k.strip.to_s }
|
90
|
-
end
|
106
|
+
read_type_from_xml(i)
|
91
107
|
else
|
92
108
|
puts Rainbow("[ERROR] concept/table#xml_data with #{i.name}").red.bright
|
93
109
|
end
|
94
110
|
end
|
95
111
|
end
|
112
|
+
# rubocop:enable Metrics/MethodLength
|
113
|
+
# rubocop:enable Metrics/AbcSize
|
114
|
+
|
115
|
+
# rubocop:disable Metrics/MethodLength
|
116
|
+
# rubocop:disable Metrics/AbcSize
|
117
|
+
def read_lang_from_xml(xml_data)
|
118
|
+
j = xml_data.text.split(',')
|
119
|
+
codes = @langs.map(&:code)
|
120
|
+
return if j.join(',') == codes.join(',')
|
121
|
+
|
122
|
+
simple_off(:lang)
|
123
|
+
@langs = []
|
124
|
+
j.each do |k|
|
125
|
+
if ['*', ''].include? k.strip
|
126
|
+
@langs << @concept.lang
|
127
|
+
else
|
128
|
+
@langs << LangFactory.instance.get(k.strip.to_s)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
# rubocop:enable Metrics/MethodLength
|
133
|
+
# rubocop:enable Metrics/AbcSize
|
134
|
+
|
135
|
+
def read_type_from_xml(xml_data)
|
136
|
+
j = xml_data.text.split(',')
|
137
|
+
return if j.join(',') == @types.join(',')
|
138
|
+
|
139
|
+
simple_off(:type)
|
140
|
+
@types = []
|
141
|
+
j.each { |k| @types << k.strip.to_s }
|
142
|
+
end
|
96
143
|
end
|
data/lib/asker/data/world.rb
CHANGED
@@ -1,50 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
|
2
3
|
require_relative '../loader/image_url_loader'
|
3
4
|
require_relative '../project'
|
4
5
|
require_relative '../logger'
|
5
6
|
|
7
|
+
##
|
8
|
+
# World data
|
6
9
|
class World
|
7
10
|
attr_reader :concepts, :filenames, :contexts, :image_urls
|
8
11
|
|
9
|
-
|
12
|
+
##
|
13
|
+
# Initialize World object
|
14
|
+
# @param concepts (Array)
|
15
|
+
# @param show_progress (Boolean)
|
16
|
+
def initialize(concepts, show_progress = true)
|
10
17
|
find_neighbors_for_every_concept(concepts)
|
11
|
-
|
12
|
-
@
|
13
|
-
@filenames = []
|
14
|
-
@contexts = []
|
15
|
-
@image_urls = {}
|
16
|
-
|
17
|
-
concepts.each do |c|
|
18
|
-
if c.process
|
19
|
-
@concepts[c.name] = c
|
20
|
-
@filenames << c.filename
|
21
|
-
@contexts << c.context
|
22
|
-
end
|
23
|
-
end
|
24
|
-
@filenames.uniq!
|
25
|
-
@contexts.uniq!
|
26
|
-
|
27
|
-
Logger.verbose "\n[INFO] Loading data from Internet" if show_progress
|
28
|
-
threads = []
|
29
|
-
concepts.each do |c|
|
30
|
-
print('.') if show_progress
|
31
|
-
# puts "[DEBUG] #{c.name}\n"
|
32
|
-
# filter = [ c.name.clone ] + c.context.clone
|
33
|
-
filter = c.name.clone
|
34
|
-
threads << Thread.new { @image_urls[c.name] = ImageUrlLoader::load(filter) }
|
35
|
-
end
|
36
|
-
@contexts.each do |filter|
|
37
|
-
print('.') if show_progress
|
38
|
-
threads << Thread.new { @image_urls[ filter.join('.').to_s ] = ImageUrlLoader::load(filter) }
|
39
|
-
end
|
40
|
-
threads.each { |t| t.join } # wait for all threads to finish
|
41
|
-
print("\n") if show_progress
|
18
|
+
@concepts, @filenames, @contexts = get_lists_from(concepts)
|
19
|
+
@image_urls = find_url_images_from_internet(show_progress)
|
42
20
|
end
|
43
21
|
|
22
|
+
##
|
23
|
+
# For every concept... find its neighbors
|
24
|
+
# @param concepts (Array)
|
44
25
|
def find_neighbors_for_every_concept(concepts)
|
45
26
|
concepts.each do |i|
|
46
27
|
concepts.each do |j|
|
47
|
-
if
|
28
|
+
if i.id != j.id
|
48
29
|
i.try_adding_neighbor(j)
|
49
30
|
i.try_adding_references(j)
|
50
31
|
end
|
@@ -52,4 +33,47 @@ class World
|
|
52
33
|
end
|
53
34
|
end
|
54
35
|
|
36
|
+
private
|
37
|
+
|
38
|
+
# rubocop:disable Metrics/MethodLength
|
39
|
+
def get_lists_from(input)
|
40
|
+
concepts = {}
|
41
|
+
filenames = []
|
42
|
+
contexts = []
|
43
|
+
input.each do |c|
|
44
|
+
next unless c.process
|
45
|
+
|
46
|
+
concepts[c.name] = c
|
47
|
+
filenames << c.filename
|
48
|
+
contexts << c.context
|
49
|
+
end
|
50
|
+
filenames.uniq!
|
51
|
+
contexts.uniq!
|
52
|
+
[concepts, filenames, contexts]
|
53
|
+
end
|
54
|
+
# rubocop:enable Metrics/MethodLength
|
55
|
+
|
56
|
+
# rubocop:disable Metrics/MethodLength
|
57
|
+
# rubocop:disable Metrics/AbcSize
|
58
|
+
def find_url_images_from_internet(show_progress)
|
59
|
+
param = Application.instance.config['global']['internet'] || 'yes'
|
60
|
+
return {} unless param == 'yes'
|
61
|
+
|
62
|
+
Logger.verbose "\n[INFO] Loading data from Internet" if show_progress
|
63
|
+
threads = []
|
64
|
+
searchs = []
|
65
|
+
urls = {}
|
66
|
+
|
67
|
+
@concepts&.each_key { |key| searchs << key }
|
68
|
+
@contexts.each { |filter| searchs << filter.join(' ').to_s }
|
69
|
+
searchs.each do |search|
|
70
|
+
print('.') if show_progress
|
71
|
+
threads << Thread.new { urls[search] = ImageUrlLoader.load(search) }
|
72
|
+
end
|
73
|
+
threads.each(&:join) # wait for all threads to finish
|
74
|
+
print("\n") if show_progress
|
75
|
+
urls
|
76
|
+
end
|
77
|
+
# rubocop:enable Metrics/MethodLength
|
78
|
+
# rubocop:enable Metrics/AbcSize
|
55
79
|
end
|