declarative_mapper 0.0.8 → 0.0.9

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8dbe99d6a2caf950b9b51a765eb4af884c5eab7d4f303137561cb0a88379951f
4
- data.tar.gz: 05576feaf08041098823846d34b0babeb8b49cb0d735b809190c647709e47978
3
+ metadata.gz: 4ff58bf672273051481f11c20268a5035dc684faaf9d743935d76dd8517660ea
4
+ data.tar.gz: 507afff4fd2335fdcd7b2747e9ab4adf60cf4b1ef326703b7459593c69499d7f
5
5
  SHA512:
6
- metadata.gz: 253ce2b5204204f264e63832c0b57d95d3f68f18f05118f064949288111d85a1cb9fdb03673ab6862271583763e85e501de7c26bd224e456b46cfcfa01c1ffe7
7
- data.tar.gz: a5e14322d05e45afd61af0a3cef24f16c697099d074caf4dfe97ebe589bbd87e5734b824a19f300f088aa1dd5edad6b6bc886de85597edcb00a092fdc74aa17f
6
+ metadata.gz: f9917fb15e228b41435879958bacf27dee3c569028ddf3f1a3f5dfdfa5c1e93a8779fb9a255adc8b67818a938314c26221402157bf25c5573581ca479ce8b159
7
+ data.tar.gz: 8eb67c05efbe6d2a243b88b16d4dda7ddfcf7d2f926f9abd927628fd0ef870a35732328c95e20a34640f127f513604877d4ee7ddab935cb6faf6621160334302
@@ -1,42 +1,72 @@
1
- require_relative 'csv_parser'
1
+ require 'active_support/core_ext/hash/keys.rb'
2
+ require 'active_support/core_ext/string'
2
3
 
3
4
  class DeclarativeMapper
4
- attr_reader :client_path, :client_name, :project_path
5
+ def self.convert(mapper_methods, mapping_hash, csv_row)
6
+ deep_transform_values_with_path(mapping_hash) do |csv_field_name, path|
7
+ field_name = path.last
5
8
 
6
- def initialize(client_path)
7
- @client_path = client_path
8
- @client_name = client_path.split('/').last
9
- @project_path = client_path.sub("/#{@client_name}", '')
9
+ if needs_method?(csv_field_name)
10
+ parsed_signature =
11
+ parse_signature(csv_field_name, field_name)
10
12
 
11
- require_client_mapper_methods
12
- require_shared_mapper_methods
13
- end
13
+ args = argument_values(parsed_signature[:arguments], csv_row)
14
+ method_name = parsed_signature[:method_name]
14
15
 
15
- def convert(csv_row, yml_file_name)
16
- parser = CSVParser.new(yml_path(yml_file_name), client_name)
16
+ unless shared_method?(csv_field_name)
17
+ method_name = path[0..-2].push(method_name).join('_')
18
+ end
17
19
 
18
- parser.parse(csv_row)
20
+ mapper_methods.send(method_name, *args)
21
+ else
22
+ csv_row[csv_field_name]
23
+ end
24
+ end
19
25
  end
20
26
 
21
- private
22
-
23
- def yml_path(yml_file_name)
24
- "#{client_path}/#{yml_file_name}.yml"
27
+ def self.argument_values(argument_names, csv_row)
28
+ argument_names.map { |name| csv_row[name] }
25
29
  end
26
30
 
27
- def client_mapper_methods_dir_path
28
- "#{client_path}/mapper_methods"
31
+ def self.parse_signature(signature, field_name=nil)
32
+ match = signature.match(/^(.*)\((.*)\)/)
33
+
34
+ method_name = match[1]
35
+ method_name = field_name if method_name.empty?
36
+
37
+ {
38
+ arguments: match[2].gsub(/,\s+/, ',').split(','),
39
+ method_name: method_name
40
+ }
29
41
  end
30
42
 
31
- def shared_mapper_methods_dir_path
32
- "#{project_path}/shared"
43
+ def self.shared_method?(signature)
44
+ !!(signature =~ /^.+\(.*\)/)
33
45
  end
34
46
 
35
- def require_client_mapper_methods
36
- Dir["#{client_mapper_methods_dir_path}/**/*.rb"].each { |file| require file }
47
+ def self.needs_method?(signature)
48
+ !!(signature =~ /\(.*\)/)
37
49
  end
38
50
 
39
- def require_shared_mapper_methods
40
- Dir["#{shared_mapper_methods_dir_path}/**/*.rb"].each { |file| require file }
51
+ # Example of usage:
52
+ #
53
+ # my_hash = {a: 0, b: {c: 1, d: 2, e: {f: 3}}}
54
+ # values = %w(mother washed the ceiling)
55
+ #
56
+ # result = deep_transform_values_with_path(my_hash) do |value, path|
57
+ # path.join('/') + '/' + values[value]
58
+ # end
59
+ #
60
+ # {:a=>"a/mother", :b=>{:c=>"b/c/washed", :d=>"b/d/the", :e=>{:f=>"b/e/f/ceiling"}}}
61
+ #
62
+ def self.deep_transform_values_with_path(object, path=[], &block)
63
+ case object
64
+ when Hash
65
+ object.map { |k, v| [k, deep_transform_values_with_path(v, path + [k], &block)] }.to_h
66
+ when Array
67
+ object.map { |e| deep_transform_values_with_path(e, path, &block) }
68
+ else
69
+ yield(object, path) unless object.is_a?(Hash)
70
+ end
41
71
  end
42
72
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: declarative_mapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ivan Nemytchenko
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-12-22 00:00:00.000000000 Z
12
+ date: 2019-12-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -33,9 +33,7 @@ extensions: []
33
33
  extra_rdoc_files: []
34
34
  files:
35
35
  - bin/declarative_mapper_generate
36
- - lib/csv_parser.rb
37
36
  - lib/declarative_mapper.rb
38
- - lib/module_helper.rb
39
37
  - templates/mapper_methods.rb.erb
40
38
  homepage: https://gitlab.com/installero/sync_prototype
41
39
  licenses:
data/lib/csv_parser.rb DELETED
@@ -1,58 +0,0 @@
1
- require 'yaml'
2
-
3
- require 'active_support/core_ext/hash/keys.rb'
4
- require 'active_support/core_ext/string'
5
-
6
- require_relative 'module_helper'
7
-
8
- class CSVParser
9
- attr_reader :yml_path, :client_name, :table_name
10
-
11
- def initialize(yml_path, client_name)
12
- @yml_path = yml_path
13
- @client_name = client_name
14
- @table_name = File.basename(yml_path, '.yml')
15
- end
16
-
17
- def yml
18
- @yml ||= YAML.load_file(yml_path).deep_symbolize_keys
19
- end
20
-
21
- def parse(csv_row)
22
- ModuleHelper.deep_transform_values_with_path(mapping_hash) do |csv_field_name, path|
23
- field_name = path.last
24
-
25
- if ModuleHelper.needs_method?(csv_field_name)
26
- parsed_signature =
27
- ModuleHelper.parse_signature(csv_field_name, client_name, table_name, field_name)
28
-
29
- args = argument_values(parsed_signature[:arguments], csv_row)
30
-
31
- module_path = parsed_signature[:path]
32
- module_path += path[0..-2] unless ModuleHelper.shared_method?(csv_field_name)
33
-
34
- call_shared_or_client_method(
35
- module_path,
36
- parsed_signature[:method_name],
37
- *args
38
- )
39
- else
40
- csv_row[csv_field_name]
41
- end
42
- end
43
- end
44
-
45
- private
46
-
47
- def mapping_hash
48
- yml[:mapping]
49
- end
50
-
51
- def call_shared_or_client_method(path, method_name, *args)
52
- path.map(&:to_s).map(&:camelize).join('::').constantize.send(method_name, *args)
53
- end
54
-
55
- def argument_values(argument_names, csv_row)
56
- argument_names.map { |name| csv_row[name] }
57
- end
58
- end
data/lib/module_helper.rb DELETED
@@ -1,55 +0,0 @@
1
- module ModuleHelper
2
- CLIENT_METHODS_FOLDER = 'mapper_methods'
3
- # 'shared/phone/number/normalize(phonenumber)'
4
- # -> ['shared', 'phone', 'number'], 'normalize', ['phonenumber']
5
- #
6
- # '(status)', client_name: 'reliable', field_name: 'active'
7
- # -> ['reliable', 'mapper_methods'], 'active', ['status']
8
- def self.parse_signature(signature, client_name=nil, table_name=nil, field_name=nil)
9
- match = signature.match(/^(.*)\((.*)\)/)
10
-
11
- result = {arguments: match[2].gsub(/,\s+/, ',').split(',')}
12
-
13
- if shared_method?(signature)
14
- path = ['shared'] + match[1].split('/')
15
-
16
- result[:method_name] = path.pop.to_sym
17
- result[:path] = path
18
- else
19
- result[:method_name] = field_name
20
- result[:path] = [client_name, CLIENT_METHODS_FOLDER, table_name]
21
- end
22
-
23
- result
24
- end
25
-
26
- def self.shared_method?(signature)
27
- !!(signature =~ /^.+\(.*\)/)
28
- end
29
-
30
- def self.needs_method?(signature)
31
- !!(signature =~ /\(.*\)/)
32
- end
33
-
34
- # Example of usage:
35
- #
36
- # my_hash = {a: 0, b: {c: 1, d: 2, e: {f: 3}}}
37
- # values = %w(mother washed the ceiling)
38
- #
39
- # result = deep_transform_values_with_path(my_hash) do |value, path|
40
- # path.join('/') + '/' + values[value]
41
- # end
42
- #
43
- # {:a=>"a/mother", :b=>{:c=>"b/c/washed", :d=>"b/d/the", :e=>{:f=>"b/e/f/ceiling"}}}
44
- #
45
- def self.deep_transform_values_with_path(object, path=[], &block)
46
- case object
47
- when Hash
48
- object.map { |k, v| [k, deep_transform_values_with_path(v, path + [k], &block)] }.to_h
49
- when Array
50
- object.map { |e| deep_transform_values_with_path(e, path, &block) }
51
- else
52
- yield(object, path) unless object.is_a?(Hash)
53
- end
54
- end
55
- end