asker-tool 2.1.5 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -17
  3. data/bin/asker +2 -1
  4. data/lib/asker/ai/ai.rb +10 -3
  5. data/lib/asker/ai/ai_calculate.rb +20 -6
  6. data/lib/asker/ai/code/base_code_ai.rb +104 -0
  7. data/lib/asker/{code/ai → ai/code}/code_ai_factory.rb +11 -1
  8. data/lib/asker/{code/ai → ai/code}/javascript_code_ai.rb +2 -5
  9. data/lib/asker/ai/code/problem_code_ai.rb +176 -0
  10. data/lib/asker/{code/ai → ai/code}/python_code_ai.rb +2 -5
  11. data/lib/asker/{code/ai → ai/code}/ruby_code_ai.rb +14 -7
  12. data/lib/asker/{code/ai → ai/code}/sql_code_ai.rb +2 -5
  13. data/lib/asker/ai/concept_ai.rb +13 -3
  14. data/lib/asker/ai/question.rb +28 -6
  15. data/lib/asker/ai/stages/base_stage.rb +45 -6
  16. data/lib/asker/ai/stages/stage_b.rb +100 -50
  17. data/lib/asker/ai/stages/stage_d.rb +75 -90
  18. data/lib/asker/ai/stages/stage_f.rb +64 -36
  19. data/lib/asker/ai/stages/stage_i.rb +79 -92
  20. data/lib/asker/ai/stages/stage_s.rb +41 -36
  21. data/lib/asker/ai/stages/stage_t.rb +149 -108
  22. data/lib/asker/application.rb +19 -11
  23. data/lib/asker/cli.rb +31 -44
  24. data/lib/asker/data/code.rb +62 -0
  25. data/lib/asker/data/column.rb +31 -21
  26. data/lib/asker/data/concept.rb +109 -65
  27. data/lib/asker/data/data_field.rb +14 -0
  28. data/lib/asker/data/project_data.rb +63 -0
  29. data/lib/asker/data/row.rb +75 -52
  30. data/lib/asker/data/table.rb +91 -42
  31. data/lib/asker/data/template.rb +3 -1
  32. data/lib/asker/data/world.rb +51 -35
  33. data/lib/asker/displayer/code_displayer.rb +7 -0
  34. data/lib/asker/displayer/concept_ai_displayer.erb +10 -0
  35. data/lib/asker/displayer/concept_ai_displayer.rb +74 -53
  36. data/lib/asker/displayer/concept_displayer.rb +16 -9
  37. data/lib/asker/displayer/stats_displayer.rb +12 -3
  38. data/lib/asker/exporter/concept_ai_gift_exporter.rb +19 -11
  39. data/lib/asker/exporter/concept_ai_moodle_exporter.rb +44 -0
  40. data/lib/asker/exporter/concept_ai_yaml_exporter.rb +13 -6
  41. data/lib/asker/exporter/concept_doc_exporter.rb +14 -1
  42. data/lib/asker/exporter/data_gift_exporter.rb +29 -0
  43. data/lib/asker/exporter/output_file_exporter.rb +9 -6
  44. data/lib/asker/files/{config.ini → asker.ini} +48 -1
  45. data/lib/asker/files/example-concept.haml +0 -1
  46. data/lib/asker/files/language/du/connectors.yaml +81 -0
  47. data/lib/asker/{lang/locales/fr → files/language/du}/mistakes.yaml +1 -1
  48. data/lib/asker/files/language/du/templates.yaml +29 -0
  49. data/lib/asker/{lang/locales → files/language}/en/connectors.yaml +0 -0
  50. data/lib/asker/{lang/locales → files/language}/en/mistakes.yaml +0 -0
  51. data/lib/asker/files/language/en/templates.yaml +29 -0
  52. data/lib/asker/{lang/locales → files/language}/es/connectors.yaml +0 -0
  53. data/lib/asker/files/language/es/mistakes.yaml +84 -0
  54. data/lib/asker/files/language/es/templates.yaml +29 -0
  55. data/lib/asker/files/language/fr/connectors.yaml +76 -0
  56. data/lib/asker/{lang/locales/es → files/language/fr}/mistakes.yaml +0 -0
  57. data/lib/asker/files/language/fr/templates.yaml +29 -0
  58. data/lib/asker/{lang/locales → files/language}/javascript/connectors.yaml +0 -0
  59. data/lib/asker/{lang/locales → files/language}/javascript/mistakes.yaml +0 -0
  60. data/lib/asker/{lang/locales → files/language}/javascript/templates.yaml +0 -0
  61. data/lib/asker/{lang/locales → files/language}/math/connectors.yaml +0 -0
  62. data/lib/asker/{lang/locales → files/language}/math/mistakes.yaml +0 -0
  63. data/lib/asker/{lang/locales → files/language}/math/templates.yaml +0 -0
  64. data/lib/asker/{lang/locales → files/language}/python/connectors.yaml +0 -0
  65. data/lib/asker/{lang/locales → files/language}/python/mistakes.yaml +0 -0
  66. data/lib/asker/{lang/locales → files/language}/python/templates.yaml +0 -0
  67. data/lib/asker/{lang/locales → files/language}/ruby/connectors.yaml +0 -0
  68. data/lib/asker/{lang/locales → files/language}/ruby/mistakes.yaml +0 -0
  69. data/lib/asker/{lang/locales → files/language}/ruby/templates.yaml +0 -0
  70. data/lib/asker/{lang/locales → files/language}/sql/connectors.yaml +0 -0
  71. data/lib/asker/{lang/locales → files/language}/sql/mistakes.yaml +0 -0
  72. data/lib/asker/{lang/locales → files/language}/sql/templates.yaml +0 -0
  73. data/lib/asker/formatter/concept_doc_formatter.rb +0 -4
  74. data/lib/asker/formatter/concept_string_formatter.rb +7 -4
  75. data/lib/asker/formatter/moodle/matching.erb +38 -0
  76. data/lib/asker/formatter/moodle/multichoice.erb +49 -0
  77. data/lib/asker/formatter/moodle/shortanswer.erb +30 -0
  78. data/lib/asker/formatter/moodle/truefalse.erb +47 -0
  79. data/lib/asker/formatter/question_gift_formatter.rb +30 -20
  80. data/lib/asker/formatter/question_moodle_formatter.rb +27 -0
  81. data/lib/asker/{checker.rb → input_checker.rb} +126 -49
  82. data/lib/asker/lang/lang.rb +17 -10
  83. data/lib/asker/lang/lang_factory.rb +32 -5
  84. data/lib/asker/lang/text_actions.rb +87 -69
  85. data/lib/asker/loader/code_loader.rb +4 -4
  86. data/lib/asker/loader/content_loader.rb +21 -19
  87. data/lib/asker/loader/directory_loader.rb +1 -8
  88. data/lib/asker/loader/embedded_file.rb +42 -0
  89. data/lib/asker/loader/file_loader.rb +3 -14
  90. data/lib/asker/loader/haml_loader.rb +15 -0
  91. data/lib/asker/loader/image_url_loader.rb +8 -12
  92. data/lib/asker/loader/input_loader.rb +13 -15
  93. data/lib/asker/loader/project_loader.rb +25 -15
  94. data/lib/asker/logger.rb +36 -9
  95. data/lib/asker/skeleton.rb +23 -13
  96. data/lib/asker.rb +76 -42
  97. metadata +53 -54
  98. data/lib/asker/code/ai/base_code_ai.rb +0 -48
  99. data/lib/asker/code/code.rb +0 -53
  100. data/lib/asker/lang/locales/du/templates.yaml +0 -50
  101. data/lib/asker/lang/locales/en/templates.yaml +0 -29
  102. data/lib/asker/lang/locales/es/templates.yaml +0 -29
  103. data/lib/asker/lang/locales/fr/connectors.yaml +0 -92
  104. data/lib/asker/lang/locales/fr/templates.yaml +0 -29
  105. data/lib/asker/project.rb +0 -172
@@ -3,7 +3,7 @@
3
3
  require 'rainbow'
4
4
  require 'rexml/document'
5
5
  require_relative '../logger'
6
- require_relative '../code/code'
6
+ require_relative '../data/code'
7
7
 
8
8
  # Read XML info about Code input data
9
9
  module CodeLoader
@@ -24,7 +24,7 @@ module CodeLoader
24
24
  # @param xmldata (XML Object)
25
25
  # @param filename (String) File name that contains data
26
26
  # @return Code object
27
- def self.read_codedata_from_xml(xmldata, filename)
27
+ private_class_method def self.read_codedata_from_xml(xmldata, filename)
28
28
  data = { path: '?', type: '?', features: [] }
29
29
  xmldata.elements.each do |i|
30
30
  data[:path] = i.text if i.name == 'path'
@@ -38,14 +38,14 @@ module CodeLoader
38
38
  # Read features data from XML input
39
39
  # @param xmldata (XML object)
40
40
  # @return Array with features (Strings)
41
- def self.read_features(xmldata, filename)
41
+ private_class_method def self.read_features(xmldata, filename)
42
42
  features = []
43
43
  xmldata.elements.each do |i|
44
44
  if i.name == 'row'
45
45
  features << i.text
46
46
  else
47
47
  msg = Rainbow("[ERROR] features/#{i.name} from #{filename}").color(:red)
48
- Logger.verbose msg
48
+ Logger.verboseln msg
49
49
  end
50
50
  end
51
51
  features
@@ -4,8 +4,7 @@ require 'rainbow'
4
4
  require 'rexml/document'
5
5
  require_relative '../data/concept'
6
6
  require_relative 'code_loader'
7
- require_relative '../logger'
8
- require_relative '../project'
7
+ require_relative '../data/project_data'
9
8
 
10
9
  # Define methods that load data from XML contents
11
10
  module ContentLoader
@@ -13,6 +12,8 @@ module ContentLoader
13
12
  # Load XML content into Asker data objects
14
13
  # @param filepath (String) File path
15
14
  # @param content (String) XML plane text content
15
+ # rubocop:disable Metrics/MethodLength
16
+ # rubocop:disable Metrics/AbcSize
16
17
  def self.load(filepath, content)
17
18
  concepts = []
18
19
  codes = []
@@ -31,21 +32,23 @@ module ContentLoader
31
32
  when 'code'
32
33
  codes << read_code(xmldata, filepath)
33
34
  else
34
- Logger.verboseln Rainbow("[ERROR] Unkown tag <#{xmldata.name}>").red
35
+ puts Rainbow("[ERROR] Unkown tag <#{xmldata.name}>").red
35
36
  end
36
37
  end
37
38
 
38
39
  { concepts: concepts, codes: codes }
39
40
  end
41
+ # rubocop:enable Metrics/MethodLength
42
+ # rubocop:enable Metrics/AbcSize
40
43
 
41
44
  ##
42
45
  # Read lang attr from input XML data
43
46
  # @param xmldata (XML Object)
44
- def self.read_lang_attribute(xmldata)
47
+ private_class_method def self.read_lang_attribute(xmldata)
45
48
  begin
46
49
  lang = xmldata.root.attributes['lang']
47
50
  rescue StandardError
48
- lang = Project.instance.lang
51
+ lang = ProjectData.instance.lang
49
52
  end
50
53
  lang
51
54
  end
@@ -53,7 +56,7 @@ module ContentLoader
53
56
  ##
54
57
  # Read context attr from input XML data
55
58
  # @param xmldata (XML Object)
56
- def self.read_context_attribute(xmldata)
59
+ private_class_method def self.read_context_attribute(xmldata)
57
60
  begin
58
61
  context = xmldata.root.attributes['context']
59
62
  rescue StandardError
@@ -68,12 +71,10 @@ module ContentLoader
68
71
  # @param filepath (String)
69
72
  # @param lang
70
73
  # @param context
71
- def self.read_concept(xmldata, filepath, lang, context)
72
- project = Project.instance
74
+ private_class_method def self.read_concept(xmldata, filepath, lang, context)
75
+ project = ProjectData.instance
73
76
  c = Concept.new(xmldata, filepath, lang, context)
74
- if [ File.basename(filepath), :default ].include? project.process_file
75
- c.process = true
76
- end
77
+ c.process = true if [File.basename(filepath), :default].include? project.get(:process_file)
77
78
  c
78
79
  end
79
80
 
@@ -81,18 +82,19 @@ module ContentLoader
81
82
  # Read code from input XML data
82
83
  # @param xmldata (XML Object)
83
84
  # @param filepath (String)
84
- def self.read_code(xmldata, filepath)
85
- project = Project.instance
85
+ private_class_method def self.read_code(xmldata, filepath)
86
+ project = ProjectData.instance
86
87
  c = CodeLoader.load(xmldata, filepath)
87
- if [ File.basename(filepath), :default ].include? project.process_file
88
- c.process = true
89
- end
88
+ c.process = true if [File.basename(filepath), :default].include? project.get(:process_file)
90
89
  c
91
90
  end
92
91
 
93
- def self.raise_error_with(filepath, content)
94
- msg = Rainbow("[ERROR] ContentLoader: Format error in #{filepath}").red.bright
95
- Logger.verbose msg
92
+ ##
93
+ # Raise error and save content into error.file
94
+ # @param filepath (String)
95
+ # @param content (String)
96
+ private_class_method def self.raise_error_with(filepath, content)
97
+ puts Rainbow("[ERROR] ContentLoader: Format error in #{filepath}").red.bright
96
98
  f = File.open('output/error.xml', 'w')
97
99
  f.write(content)
98
100
  f.close
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'file_loader'
4
- require_relative '../logger'
5
4
 
6
5
  # Load input data from one directory
7
6
  module DirectoryLoader
@@ -13,7 +12,6 @@ module DirectoryLoader
13
12
  files = (Dir.new(dirname).entries - ['.', '..']).sort
14
13
  # Accept only HAML or XML files
15
14
  accepted = files.select { |f| %w[.xml .haml].include? File.extname(f) }
16
- Logger.verbose " * Input directory = #{Rainbow(dirname).bright}"
17
15
  DirectoryLoader.load_files(accepted, dirname)
18
16
  end
19
17
 
@@ -24,7 +22,7 @@ module DirectoryLoader
24
22
  return if Dir.exist? dirname
25
23
 
26
24
  msg = Rainbow("[ERROR] #{dirname} directory dosn't exist!").color(:red)
27
- Logger.verboseln msg
25
+ puts msg
28
26
  raise msg
29
27
  end
30
28
 
@@ -48,11 +46,6 @@ module DirectoryLoader
48
46
  # @param filepath (String) Path to input file
49
47
  # @param last (Boolean) True if it is the last filename
50
48
  def self.load_file(filepath, last = false)
51
- if last
52
- Logger.verbose " └── Input file = #{Rainbow(filepath).bright}"
53
- else
54
- Logger.verbose " ├── Input file = #{Rainbow(filepath).bright}"
55
- end
56
49
  FileLoader.load(filepath)
57
50
  end
58
51
  end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'base64'
4
+
5
+ # Methods to load embedded files defined into asker input data file
6
+ # Example:
7
+ # * def line with :type = :image_url used to link external file as https://..."
8
+ # * def line with :type = :file used to load local file as image.png or file.txt"
9
+ module EmbeddedFile
10
+ ##
11
+ # @param value (String)
12
+ # @param localdir (String) Input file base folder
13
+ # @return Hash
14
+ # rubocop:disable Metrics/MethodLength
15
+ # rubocop:disable Metrics/AbcSize
16
+ def self.load(value, localdir)
17
+ # When filename is an URL
18
+ if value.start_with?('https://') || value.start_with?('http://')
19
+ return { text: "<img src=\"#{value}\" alt=\"image\" width=\"400\" height=\"300\">", file: :none }
20
+ end
21
+
22
+ filepath = File.join(localdir, value)
23
+ unless File.exist?(filepath)
24
+ # When filename is unkown!
25
+ Logger.verbose Rainbow("[ERROR] Unknown file! #{filepath}").red.bright
26
+ exit 1
27
+ end
28
+ # When filename is PNG, JPG o JPEG
29
+ if ['.png', '.jpg', '.jpeg'].include? File.extname(filepath)
30
+ # converts image into base64 strings
31
+ text = '<img src="@@PLUGINFILE@@/' + File.basename(filepath) \
32
+ + '" alt="imagen" class="img-responsive atto_image_button_text-bottom">'
33
+ data = '<file name="' + File.basename(filepath) + '" path="/" encoding="base64">' \
34
+ + Base64.strict_encode64(File.open(filepath, 'rb').read) + '</file>'
35
+ return { text: text, file: data }
36
+ end
37
+ # Suposse that filename is TXT file
38
+ return { text: "<pre>#{File.read(filepath)}</pre>", file: :none } if File.exist?(filepath)
39
+ end
40
+ # rubocop:enable Metrics/MethodLength
41
+ # rubocop:enable Metrics/AbcSize
42
+ end
@@ -1,8 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'haml'
4
3
  require_relative 'content_loader'
5
- require_relative '../logger'
4
+ require_relative 'haml_loader'
6
5
 
7
6
  # Methods that load a filename and return list of concepts
8
7
  module FileLoader
@@ -11,23 +10,13 @@ module FileLoader
11
10
  # @param filename (String) File name to be load
12
11
  def self.load(filename)
13
12
  if File.extname(filename).casecmp('.haml').zero?
14
- file_content = load_haml filename
13
+ file_content = HamlLoader.load filename
15
14
  elsif File.extname(filename).casecmp('.xml').zero?
16
15
  file_content = File.read(filename)
17
16
  else
18
- msg = "[ERROR] FileLoader: Format error #{filename}"
19
- Logger.verbose msg
17
+ puts "[ERROR] FileLoader: Format error #{filename}"
20
18
  raise msg
21
19
  end
22
20
  ContentLoader.load(filename, file_content)
23
21
  end
24
-
25
- ##
26
- # Load HAML file name
27
- # @param filename (String) HAML file name
28
- def self.load_haml(filename)
29
- template = File.read(filename)
30
- haml_engine = Haml::Engine.new(template)
31
- haml_engine.render
32
- end
33
22
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'haml'
4
+
5
+ # HAML file loader
6
+ module HamlLoader
7
+ ##
8
+ # Load HAML file name
9
+ # @param filename (String) HAML file name
10
+ def self.load(filename)
11
+ template = File.read(filename)
12
+ haml_engine = Haml::Engine.new(template)
13
+ haml_engine.render
14
+ end
15
+ end
@@ -1,8 +1,6 @@
1
1
 
2
2
  require 'net/http'
3
3
  require 'uri'
4
- require_relative '../project'
5
- require_relative '../application'
6
4
 
7
5
  # Search URL images on Internet
8
6
  # Methods:
@@ -12,9 +10,6 @@ require_relative '../application'
12
10
  module ImageUrlLoader
13
11
  # Search "input" images on Google and return URL
14
12
  def self.load(input = [])
15
- param = Application.instance.config['global']['internet'] || 'yes'
16
- return [] unless param == 'yes'
17
-
18
13
  filters = []
19
14
  if input.class == String
20
15
  filters += sanitize_string(input.clone)
@@ -39,20 +34,21 @@ module ImageUrlLoader
39
34
  end
40
35
  end
41
36
  rescue
42
- Project.instance.verboseln '[ERROR] ImageUrlLoader'
43
- Project.instance.verboseln " => #{search_url}"
44
- Project.instance.verboseln ' => Check Internet connections'
45
- Project.instance.verboseln ' => Ensure URL is well formed'
37
+ puts '[ERROR] ImageUrlLoader'
38
+ puts " => #{search_url}"
39
+ puts ' => Check Internet connections'
40
+ puts ' => Ensure URL is well formed'
46
41
  end
47
42
  image_urls
48
43
  end
49
44
 
50
45
  def self.sanitize_string(input)
46
+ text = input.dup
51
47
  r = [ ['á', 'a'], ['é', 'e'], ['í', 'i'], ['ó', 'o'], ['ú', 'u'], ['ñ', 'n'], ['Á', 'A'], ['É', 'E'], ['Í', 'I'], ['Ó', 'O'], ['Ú', 'U'], ['Ñ', 'N']]
52
- r.each { |item| input.gsub!(item[0], item[1]) }
48
+ r.each { |item| text.gsub!(item[0], item[1]) }
53
49
  r = ['-', '_', ',', '"']
54
- r.each { |item| input.gsub!(item, ' ') }
55
- input.split(' ')
50
+ r.each { |item| text.gsub!(item, ' ') }
51
+ text.split(' ')
56
52
  end
57
53
 
58
54
  def self.sanitize_array(input)
@@ -3,39 +3,37 @@
3
3
  require_relative 'directory_loader'
4
4
  require_relative '../ai/concept_ai'
5
5
  require_relative '../data/world'
6
- require_relative '../logger'
7
6
 
8
7
  # Load DATA defined into our Project
9
8
  module InputLoader
10
9
  ##
11
10
  # Load input data from every input directory
12
11
  # @param inputdirs (Array)
13
- def self.load(inputdirs)
14
- data = { concepts: [], codes: [], world: nil, concepts_ai: [] }
15
- Logger.verbose "\n[INFO] Loading input data"
16
-
17
- # inputdirs = project.inputdirs.split(',')
12
+ def self.load(inputdirs, internet = true)
13
+ data = { concepts: [], codes: [], world: nil,
14
+ concepts_ai: [], codes_ai: [] }
15
+ #Logger.verboseln "\n[INFO] Loading input data"
18
16
  inputdirs.each do |dirname|
19
17
  temp = DirectoryLoader.load(dirname)
20
18
  data[:concepts] += temp[:concepts]
21
19
  data[:codes] += temp[:codes]
22
20
  end
23
- create_questions(data)
21
+ create_questions(data, internet)
24
22
  end
25
23
 
26
- private_class_method def self.create_questions(data)
24
+ private_class_method def self.create_questions(data, internet)
27
25
  # Create World data
28
26
  # * Calculate concept neighbours
29
27
  # * TO-DO: Calculate code neighbours
30
- data[:world] = World.new(data[:concepts])
31
- # Create ConceptAI data and make concept questions
28
+ data[:world] = World.new(data[:concepts], internet)
29
+ # Create ConceptAI data (ConceptAI = concept + questions)
32
30
  data[:concepts].each do |concept|
33
- concept_ai = ConceptAI.new(concept, data[:world])
34
- concept_ai.make_questions
35
- data[:concepts_ai] << concept_ai
31
+ data[:concepts_ai] << ConceptAI.new(concept, data[:world])
32
+ end
33
+ # Create CodeAI data (CodeAI = code + questions)
34
+ data[:codes].each do |code|
35
+ data[:codes_ai] << CodeAIFactory.get(code)
36
36
  end
37
- # Make code questions
38
- data[:codes].each(&:make_questions)
39
37
  data
40
38
  end
41
39
  end
@@ -1,8 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'yaml'
4
- require_relative '../project'
5
- require_relative '../logger'
4
+ require_relative '../data/project_data'
6
5
 
7
6
  # Load params into Project class using arg input
8
7
  # * load
@@ -14,22 +13,26 @@ module ProjectLoader
14
13
  ##
15
14
  # Load project from args
16
15
  # @param args (String or Hash)
16
+ # rubocop:disable Metrics/MethodLength
17
17
  def self.load(args)
18
- project = Project.instance
18
+ project = ProjectData.instance
19
19
 
20
20
  if args.class == Hash
21
21
  project.param.merge!(args)
22
+ project.open
22
23
  return project
23
24
  elsif args.class == String
24
25
  ProjectLoader.load_from_string(args)
26
+ project.open
25
27
  return project
26
28
  end
27
29
 
28
30
  msg = '[ERROR] ProjectLoader:'
29
31
  msg += "Configuration params format is <#{pArgs.class}>!"
30
- Logger.verbose Rainbow(msg).red
32
+ puts Rainbow(msg).red
31
33
  raise msg
32
34
  end
35
+ # rubocop:enable Metrics/MethodLength
33
36
 
34
37
  ##
35
38
  # Load project from filepath. Options:
@@ -37,12 +40,14 @@ module ProjectLoader
37
40
  # * XML filepath
38
41
  # * YAML filepath
39
42
  # @param filepath (String)
43
+ # rubocop:disable Metrics/MethodLength
44
+ # rubocop:disable Metrics/AbcSize
40
45
  def self.load_from_string(filepath)
41
- project = Project.instance
46
+ project = ProjectData.instance
42
47
  unless File.exist?(filepath)
43
- msg = Rainbow("[WARN] ProjectLoader.load: #{arg} dosn't exists!").yellow.bright
44
- project.verbose msg
45
- raise msg
48
+ msg = Rainbow("[ERROR] #{filepath} not found!").red.bright
49
+ puts msg
50
+ exit 1
46
51
  end
47
52
 
48
53
  if File.extname(filepath) == '.haml' || File.extname(filepath) == '.xml'
@@ -51,22 +56,27 @@ module ProjectLoader
51
56
  return project
52
57
  elsif File.extname(filepath) == '.yaml'
53
58
  return load_from_yaml(filepath)
54
- else
55
- load_error(filepath)
56
59
  end
60
+ error_loading(filepath)
57
61
  end
62
+ # rubocop:enable Metrics/MethodLength
63
+ # rubocop:enable Metrics/AbcSize
58
64
 
65
+ # rubocop:disable Security/YAMLLoad
59
66
  def self.load_from_yaml(arg)
60
- project = Project.instance
67
+ project = ProjectData.instance
61
68
  project.param.merge!(YAML.load(File.open(arg)))
62
69
  project.set(:configfilename, arg)
63
70
  project.set(:projectdir, File.dirname(arg))
64
71
  project
65
72
  end
73
+ # rubocop:enable Security/YAMLLoad
66
74
 
67
- def self.load_error(arg)
68
- msg = Rainbow("[ERROR] ProjectLoader.Input unkown: #{arg}").red.bright
69
- Project.instance.verbose msg
70
- raise msg
75
+ ##
76
+ # Error found and exit application.
77
+ def self.error_loading(arg)
78
+ msg = Rainbow("[ERROR] Loading... #{arg}").red.bright
79
+ puts msg
80
+ exit 1
71
81
  end
72
82
  end
data/lib/asker/logger.rb CHANGED
@@ -1,20 +1,47 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'project'
3
+ require 'singleton'
4
+ require_relative 'application'
4
5
 
5
6
  # Display and log project messages
6
- module Logger
7
- ##
8
- # Display and log text
7
+ class Logger
8
+ include Singleton
9
+ @attr_verbose = 'yes'
10
+
11
+ def set_verbose(value)
12
+ @attr_verbose = value
13
+ end
14
+
9
15
  def self.verbose(msg)
10
- project = Project.instance
11
- puts msg if project.get(:verbose)
12
- project.get(:logfile)&.write("#{msg}\n")
16
+ print msg if @attr_verbose == 'yes'
17
+ @logfile&.write(msg)
13
18
  end
14
19
 
15
- ##
16
- # Display and log text line
17
20
  def self.verboseln(msg)
18
21
  verbose(msg + "\n")
19
22
  end
23
+
24
+ def log(msg)
25
+ verbose(msg)
26
+ end
27
+
28
+ def logln(msg)
29
+ verboseln(msg)
30
+ end
31
+ ##
32
+ # Create or reset logfile
33
+ def self.create(logpath, logname)
34
+ @logfile = File.open(logpath, 'w')
35
+ @logfile.write('=' * 50 + "\n")
36
+ @logfile.write("Created by : #{Application::NAME}")
37
+ @logfile.write(" (version #{Application::VERSION})\n")
38
+ @logfile.write("File : #{logname}\n")
39
+ @logfile.write("Time : #{Time.new}\n")
40
+ @logfile.write("Author : David Vargas Ruiz\n")
41
+ @logfile.write('=' * 50 + "\n\n")
42
+ end
43
+
44
+ def self.close
45
+ @logfile.close
46
+ end
20
47
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'fileutils'
4
4
  require 'rainbow'
5
+ require_relative 'application'
5
6
 
6
7
  # Skeleton: create skeleton for asker input files
7
8
  # * create
@@ -12,27 +13,36 @@ require 'rainbow'
12
13
  module Skeleton
13
14
  ##
14
15
  # Create skeleton for asker input files
15
- # @param dirpath (String) Folder path to save example files
16
- def self.create(dirpath)
17
- puts "\n[INFO] Creating #{Rainbow(dirpath).bright} project skeleton"
16
+ # @param inputpath (String)
17
+ # rubocop:disable Metrics/MethodLength
18
+ def self.create_input(inputpath)
19
+ puts "\n[INFO] Creating example input #{Rainbow(inputpath).bright}"
20
+ if File.extname(inputpath) == '.haml'
21
+ dirpath = File.dirname(inputpath)
22
+ filename = File.basename(inputpath)
23
+ else
24
+ dirpath = inputpath
25
+ filename = 'example-concept.haml'
26
+ end
18
27
  create_dir dirpath
19
- copy_files_into(dirpath)
28
+ source = File.join(File.dirname(__FILE__), 'files/example-concept.haml')
29
+ copyfile(source, File.join(dirpath, filename))
20
30
  end
31
+ # rubocop:enable Metrics/MethodLength
21
32
 
22
33
  ##
23
- # Copy lib/asker/files into Folder
24
- # @param dirpath (String)
25
- def self.copy_files_into(dirpath)
26
- # Directory and files: example-concept.haml
27
- source = File.join(File.dirname(__FILE__), 'files/example-concept.haml')
28
- target = File.join(dirpath, 'example-concept.haml')
29
- copyfile(source, target)
34
+ # Create default configuration files
35
+ def self.create_configuration
36
+ puts "\n[INFO] Creating configuration files"
37
+ src = File.join(File.dirname(__FILE__), 'files', Application::CONFIGFILE)
38
+ dst = File.join(Application::CONFIGFILE)
39
+ copyfile(src, dst)
30
40
  end
31
41
 
32
42
  ##
33
43
  # Create folder
34
44
  # @param dirpath (String)
35
- def self.create_dir(dirpath)
45
+ private_class_method def self.create_dir(dirpath)
36
46
  if Dir.exist? dirpath
37
47
  puts "* Exists dir! => #{Rainbow(dirpath).yellow}"
38
48
  else
@@ -49,7 +59,7 @@ module Skeleton
49
59
  # Copy target file to dest
50
60
  # @param target (String)
51
61
  # @param dest (String)
52
- def self.copyfile(target, dest)
62
+ private_class_method def self.copyfile(target, dest)
53
63
  if File.exist? dest
54
64
  puts "* Exists file! => #{Rainbow(dest).yellow}"
55
65
  return true