cure 0.1.1 → 0.4.0
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +16 -3
- data/.tool-versions +1 -0
- data/Dockerfile +1 -1
- data/Gemfile +1 -0
- data/Gemfile.lock +25 -6
- data/README.md +59 -81
- data/docs/README.md +33 -0
- data/docs/about.md +219 -0
- data/docs/builder/add.md +52 -0
- data/docs/builder/black_white_list.md +83 -0
- data/docs/builder/copy.md +48 -0
- data/docs/builder/explode.md +70 -0
- data/docs/builder/main.md +43 -0
- data/docs/builder/remove.md +46 -0
- data/docs/examples/examples.md +164 -0
- data/docs/export/main.md +37 -0
- data/docs/extract/main.md +89 -0
- data/docs/metadata/main.md +29 -0
- data/docs/query/main.md +45 -0
- data/docs/sources/main.md +36 -0
- data/docs/transform/main.md +53 -0
- data/docs/validate/main.md +42 -0
- data/exe/cure +12 -37
- data/exe/cure.old +59 -0
- data/lib/cure/builder/base_builder.rb +151 -0
- data/lib/cure/builder/candidate.rb +56 -0
- data/lib/cure/cli/command.rb +105 -0
- data/lib/cure/cli/generate_command.rb +54 -0
- data/lib/cure/cli/new_command.rb +52 -0
- data/lib/cure/cli/run_command.rb +19 -0
- data/lib/cure/cli/templates/README.md.erb +1 -0
- data/lib/cure/cli/templates/gemfile.erb +5 -0
- data/lib/cure/cli/templates/gitignore.erb +181 -0
- data/lib/cure/cli/templates/new_template.rb.erb +31 -0
- data/lib/cure/cli/templates/tool-versions.erb +1 -0
- data/lib/cure/config.rb +151 -13
- data/lib/cure/coordinator.rb +108 -0
- data/lib/cure/database.rb +191 -0
- data/lib/cure/dsl/builder.rb +26 -0
- data/lib/cure/dsl/exporters.rb +45 -0
- data/lib/cure/dsl/extraction.rb +60 -0
- data/lib/cure/dsl/metadata.rb +33 -0
- data/lib/cure/dsl/queries.rb +36 -0
- data/lib/cure/dsl/source_files.rb +36 -0
- data/lib/cure/dsl/template.rb +131 -0
- data/lib/cure/dsl/transformations.rb +95 -0
- data/lib/cure/dsl/validator.rb +22 -0
- data/lib/cure/export/base_processor.rb +194 -0
- data/lib/cure/export/manager.rb +24 -0
- data/lib/cure/extract/base_processor.rb +47 -0
- data/lib/cure/extract/csv_lookup.rb +43 -0
- data/lib/cure/extract/extractor.rb +80 -0
- data/lib/cure/extract/filter.rb +118 -0
- data/lib/cure/extract/named_range.rb +94 -0
- data/lib/cure/extract/named_range_processor.rb +128 -0
- data/lib/cure/extract/variable.rb +25 -0
- data/lib/cure/extract/variable_processor.rb +57 -0
- data/lib/cure/generator/base_generator.rb +61 -0
- data/lib/cure/generator/case_generator.rb +32 -0
- data/lib/cure/generator/character_generator.rb +41 -0
- data/lib/cure/generator/erb_generator.rb +21 -0
- data/lib/cure/generator/eval_generator.rb +34 -0
- data/lib/cure/generator/faker_generator.rb +31 -0
- data/lib/cure/generator/guid_generator.rb +21 -0
- data/lib/cure/generator/hex_generator.rb +21 -0
- data/lib/cure/generator/imports.rb +16 -0
- data/lib/cure/generator/number_generator.rb +21 -0
- data/lib/cure/generator/placeholder_generator.rb +26 -0
- data/lib/cure/generator/proc_generator.rb +21 -0
- data/lib/cure/generator/redact_generator.rb +22 -0
- data/lib/cure/generator/static_generator.rb +21 -0
- data/lib/cure/generator/variable_generator.rb +26 -0
- data/lib/cure/helpers/file_helpers.rb +50 -0
- data/lib/cure/helpers/object_helpers.rb +17 -0
- data/lib/cure/helpers/perf_helpers.rb +30 -0
- data/lib/cure/helpers/string.rb +54 -0
- data/lib/cure/launcher.rb +125 -0
- data/lib/cure/log.rb +10 -3
- data/lib/cure/planner.rb +136 -0
- data/lib/cure/strategy/append_strategy.rb +28 -0
- data/lib/cure/strategy/base_strategy.rb +98 -0
- data/lib/cure/strategy/contain_strategy.rb +51 -0
- data/lib/cure/strategy/end_with_strategy.rb +52 -0
- data/lib/cure/strategy/full_strategy.rb +28 -0
- data/lib/cure/strategy/history/history_cache.rb +82 -0
- data/lib/cure/strategy/imports.rb +12 -0
- data/lib/cure/strategy/match_strategy.rb +48 -0
- data/lib/cure/strategy/prepend_strategy.rb +28 -0
- data/lib/cure/strategy/regex_strategy.rb +55 -0
- data/lib/cure/strategy/split_strategy.rb +58 -0
- data/lib/cure/strategy/start_with_strategy.rb +53 -0
- data/lib/cure/transformation/candidate.rb +47 -36
- data/lib/cure/transformation/transform.rb +29 -71
- data/lib/cure/validator/base_rule.rb +78 -0
- data/lib/cure/validator/candidate.rb +54 -0
- data/lib/cure/validator/manager.rb +21 -0
- data/lib/cure/validators.rb +71 -0
- data/lib/cure/version.rb +1 -1
- data/lib/cure.rb +19 -6
- data/templates/dsl_example.rb +48 -0
- data/templates/empty_template.rb +31 -0
- metadata +161 -23
- data/lib/cure/csv_helpers.rb +0 -6
- data/lib/cure/export/exporter.rb +0 -49
- data/lib/cure/file_helpers.rb +0 -38
- data/lib/cure/generator/base.rb +0 -148
- data/lib/cure/main.rb +0 -63
- data/lib/cure/object_helpers.rb +0 -27
- data/lib/cure/strategy/base.rb +0 -223
- data/templates/aws_cur_template.json +0 -143
- data/templates/example_template.json +0 -38
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cure/generator/base_generator"
|
4
|
+
|
5
|
+
module Cure
|
6
|
+
module Generator
|
7
|
+
class CharacterGenerator < BaseGenerator
|
8
|
+
|
9
|
+
def initialize(options=nil)
|
10
|
+
super(options)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
# @param [Object] source_value
|
16
|
+
# @param [RowCtx] _row_ctx
|
17
|
+
def _generate(source_value, _row_ctx)
|
18
|
+
arr = build_options.map(&:to_a).flatten
|
19
|
+
(0...length(source_value&.length || 5)).map { arr[rand(arr.length)] }.join
|
20
|
+
end
|
21
|
+
|
22
|
+
def build_options
|
23
|
+
return [("a".."z"), ("A".."Z"), (0..9)] unless @options.key?(:types)
|
24
|
+
|
25
|
+
type_array = @options[:types]
|
26
|
+
|
27
|
+
arr = []
|
28
|
+
arr << ("a".."z") if type_array.include? "lowercase"
|
29
|
+
arr << ("A".."Z") if type_array.include? "uppercase"
|
30
|
+
arr << (0..9) if type_array.include? "number"
|
31
|
+
arr << ("!".."+") if type_array.include? "symbol"
|
32
|
+
arr
|
33
|
+
end
|
34
|
+
|
35
|
+
def _describe
|
36
|
+
"Will create a random list of #{@options[:types]} " \
|
37
|
+
"with as many characters as the source string."
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cure/generator/base_generator"
|
4
|
+
require "erb"
|
5
|
+
|
6
|
+
module Cure
|
7
|
+
module Generator
|
8
|
+
class ErbGenerator < BaseGenerator
|
9
|
+
private
|
10
|
+
|
11
|
+
# @param [Cure::Transformation::RowCtx] _source_value
|
12
|
+
# @param [RowCtx] row_ctx
|
13
|
+
def _generate(_source_value, row_ctx)
|
14
|
+
template = @options.fetch(:template, nil)
|
15
|
+
ERB.new(template).result_with_hash(row_ctx.row)
|
16
|
+
end
|
17
|
+
|
18
|
+
def _describe; end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cure/generator/base_generator"
|
4
|
+
|
5
|
+
module Cure
|
6
|
+
module Generator
|
7
|
+
class EvalGenerator < BaseGenerator
|
8
|
+
private
|
9
|
+
|
10
|
+
# @param [Object] _source_value
|
11
|
+
# @param [Transformation::RowCtx] _row_ctx
|
12
|
+
# This will be changed with expression evaluator
|
13
|
+
def _generate(_source_value, _row_ctx)
|
14
|
+
eval_str = extract_property("eval", nil)
|
15
|
+
result = nil
|
16
|
+
with_safe do
|
17
|
+
result = eval(eval_str) # rubocop:disable Security/Eval
|
18
|
+
end
|
19
|
+
|
20
|
+
result
|
21
|
+
rescue StandardError => e
|
22
|
+
raise "Cannot eval statement #{extract_property("eval", nil)} [#{e.message}]"
|
23
|
+
end
|
24
|
+
|
25
|
+
def with_safe(&_block)
|
26
|
+
$SAFE = 1
|
27
|
+
yield
|
28
|
+
$SAFE = 0
|
29
|
+
end
|
30
|
+
|
31
|
+
def _describe; end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cure/generator/base_generator"
|
4
|
+
require "faker"
|
5
|
+
|
6
|
+
module Cure
|
7
|
+
module Generator
|
8
|
+
class FakerGenerator < BaseGenerator
|
9
|
+
private
|
10
|
+
|
11
|
+
# @param [Object] _source_value
|
12
|
+
# @param [RowCtx] _row_ctx
|
13
|
+
def _generate(_source_value, _row_ctx)
|
14
|
+
mod_code = extract_property("module", nil)
|
15
|
+
mod = Faker.const_get(mod_code)
|
16
|
+
|
17
|
+
raise "No Faker module found for [#{mod_code}]" unless mod
|
18
|
+
|
19
|
+
meth_code = extract_property("method", nil)&.to_sym
|
20
|
+
raise "No Faker module found for [#{meth_code}]" unless mod.methods.include?(meth_code)
|
21
|
+
|
22
|
+
mod.send(meth_code)
|
23
|
+
end
|
24
|
+
|
25
|
+
def _describe
|
26
|
+
"Will create a Faker value from [#{extract_property("module", nil)}::" \
|
27
|
+
"#{extract_property("method", nil)}]"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cure/generator/base_generator"
|
4
|
+
|
5
|
+
module Cure
|
6
|
+
module Generator
|
7
|
+
class GuidGenerator < BaseGenerator
|
8
|
+
private
|
9
|
+
|
10
|
+
# @param [Object] _source_value
|
11
|
+
# @param [RowCtx] _row_ctx
|
12
|
+
def _generate(_source_value, _row_ctx)
|
13
|
+
SecureRandom.uuid.to_s.slice(0, @options.fetch(:length, 36))
|
14
|
+
end
|
15
|
+
|
16
|
+
def _describe
|
17
|
+
"Will create a random GUID."
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cure/generator/base_generator"
|
4
|
+
|
5
|
+
module Cure
|
6
|
+
module Generator
|
7
|
+
class HexGenerator < BaseGenerator
|
8
|
+
private
|
9
|
+
|
10
|
+
# @param [Object] _source_value
|
11
|
+
# @param [RowCtx] _row_ctx
|
12
|
+
def _generate(_source_value, _row_ctx)
|
13
|
+
1.upto(length(rand(0..9))).map { rand(0..15).to_s(16) }.join("")
|
14
|
+
end
|
15
|
+
|
16
|
+
def _describe
|
17
|
+
"Will create a random list of hex values matching the length of the source string."
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cure/generator/base_generator"
|
4
|
+
require "cure/generator/hex_generator"
|
5
|
+
require "cure/generator/case_generator"
|
6
|
+
require "cure/generator/character_generator"
|
7
|
+
require "cure/generator/faker_generator"
|
8
|
+
require "cure/generator/guid_generator"
|
9
|
+
require "cure/generator/number_generator"
|
10
|
+
require "cure/generator/placeholder_generator"
|
11
|
+
require "cure/generator/redact_generator"
|
12
|
+
require "cure/generator/variable_generator"
|
13
|
+
require "cure/generator/eval_generator"
|
14
|
+
require "cure/generator/erb_generator"
|
15
|
+
require "cure/generator/proc_generator"
|
16
|
+
require "cure/generator/static_generator"
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cure/generator/base_generator"
|
4
|
+
|
5
|
+
module Cure
|
6
|
+
module Generator
|
7
|
+
class NumberGenerator < BaseGenerator
|
8
|
+
private
|
9
|
+
|
10
|
+
# @param [Object] _source_value
|
11
|
+
# @param [RowCtx] _row_ctx
|
12
|
+
def _generate(_source_value, _row_ctx)
|
13
|
+
1.upto(length(rand(0..9))).map { rand(1..9) }.join("").to_i
|
14
|
+
end
|
15
|
+
|
16
|
+
def _describe
|
17
|
+
"Will create a random list of numbers matching the length of the source string."
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cure/generator/base_generator"
|
4
|
+
require "cure/config"
|
5
|
+
|
6
|
+
module Cure
|
7
|
+
module Generator
|
8
|
+
class PlaceholderGenerator < BaseGenerator
|
9
|
+
include Cure::Configuration
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
# @param [Object] _source_value
|
14
|
+
# @param [RowCtx] _row_ctx
|
15
|
+
def _generate(_source_value, _row_ctx)
|
16
|
+
value = config.placeholders[property_name]
|
17
|
+
value || raise("Missing placeholder value. Available candidates: [#{config.placeholders.keys.join(", ")}]")
|
18
|
+
end
|
19
|
+
|
20
|
+
def _describe
|
21
|
+
"Will look up placeholders using '#{property_name}'. " \
|
22
|
+
"[Set as '#{config.placeholders[property_name]}']"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cure/generator/base_generator"
|
4
|
+
require "erb"
|
5
|
+
|
6
|
+
module Cure
|
7
|
+
module Generator
|
8
|
+
class ProcGenerator < BaseGenerator
|
9
|
+
private
|
10
|
+
|
11
|
+
# @param [Cure::Transformation::RowCtx] source_value
|
12
|
+
# @param [RowCtx] row_ctx
|
13
|
+
def _generate(source_value, row_ctx)
|
14
|
+
proc = @options.fetch(:execute, nil)
|
15
|
+
proc.call(source_value, row_ctx)
|
16
|
+
end
|
17
|
+
|
18
|
+
def _describe; end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cure/generator/base_generator"
|
4
|
+
|
5
|
+
module Cure
|
6
|
+
module Generator
|
7
|
+
class RedactGenerator < BaseGenerator
|
8
|
+
private
|
9
|
+
|
10
|
+
# @param [object] source_value
|
11
|
+
# @param [RowCtx] _row_ctx
|
12
|
+
def _generate(source_value, _row_ctx)
|
13
|
+
1.upto(length(source_value&.length || 5)).map { @options.fetch(:character, "x") }.join("")
|
14
|
+
end
|
15
|
+
|
16
|
+
def _describe
|
17
|
+
"Will replace the length of the source string with X."
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cure/generator/base_generator"
|
4
|
+
|
5
|
+
module Cure
|
6
|
+
module Generator
|
7
|
+
class StaticGenerator < BaseGenerator
|
8
|
+
private
|
9
|
+
|
10
|
+
# @param [Object] _source_value
|
11
|
+
# @param [RowCtx] _row_ctx
|
12
|
+
def _generate(_source_value, _row_ctx)
|
13
|
+
@options.fetch(:value, nil)
|
14
|
+
end
|
15
|
+
|
16
|
+
def _describe
|
17
|
+
"Will return the defined value [#{@options.fetch(:value, nil)}]"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cure/generator/base_generator"
|
4
|
+
require "cure/config"
|
5
|
+
require "cure/database"
|
6
|
+
|
7
|
+
module Cure
|
8
|
+
module Generator
|
9
|
+
class VariableGenerator < BaseGenerator
|
10
|
+
include Database
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
# @param [object] _source_value
|
15
|
+
# @param [RowCtx] _row_ctx
|
16
|
+
def _generate(_source_value, _row_ctx)
|
17
|
+
value = database_service.find_variable(property_name)
|
18
|
+
value || raise("Missing placeholder value [#{property_name}]. Please check you are defining it correctly.")
|
19
|
+
end
|
20
|
+
|
21
|
+
def _describe
|
22
|
+
"Will look up the variables defined using '#{property_name}'."
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "fileutils"
|
4
|
+
require "pathname"
|
5
|
+
|
6
|
+
module Cure
|
7
|
+
module Helpers
|
8
|
+
module FileHelpers
|
9
|
+
def with_file(path, extension, &block)
|
10
|
+
dir = File.dirname(path)
|
11
|
+
|
12
|
+
FileUtils.mkdir_p(dir) unless File.directory?(dir)
|
13
|
+
|
14
|
+
path = "#{path}.#{extension}"
|
15
|
+
File.open(path, "w", &block)
|
16
|
+
end
|
17
|
+
|
18
|
+
def clean_dir(path)
|
19
|
+
dir = File.file?(path) ? File.dirname(path) : path
|
20
|
+
|
21
|
+
FileUtils.remove_dir(dir) if File.directory?(dir)
|
22
|
+
end
|
23
|
+
|
24
|
+
def read_file(file_location)
|
25
|
+
result = file_location.start_with?("/") ? file_location : Pathname.new(file_location)
|
26
|
+
# result = file_location.start_with?("/") ? file_location : File.join(File.dirname(__FILE__), file_location)
|
27
|
+
|
28
|
+
raise "No file found at [#{file_location}]" unless File.exist? result.to_s
|
29
|
+
|
30
|
+
File.read(result)
|
31
|
+
end
|
32
|
+
|
33
|
+
def open_file(file_location)
|
34
|
+
result = file_location.start_with?("/") ? file_location : Pathname.new(file_location)
|
35
|
+
|
36
|
+
raise "No file found at [#{file_location}]" unless File.exist? result.to_s
|
37
|
+
|
38
|
+
File.open(result)
|
39
|
+
end
|
40
|
+
|
41
|
+
def with_temp_dir(temp_dir, &_block)
|
42
|
+
return unless block_given?
|
43
|
+
|
44
|
+
clean_dir(temp_dir)
|
45
|
+
yield
|
46
|
+
clean_dir(temp_dir)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cure"
|
4
|
+
require "json"
|
5
|
+
|
6
|
+
module Cure
|
7
|
+
module Helpers
|
8
|
+
module ObjectHelpers
|
9
|
+
def class_exists?(klass_name)
|
10
|
+
klass = Module.const_get(klass_name)
|
11
|
+
klass.is_a?(Class)
|
12
|
+
rescue NameError
|
13
|
+
false
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "fileutils"
|
4
|
+
require "benchmark"
|
5
|
+
|
6
|
+
module Cure
|
7
|
+
module Helpers
|
8
|
+
# This module uses some code sourced from here:
|
9
|
+
# https://torrocus.com/blog/different-ways-to-processing-large-csv-file-in-ruby/
|
10
|
+
module PerfHelpers
|
11
|
+
def print_memory_usage(process_name="default")
|
12
|
+
cmd = "ps -o rss= -p #{Process.pid}"
|
13
|
+
before_mem = `#{cmd}`.to_i
|
14
|
+
# before_gc = GC.stat(:total_allocated_objects)
|
15
|
+
|
16
|
+
yield
|
17
|
+
after_mem = `#{cmd}`.to_i
|
18
|
+
# after_gc = GC.stat(:total_allocated_objects)
|
19
|
+
|
20
|
+
log_info "Total Memory Usage [#{process_name}]: #{((after_mem - before_mem) / 1024.0).round(2)} MB"
|
21
|
+
# log_info "Total GC Objects Freed [#{process_name}]: #{after_gc - before_gc}"
|
22
|
+
end
|
23
|
+
|
24
|
+
def print_time_spent(process_name="default", &block)
|
25
|
+
time = Benchmark.realtime(&block)
|
26
|
+
log_info "Total Processing Time [#{process_name}]: #{time.round(2)}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# This code is by Ivan Black - available here:
|
4
|
+
# https://stackoverflow.com/questions/1489183/how-can-i-use-ruby-to-colorize-the-text-output-to-a-terminal
|
5
|
+
|
6
|
+
class String
|
7
|
+
def black
|
8
|
+
"\e[30m#{self}\e[0m"
|
9
|
+
end
|
10
|
+
|
11
|
+
def red
|
12
|
+
"\e[31m#{self}\e[0m"
|
13
|
+
end
|
14
|
+
|
15
|
+
def green
|
16
|
+
"\e[32m#{self}\e[0m"
|
17
|
+
end
|
18
|
+
|
19
|
+
def brown
|
20
|
+
"\e[33m#{self}\e[0m"
|
21
|
+
end
|
22
|
+
|
23
|
+
def blue
|
24
|
+
"\e[34m#{self}\e[0m"
|
25
|
+
end
|
26
|
+
|
27
|
+
def magenta
|
28
|
+
"\e[35m#{self}\e[0m"
|
29
|
+
end
|
30
|
+
|
31
|
+
def cyan
|
32
|
+
"\e[36m#{self}\e[0m"
|
33
|
+
end
|
34
|
+
|
35
|
+
def gray
|
36
|
+
"\e[37m#{self}\e[0m"
|
37
|
+
end
|
38
|
+
|
39
|
+
def bold
|
40
|
+
"\e[1m#{self}\e[22m"
|
41
|
+
end
|
42
|
+
|
43
|
+
def italic
|
44
|
+
"\e[3m#{self}\e[23m"
|
45
|
+
end
|
46
|
+
|
47
|
+
def underline
|
48
|
+
"\e[4m#{self}\e[24m"
|
49
|
+
end
|
50
|
+
|
51
|
+
def blink
|
52
|
+
"\e[5m#{self}\e[25m"
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cure/transformation/candidate"
|
4
|
+
require "cure/transformation/transform"
|
5
|
+
require "cure/coordinator"
|
6
|
+
require "cure/database"
|
7
|
+
require "cure/planner"
|
8
|
+
require "cure/config"
|
9
|
+
|
10
|
+
require "json"
|
11
|
+
|
12
|
+
module Cure
|
13
|
+
class Launcher
|
14
|
+
include Database
|
15
|
+
include Configuration
|
16
|
+
include Helpers::FileHelpers
|
17
|
+
|
18
|
+
# @return [Cure::Coordinator]
|
19
|
+
attr_accessor :coordinator
|
20
|
+
|
21
|
+
def initialize(coordinator: Coordinator.new, planner: Planner.new)
|
22
|
+
@coordinator = coordinator
|
23
|
+
@planner = planner
|
24
|
+
@validated = false
|
25
|
+
@csv_files = []
|
26
|
+
end
|
27
|
+
|
28
|
+
# This will only support single file CSV processing, and is deprecated now
|
29
|
+
#
|
30
|
+
# @param [Symbol] type
|
31
|
+
# @param [Object] obj
|
32
|
+
# @param [TrueClass,FalseClass] print_query_plan
|
33
|
+
# @return [void]
|
34
|
+
# @deprecated
|
35
|
+
def process(type, obj, print_query_plan: true)
|
36
|
+
@csv_files << Cure::Configuration::CsvFileProxy.load_file(type, obj, "_default")
|
37
|
+
run_export(print_query_plan: print_query_plan)
|
38
|
+
end
|
39
|
+
|
40
|
+
def run_export(print_query_plan: true)
|
41
|
+
setup
|
42
|
+
|
43
|
+
raise "Not initialized" unless @validated
|
44
|
+
|
45
|
+
query_plan if print_query_plan
|
46
|
+
@coordinator.process
|
47
|
+
end
|
48
|
+
|
49
|
+
# -- Builder opts start
|
50
|
+
|
51
|
+
# @param [Symbol] type
|
52
|
+
# @param [Object] obj
|
53
|
+
# @return [Cure::Main]
|
54
|
+
def with_csv_file(type, obj, ref_name: nil)
|
55
|
+
if ref_name.nil?
|
56
|
+
ref_name = @csv_files.length.zero? ? "_default" : "_default_#{@csv_files.length}"
|
57
|
+
end
|
58
|
+
|
59
|
+
@csv_files << Cure::Configuration::CsvFileProxy.load_file(type, obj, ref_name)
|
60
|
+
self
|
61
|
+
end
|
62
|
+
|
63
|
+
# @return [Cure::Main]
|
64
|
+
def with_config(&block)
|
65
|
+
raise "No block given to config" unless block
|
66
|
+
|
67
|
+
dsl = Dsl::DslHandler.init(&block)
|
68
|
+
@template = dsl.generate
|
69
|
+
|
70
|
+
load_csv_from_config
|
71
|
+
|
72
|
+
self
|
73
|
+
end
|
74
|
+
|
75
|
+
# @return [Cure::Main]
|
76
|
+
def with_config_file(file_location)
|
77
|
+
contents = read_file(file_location.to_s)
|
78
|
+
|
79
|
+
dsl = Dsl::DslHandler.init_from_content(contents, "cure")
|
80
|
+
@template = dsl.generate
|
81
|
+
|
82
|
+
load_csv_from_config
|
83
|
+
|
84
|
+
self
|
85
|
+
end
|
86
|
+
|
87
|
+
# -- Builder end
|
88
|
+
|
89
|
+
# @return [Cure::Main]
|
90
|
+
def setup
|
91
|
+
raise "CSV File(s) are required" if @csv_files.empty?
|
92
|
+
raise "Template is required" unless @template
|
93
|
+
|
94
|
+
config = create_config(@csv_files, @template)
|
95
|
+
register_config(config)
|
96
|
+
|
97
|
+
init_database
|
98
|
+
init_history
|
99
|
+
|
100
|
+
@validated = true
|
101
|
+
self
|
102
|
+
end
|
103
|
+
|
104
|
+
# @return [void]
|
105
|
+
def query_plan
|
106
|
+
raise "Not initialized" unless @validated
|
107
|
+
|
108
|
+
@planner.process
|
109
|
+
end
|
110
|
+
|
111
|
+
private
|
112
|
+
|
113
|
+
def load_csv_from_config
|
114
|
+
return unless @template.source_files.has_candidates?
|
115
|
+
|
116
|
+
@template.source_files.candidates.each do |source|
|
117
|
+
with_csv_file(source.type, source.value, ref_name: source.ref_name)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def init_history
|
122
|
+
Cure::History::HistoryCache.instance.reset
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
data/lib/cure/log.rb
CHANGED
@@ -4,6 +4,13 @@ require "cure"
|
|
4
4
|
|
5
5
|
module Cure
|
6
6
|
module Log
|
7
|
+
# @param [String] _message
|
8
|
+
def log_trace(_message)
|
9
|
+
# Ruby default logger doesnt have trace, so my version
|
10
|
+
# is to just uncomment it when you need it for now.
|
11
|
+
# Cure.logger.trace(message)
|
12
|
+
end
|
13
|
+
|
7
14
|
# @param [String] message
|
8
15
|
def log_debug(message)
|
9
16
|
Cure.logger.debug(message)
|
@@ -20,10 +27,10 @@ module Cure
|
|
20
27
|
end
|
21
28
|
|
22
29
|
# @param [String] message
|
23
|
-
# @param [Exception/Nil]
|
24
|
-
def log_error(message,
|
30
|
+
# @param [Exception/Nil] exception
|
31
|
+
def log_error(message, exception=nil)
|
25
32
|
Cure.logger.error(message)
|
26
|
-
Cure.logger.error(
|
33
|
+
Cure.logger.error(exception.backtrace.join("\n")) unless exception.nil?
|
27
34
|
end
|
28
35
|
end
|
29
36
|
end
|