asker-tool 2.1.5 → 2.2.1

Sign up to get free protection for your applications and to get access to all the features.
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