data_maps 0.2.0 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0db231594073294046bbb5835c640cf80e9104a2
4
- data.tar.gz: 061514db19e260ce0d6920d08c00bfbaaa3b676a
3
+ metadata.gz: a79a64393fa8251abdd2a54b6ca2faafacccfa3d
4
+ data.tar.gz: 3235818191fc647bc508a57e8e2f7628ded1e82c
5
5
  SHA512:
6
- metadata.gz: d164afd5020057a201912e236cda59b9262d02df41872bed00dfbc56c932aabcdbbcd7c517f777eddc63f9d73ac63f3cb0e07634c8077c09c31445103674d45d
7
- data.tar.gz: cf4b01f7a57cc76b881ef7ae7ff9fd69f279d35b7b813f02ab8b3196a7e1219b7f41492131921448ee1f3dd489b8cb9f76686518824ac87540f357e2beeadfed
6
+ metadata.gz: f0e63152f7f12963838b41ed9a1361fae1a3ce6012a04ad1635dff4780a378e685a3ca6e48963da84a3a9b4fad842a7452a39d811f7bd791a4c1021273ec4a53
7
+ data.tar.gz: c88340e27fd74d55637de2d0357dd618e9c46cadafeb47906765f9c156d0b67d62c1e8486383e524d81b70c92cb80418bfec6a250b2ff78edee528cee8b6faf3
data/Gemfile CHANGED
@@ -2,5 +2,3 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in data_maps.gemspec
4
4
  gemspec
5
-
6
- gem 'codeclimate-test-reporter', group: :test, require: nil
data/Gemfile.lock CHANGED
@@ -2,7 +2,7 @@ PATH
2
2
  remote: .
3
3
  specs:
4
4
  data_maps (0.2.0)
5
- activesupport (~> 3.2.21)
5
+ activesupport (~> 3.2, >= 3.2.21)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
@@ -10,7 +10,7 @@ GEM
10
10
  activesupport (3.2.21)
11
11
  i18n (~> 0.6, >= 0.6.4)
12
12
  multi_json (~> 1.0)
13
- codeclimate-test-reporter (0.4.6)
13
+ codeclimate-test-reporter (0.4.7)
14
14
  simplecov (>= 0.7.1, < 1.0.0)
15
15
  diff-lcs (1.2.5)
16
16
  docile (1.1.5)
@@ -21,28 +21,28 @@ GEM
21
21
  rspec-core (~> 3.2.0)
22
22
  rspec-expectations (~> 3.2.0)
23
23
  rspec-mocks (~> 3.2.0)
24
- rspec-core (3.2.0)
24
+ rspec-core (3.2.1)
25
25
  rspec-support (~> 3.2.0)
26
26
  rspec-expectations (3.2.0)
27
27
  diff-lcs (>= 1.2.0, < 2.0)
28
28
  rspec-support (~> 3.2.0)
29
- rspec-mocks (3.2.0)
29
+ rspec-mocks (3.2.1)
30
30
  diff-lcs (>= 1.2.0, < 2.0)
31
31
  rspec-support (~> 3.2.0)
32
- rspec-support (3.2.1)
33
- simplecov (0.9.1)
32
+ rspec-support (3.2.2)
33
+ simplecov (0.9.2)
34
34
  docile (~> 1.1.0)
35
35
  multi_json (~> 1.0)
36
- simplecov-html (~> 0.8.0)
37
- simplecov-html (0.8.0)
36
+ simplecov-html (~> 0.9.0)
37
+ simplecov-html (0.9.0)
38
38
 
39
39
  PLATFORMS
40
40
  ruby
41
41
 
42
42
  DEPENDENCIES
43
- bundler (~> 1.7)
44
- codeclimate-test-reporter
43
+ bundler (~> 1.8)
44
+ codeclimate-test-reporter (~> 0.4.7)
45
45
  data_maps!
46
46
  rake (~> 10.0)
47
47
  rspec (~> 3.2)
48
- simplecov (~> 0.9.1)
48
+ simplecov (~> 0.9.2)
data/README.md CHANGED
@@ -4,9 +4,12 @@ DataMaps
4
4
  [![Code Climate](https://codeclimate.com/github/dino115/data_maps/badges/gpa.svg)](https://codeclimate.com/github/dino115/data_maps)
5
5
  [![Test Coverage](https://codeclimate.com/github/dino115/data_maps/badges/coverage.svg)](https://codeclimate.com/github/dino115/data_maps)
6
6
  [![Gem Version](https://badge.fury.io/rb/data_maps.svg)](http://badge.fury.io/rb/data_maps)
7
+ [![Dependency Status](https://gemnasium.com/dino115/data_maps.svg)](https://gemnasium.com/dino115/data_maps)
7
8
 
8
9
  Create mappings to convert structured data into another format!
9
- This is useful for dynamic generated or serializable (e.g. to save) mappings.
10
+ This is useful when you need a dynamic generated or serializable mapping.
11
+
12
+ **Attention: The API can change before the gem version reach 1.0!**
10
13
 
11
14
  ## Installation
12
15
 
@@ -215,9 +218,9 @@ The only exception is when using `then: { filter: true }`, then the execution br
215
218
  Apply the configured converter. See converter section for more information.
216
219
 
217
220
  ```ruby
218
- convert: {
219
- numeric: 'Integer'
220
- }
221
+ convert: [
222
+ { apply: :numeric, option: 'Integer' }
223
+ ]
221
224
  ```
222
225
  - **Then: filter**
223
226
  When this is set to true then the whole field will filtered.
@@ -249,12 +252,9 @@ Apply one or many converters to the input data. Converters applied procedural.
249
252
  ```ruby
250
253
  'field' => {
251
254
  from: 'source',
252
- convert: {
253
- map: {
254
- 1: 'A',
255
- 2: 'B'
256
- }
257
- }
255
+ convert: [
256
+ { apply: :map, option: { 1: 'A', 2: 'B' } }
257
+ ]
258
258
  }
259
259
  ```
260
260
 
@@ -266,7 +266,8 @@ Apply one or many converters to the input data. Converters applied procedural.
266
266
  For arrays and hashes it returns nil if the value is not in the mapping. For flat values it returns the original data.
267
267
 
268
268
  ```ruby
269
- map: {
269
+ apply: :map,
270
+ option: {
270
271
  from: to
271
272
  }
272
273
  ```
@@ -275,30 +276,32 @@ Apply one or many converters to the input data. Converters applied procedural.
275
276
  Can raise an error if the value is not convertable.
276
277
 
277
278
  ```ruby
278
- numeric: 'Integer'
279
- numeric: 'Float'
280
- numeric: 2
279
+ apply: :numeric,
280
+ option 'Integer'
281
+ # option: 'Float'
282
+ # option: 2
281
283
  ```
282
284
  - **Converter: String**
283
285
  Cast explicit to string. Doesn't work with collections.
284
286
  Can raise error if the value is not convertable.
285
287
 
286
288
  ```ruby
287
- string: true
289
+ apply: :string
288
290
  ```
289
291
  - **Converter: Boolean**
290
292
  Cast explicit to bool (by double negotiation). Doesn't work with collections.
291
293
  Can return unexpected values, e.g. a double negotiated empty array is true! `!![] #=> true`
292
294
 
293
295
  ```ruby
294
- bool: true
296
+ apply: :bool
295
297
  ```
296
298
  - **Converter: keys**
297
299
  This maps the hash keys when the input data is a hash or when you select multiple *from* fields. Only works with hashes.
298
300
  Return the original data when the data isn't a hash.
299
301
 
300
302
  ```ruby
301
- keys: {
303
+ apply: :key,
304
+ option: {
302
305
  'address1' => 'street'
303
306
  }
304
307
  ```
@@ -306,21 +309,24 @@ Apply one or many converters to the input data. Converters applied procedural.
306
309
  This prefixes the data with a given value. Call `to_s` on data and always returns a string.
307
310
 
308
311
  ```ruby
309
- prefix: '$'
312
+ apply: :prefix,
313
+ option: '$'
310
314
  ```
311
315
  - **Converter: Postfix**
312
316
  This postfixes the data with a given value. Call `to_s` on data and always returns a string.
313
317
 
314
318
  ```ruby
315
- postfix: '€'
319
+ apply: :postfix,
320
+ option: '€'
316
321
  ```
317
322
  - **Converter: ruby**
318
323
  Apply any method on the current data object.
319
324
 
320
325
  ```ruby
321
- ruby: :upcase
322
- ruby: [:slice, 5]
323
- ruby: [:join, ', ']
326
+ apply: :ruby,
327
+ option: :upcase
328
+ # option: [:slice, 5]
329
+ # option: [:join, ', ']
324
330
  ```
325
331
  - **Converter: custom**
326
332
  Define your own *converter* by defining them in the `DataMaps::Converter` module.
@@ -336,7 +342,8 @@ Apply one or many converters to the input data. Converters applied procedural.
336
342
  ```
337
343
 
338
344
  ```ruby
339
- to_person_object: { as: :importer } # passed value are available with option
345
+ apply: to_person_object,
346
+ option: { as: :importer } # passed value are available via option
340
347
  ```
341
348
 
342
349
  Have fun using the `DataMaps` gem :)
data/data_maps.gemspec CHANGED
@@ -18,10 +18,13 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ['lib']
20
20
 
21
- spec.add_dependency 'activesupport', '~> 3.2.21'
21
+ spec.required_ruby_version = '>= 1.9.2'
22
22
 
23
- spec.add_development_dependency 'bundler', '~> 1.7'
23
+ spec.add_runtime_dependency 'activesupport', '~> 3.2', '>= 3.2.21'
24
+
25
+ spec.add_development_dependency 'bundler', '~> 1.8'
24
26
  spec.add_development_dependency 'rake', '~> 10.0'
25
27
  spec.add_development_dependency 'rspec', '~> 3.2'
26
- spec.add_development_dependency 'simplecov', '~> 0.9.1'
28
+ spec.add_development_dependency 'simplecov', '~> 0.9.2'
29
+ spec.add_development_dependency 'codeclimate-test-reporter', '~> 0.4.7'
27
30
  end
@@ -0,0 +1,14 @@
1
+ module DataMaps
2
+ module Concerns
3
+ module Configurable
4
+ # Concern to allow configuration via instance evaluation
5
+ #
6
+ # @param [Block] block
7
+ # @return self
8
+ def configure(&block)
9
+ instance_eval &block if block_given?
10
+ self
11
+ end
12
+ end
13
+ end
14
+ end
@@ -19,7 +19,7 @@ module DataMaps
19
19
  #
20
20
  # @param [Hash] mapping
21
21
  # @return [Array] of factorized classes
22
- def create_from_map(mapping)
22
+ def factory_from_map(mapping)
23
23
  raise ArgumentError.new("#{self.name} mapping has to be an hash") unless mapping.is_a?(Hash)
24
24
 
25
25
  mapping.map do |name, option|
@@ -10,15 +10,14 @@ module DataMaps
10
10
  # Helper method to create conditions from a mapping
11
11
  #
12
12
  # @param [Array] mapping
13
- #
14
13
  # @return [Array] of Condition
15
14
  def self.create_from_map(mapping)
16
15
  raise ArgumentError.new('Conditions mapping has to be an array') unless mapping.is_a?(Array)
17
16
 
18
17
  mapping.map do |condition|
19
18
  self.new(
20
- DataMaps::When.create_from_map(condition[:when]),
21
- DataMaps::Then.create_from_map(condition[:then])
19
+ DataMaps::When.factory_from_map(condition[:when]),
20
+ DataMaps::Then.factory_from_map(condition[:then])
22
21
  )
23
22
  end
24
23
  end
@@ -2,6 +2,19 @@ module DataMaps
2
2
  module Converter
3
3
  extend DataMaps::Concerns::Factory
4
4
 
5
+ # Helper method to create converts from a mapping_hash
6
+ #
7
+ # @param [Array] mapping
8
+ # @return [Array] of factorized classes
9
+ def self.create_from_map(mapping)
10
+ raise ArgumentError.new('Converter mapping has to be an array') unless mapping.is_a?(Array)
11
+
12
+ mapping.map do |converter|
13
+ raise ArgumentError.new('Converter must be specified with the apply key') unless converter.key?(:apply)
14
+ self.factory(converter[:apply], converter[:option])
15
+ end
16
+ end
17
+
5
18
  # Base class for converter
6
19
  #
7
20
  # @since 0.0.1
@@ -3,7 +3,7 @@ module DataMaps
3
3
  # Converts numeric values
4
4
  #
5
5
  # @since 0.0.1
6
- class Keys < Base
6
+ class Key < Base
7
7
  # The after initialize callback
8
8
  def after_initialize
9
9
  @option = option.with_indifferent_access
@@ -0,0 +1,21 @@
1
+ module DataMaps
2
+ module Dsl
3
+ module Mapping
4
+ # Structure to describe a field mapping
5
+ class ConditionsDsl < Struct.new(:whens, :thens)
6
+ include DataMaps::Concerns::Configurable
7
+
8
+ def initialize
9
+ self.whens = {}
10
+ self.thens = {}
11
+ end
12
+
13
+ # Serialize DSL to an Hash
14
+ def to_h
15
+ data = super
16
+ data.stringify_keys
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,32 @@
1
+ module DataMaps
2
+ module Dsl
3
+ module Mapping
4
+ # Structure to describe a field mapping
5
+ class FieldMappingDsl < Struct.new(:from, :conditions, :converter)
6
+ include DataMaps::Concerns::Configurable
7
+
8
+ def initialize(options = {})
9
+ self.from = options[:from]
10
+ self.conditions = []
11
+ self.converter = []
12
+ end
13
+
14
+ def add_condition(&block)
15
+ dsl = DataMaps::Dsl::Mapping::ConditionsDsl.new
16
+ dsl.configure(&block) if block_given?
17
+ self.conditions << dsl.to_h
18
+ end
19
+
20
+ def add_converter(converter, options = nil)
21
+ self.converter << { apply: converter, option: options }
22
+ end
23
+
24
+ # Serialize DSL to an Hash
25
+ def to_h
26
+ data = super
27
+ data.stringify_keys
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,16 @@
1
+ module DataMaps
2
+ module Dsl
3
+ module Mapping
4
+ # DSL method to describe a field
5
+ #
6
+ # @param [String|Symbol] destination
7
+ # @param [Hash] options
8
+ # @param [Block] block
9
+ def field(destination, options = {}, &block)
10
+ dsl = FieldMappingDsl.new(options)
11
+ dsl.configure(&block) if block_given?
12
+ @mapping_hash[destination.to_s] = dsl.to_h
13
+ end
14
+ end
15
+ end
16
+ end
@@ -5,6 +5,9 @@ module DataMaps
5
5
  # attr_reader [Hash] mapping the compiled mapping
6
6
  # attr_reader [Hash] mapping_hash the mapping description
7
7
  class Mapping
8
+ include DataMaps::Concerns::Configurable
9
+ include DataMaps::Dsl::Mapping
10
+
8
11
  attr_reader :mapping, :mapping_hash
9
12
 
10
13
  # Initializer for the Mapping class
@@ -12,14 +12,13 @@ module DataMaps
12
12
  # Create statement from a mapping hash
13
13
  #
14
14
  # @param [Hash] mapping
15
- #
16
15
  # @return [Statement]
17
16
  def self.create_from_map(mapping)
18
17
  self.new(
19
18
  mapping[:from],
20
19
  mapping[:to],
21
20
  DataMaps::Condition.create_from_map(mapping[:conditions] || []),
22
- DataMaps::Converter.create_from_map(mapping[:converter] || {})
21
+ DataMaps::Converter.create_from_map(mapping[:converter] || [])
23
22
  )
24
23
  end
25
24
 
@@ -45,11 +44,7 @@ module DataMaps
45
44
  # @param [mixed] data
46
45
  # @return [Array] key and value of the result
47
46
  def execute(data)
48
- data = case from
49
- when Array then from.reduce(data) { |val, f| val.fetch(f) if val.is_a?(Hash) }
50
- when Hash then Hash[from.map { |k,v| [v.is_a?(TrueClass) ? k.to_s : v.to_s, data[k.to_s]] }]
51
- else data[from.to_s]
52
- end
47
+ data = _fetch_from_data(data)
53
48
 
54
49
  data = execute_conditions(data)
55
50
  data = execute_converter(data)
@@ -80,5 +75,35 @@ module DataMaps
80
75
 
81
76
  data
82
77
  end
78
+
79
+ private
80
+
81
+ # Helper method to fetch the estimated value from data
82
+ #
83
+ # @param [mixed] data
84
+ # @return [mixed] estimated value
85
+ def _fetch_from_data(data)
86
+ case from
87
+ when Array then _fetch_value_from_nested(data)
88
+ when Hash then _fetch_values_from_hash(data)
89
+ else data[from.to_s]
90
+ end
91
+ end
92
+
93
+ # Helper method to fetch the value from a nested data structure
94
+ #
95
+ # @param [mixed] data
96
+ # @return [mixed] estimated value
97
+ def _fetch_value_from_nested(data)
98
+ from.reduce(data) { |val, f| val.fetch(f) if val.is_a?(Hash) }
99
+ end
100
+
101
+ # Helper method to fetch values from a hash
102
+ #
103
+ # @param [mixed] data
104
+ # @return [mixed] estimated value
105
+ def _fetch_values_from_hash(data)
106
+ Hash[from.map { |k,v| [v.is_a?(TrueClass) ? k.to_s : v.to_s, data[k.to_s]] }]
107
+ end
83
108
  end
84
109
  end
@@ -7,7 +7,7 @@ module DataMaps
7
7
  attr_reader :converter
8
8
 
9
9
  def after_initialize
10
- @converter = DataMaps::Converter.create_from_map(@option)
10
+ @converter = DataMaps::Converter.create_from_map(option)
11
11
  end
12
12
 
13
13
  # The execute method which returns the converted data
@@ -1,3 +1,3 @@
1
1
  module DataMaps
2
- VERSION = '0.2.0'
2
+ VERSION = '0.3.0'
3
3
  end
@@ -8,6 +8,7 @@ module DataMaps
8
8
  #
9
9
  # @param [mixed] data
10
10
  def execute(data)
11
+ return option unless data.present?
11
12
  data.empty? == option
12
13
  end
13
14
  end
data/lib/data_maps.rb CHANGED
@@ -4,6 +4,8 @@ require 'active_support/all'
4
4
  # Require all project files
5
5
  Dir.glob(File.join(__dir__, 'data_maps', 'executable.rb'), &method(:require))
6
6
  Dir.glob(File.join(__dir__, 'data_maps', '{concerns,errors}', '*.rb'), &method(:require))
7
+ Dir.glob(File.join(__dir__, 'data_maps', 'dsl', '{mapping}', '*.rb'), &method(:require))
8
+ Dir.glob(File.join(__dir__, 'data_maps', 'dsl', '*.rb'), &method(:require))
7
9
  Dir.glob(File.join(__dir__, 'data_maps', '{converter,then,when}', 'base.rb'), &method(:require))
8
10
  Dir.glob(File.join(__dir__, 'data_maps', '{converter,then,when}', '*.rb'), &method(:require))
9
11
  Dir.glob(File.join(__dir__, 'data_maps', '*.rb'), &method(:require))
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe DataMaps::Concerns::Configurable do
4
+ class Dummy
5
+ include DataMaps::Concerns::Configurable
6
+ end
7
+
8
+ subject{ Dummy.new }
9
+
10
+ describe '#configure' do
11
+ it 'evaluates the given block in instance context' do
12
+ expect do |block|
13
+ subject.configure(&block)
14
+ end.to yield_with_args subject
15
+ end
16
+
17
+ it 'returns self' do
18
+ expect(subject.configure).to eq subject
19
+ end
20
+ end
21
+ end
@@ -39,16 +39,16 @@ describe DataMaps::Concerns::Factory do
39
39
  end
40
40
  end
41
41
 
42
- describe '#create_from_map' do
42
+ describe '#factory_from_map' do
43
43
  it 'raises an error if mapping isn\'t a hash' do
44
- expect{ MyModule.create_from_map([]) }.to raise_error ArgumentError
45
- expect{ MyModule.create_from_map('something') }.to raise_error ArgumentError
44
+ expect{ MyModule.factory_from_map([]) }.to raise_error ArgumentError
45
+ expect{ MyModule.factory_from_map('something') }.to raise_error ArgumentError
46
46
  end
47
47
 
48
48
  it 'calls the factory method' do
49
49
  mapping = { a: :b }
50
50
  expect(MyModule).to receive(:factory).with(:a, :b).and_call_original
51
- MyModule.create_from_map(mapping)
51
+ MyModule.factory_from_map(mapping)
52
52
  end
53
53
  end
54
54
  end
@@ -7,8 +7,8 @@ describe DataMaps::Condition do
7
7
  { when: { empty: true }, then: { filter: true } }
8
8
  ]
9
9
 
10
- expect(DataMaps::When).to receive(:create_from_map).with(mapping.first[:when]).and_call_original
11
- expect(DataMaps::Then).to receive(:create_from_map).with(mapping.first[:then]).and_call_original
10
+ expect(DataMaps::When).to receive(:factory_from_map).with(mapping.first[:when]).and_call_original
11
+ expect(DataMaps::Then).to receive(:factory_from_map).with(mapping.first[:then]).and_call_original
12
12
 
13
13
  expect(DataMaps::Condition).to receive(:new).with([DataMaps::When::Empty], [DataMaps::Then::Filter])
14
14
 
@@ -1,13 +1,13 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe DataMaps::Converter do
4
- describe '::create_from_map' do
4
+ describe '::factory_from_map' do
5
5
  it 'creates new converter' do
6
6
  mapping = { ruby: :upcase }
7
7
 
8
8
  expect(DataMaps::Converter).to receive(:factory).with(:ruby, :upcase).and_call_original
9
9
 
10
- DataMaps::Converter.create_from_map(mapping)
10
+ DataMaps::Converter.factory_from_map(mapping)
11
11
  end
12
12
  end
13
13
  end
@@ -1,8 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe DataMaps::Converter::Keys do
3
+ describe DataMaps::Converter::Key do
4
4
  describe '#execute' do
5
- subject { DataMaps::Converter::Keys.new({ a: 'x', b: 'y', c: 'z' }) }
5
+ subject { DataMaps::Converter::Key.new({ a: 'x', b: 'y', c: 'z' }) }
6
6
 
7
7
  it 'converts the keys' do
8
8
  expect(
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe DataMaps::Dsl::Mapping::ConditionsDsl do
4
+ subject{ DataMaps::Dsl::Mapping::ConditionsDsl.new }
5
+
6
+ describe '#initialze' do
7
+ it 'set whens to an empty hash' do
8
+ expect(subject.whens).to eq({})
9
+ end
10
+
11
+ it 'set thens to an empty hash' do
12
+ expect(subject.thens).to eq({})
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ describe DataMaps::Dsl::Mapping::FieldMappingDsl do
4
+ subject{ DataMaps::Dsl::Mapping::FieldMappingDsl.new(from: 'some-field') }
5
+
6
+ describe '#initialze' do
7
+ it 'sets the from attribute from options' do
8
+ expect(subject.from).to eq 'some-field'
9
+ end
10
+
11
+ it 'sets conditions to an empty array' do
12
+ expect(subject.conditions).to eq []
13
+ end
14
+
15
+ it 'sets converter to an empty hash' do
16
+ expect(subject.converter).to eq([])
17
+ end
18
+ end
19
+
20
+ describe '#add_condition' do
21
+ it 'creates a new ConditionsDsl object' do
22
+ dsl = DataMaps::Dsl::Mapping::ConditionsDsl.new
23
+
24
+ expect(DataMaps::Dsl::Mapping::ConditionsDsl).to receive(:new).with(no_args).and_return(dsl)
25
+ subject.add_condition
26
+ end
27
+
28
+ it 'calls configure with given block' do
29
+ expect do |block|
30
+ subject.add_condition(&block)
31
+ end.to yield_control
32
+ end
33
+ end
34
+
35
+ describe '#add_converter' do
36
+ it 'adds the defined converter to converter hash' do
37
+ expect{ subject.add_converter(:ruby, :downcase) }.to change{ subject.converter.count }.from(0).to(1)
38
+ expect(subject.converter.first).to eq({ apply: :ruby, option: :downcase })
39
+ end
40
+ end
41
+
42
+ describe '#to_h' do
43
+ it 'returns a hash with string keys' do
44
+ expect(subject.to_h).to be_a Hash
45
+ expect(subject.to_h.has_key?('from')).to be_truthy
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe DataMaps::Dsl::Mapping do
4
+ class Dummy
5
+ include DataMaps::Dsl::Mapping
6
+
7
+ attr_reader :mapping_hash
8
+
9
+ def initialize
10
+ @mapping_hash = {}
11
+ end
12
+ end
13
+
14
+ subject{ Dummy.new }
15
+
16
+ describe '#field' do
17
+ it 'creates a new FieldMappingDsl object with given options' do
18
+ options = { a: 'A', b: 'B' }
19
+ dsl = DataMaps::Dsl::Mapping::FieldMappingDsl.new
20
+
21
+ expect(DataMaps::Dsl::Mapping::FieldMappingDsl).to receive(:new).with(options).and_return(dsl)
22
+ subject.field(:myfield, options)
23
+ end
24
+
25
+ it 'calls configure with given block' do
26
+ expect do |block|
27
+ subject.field(:myfield, {}, &block)
28
+ end.to yield_control
29
+ end
30
+
31
+ it 'adds the serialized result to the mapping_hash' do
32
+ subject.field(:myfield, {})
33
+
34
+ expect(subject.mapping_hash.key?('myfield')).to be_truthy
35
+ end
36
+ end
37
+ end
@@ -14,7 +14,7 @@ describe DataMaps::Mapping do
14
14
  from: 'source1',
15
15
  conditions: [
16
16
  { when: { empty: true }, then: { filter: true } },
17
- { when: { regex: /[a-z]/ }, then: { convert: { ruby: :upcase } } },
17
+ { when: { regex: /[a-z]/ }, then: { convert: [ { apply: :ruby, option: :upcase } ] } },
18
18
  ]
19
19
  }
20
20
  }
@@ -24,9 +24,9 @@ describe DataMaps::Mapping do
24
24
  {
25
25
  'destination2' => {
26
26
  from: %w[ source2 source3 ],
27
- converter: {
28
- ruby: [:join, ', '],
29
- }
27
+ converter: [
28
+ { apply: :ruby, option: [:join, ', '] }
29
+ ]
30
30
  }
31
31
  }
32
32
  end
@@ -112,7 +112,7 @@ describe DataMaps::Mapping do
112
112
  end
113
113
 
114
114
  # Test mapping generation of a mapping hash with converter
115
- describe 'conditional mapping hash' do
115
+ describe 'converter mapping hash' do
116
116
  subject{ DataMaps::Mapping.new(converter_mapping_hash) }
117
117
 
118
118
  it 'has correct destination key' do
@@ -6,7 +6,7 @@ describe DataMaps::Statement do
6
6
  mapping = { from: 'a', to: 'b' }
7
7
 
8
8
  expect(DataMaps::Condition).to receive(:create_from_map).with([]).and_return([])
9
- expect(DataMaps::Converter).to receive(:create_from_map).with({}).and_return([])
9
+ expect(DataMaps::Converter).to receive(:create_from_map).with([]).and_return([])
10
10
 
11
11
  expect(DataMaps::Statement).to receive(:new).with('a', 'b', [], [])
12
12
 
@@ -1,13 +1,13 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe DataMaps::Then do
4
- describe '::create_from_map' do
4
+ describe '::factory_from_map' do
5
5
  it 'creates new thens' do
6
6
  mapping = { filter: true }
7
7
 
8
8
  expect(DataMaps::Then).to receive(:factory).with(:filter, true).and_call_original
9
9
 
10
- DataMaps::Then.create_from_map(mapping)
10
+ DataMaps::Then.factory_from_map(mapping)
11
11
  end
12
12
  end
13
13
  end
@@ -1,7 +1,12 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe DataMaps::Then::Convert do
4
- subject { DataMaps::Then::Convert.new({ map: { a: 'x', b: 'y' }, ruby: [:join, ','] }) }
4
+ subject do
5
+ DataMaps::Then::Convert.new([
6
+ { apply: :map, option: { a: 'x', b: 'y' } },
7
+ { apply: :ruby, option: [:join, ','] }
8
+ ])
9
+ end
5
10
 
6
11
  describe 'initialization' do
7
12
  it 'Creates the converter' do
@@ -1,13 +1,13 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe DataMaps::When do
4
- describe '::create_from_map' do
4
+ describe '::factory_from_map' do
5
5
  it 'creates new whens' do
6
6
  mapping = { empty: true }
7
7
 
8
8
  expect(DataMaps::When).to receive(:factory).with(:empty, true).and_call_original
9
9
 
10
- DataMaps::When.create_from_map(mapping)
10
+ DataMaps::When.factory_from_map(mapping)
11
11
  end
12
12
  end
13
13
  end
@@ -12,6 +12,10 @@ describe DataMaps::When::Empty do
12
12
  it 'returns false for non empty values' do
13
13
  expect(subject.execute('something')).to be_falsey
14
14
  end
15
+
16
+ it 'returns true for nil values' do
17
+ expect(subject.execute(nil)).to be_truthy
18
+ end
15
19
  end
16
20
 
17
21
  describe 'empty false' do
@@ -24,6 +28,10 @@ describe DataMaps::When::Empty do
24
28
  it 'returns true for non empty values' do
25
29
  expect(subject.execute('something')).to be_truthy
26
30
  end
31
+
32
+ it 'returns false for nil values' do
33
+ expect(subject.execute(nil)).to be_falsey
34
+ end
27
35
  end
28
36
  end
29
37
  end
metadata CHANGED
@@ -1,20 +1,23 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: data_maps
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Axel Wahlen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-25 00:00:00.000000000 Z
11
+ date: 2015-03-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.2'
20
+ - - ">="
18
21
  - !ruby/object:Gem::Version
19
22
  version: 3.2.21
20
23
  type: :runtime
@@ -22,6 +25,9 @@ dependencies:
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
27
  - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '3.2'
30
+ - - ">="
25
31
  - !ruby/object:Gem::Version
26
32
  version: 3.2.21
27
33
  - !ruby/object:Gem::Dependency
@@ -30,14 +36,14 @@ dependencies:
30
36
  requirements:
31
37
  - - "~>"
32
38
  - !ruby/object:Gem::Version
33
- version: '1.7'
39
+ version: '1.8'
34
40
  type: :development
35
41
  prerelease: false
36
42
  version_requirements: !ruby/object:Gem::Requirement
37
43
  requirements:
38
44
  - - "~>"
39
45
  - !ruby/object:Gem::Version
40
- version: '1.7'
46
+ version: '1.8'
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: rake
43
49
  requirement: !ruby/object:Gem::Requirement
@@ -72,14 +78,28 @@ dependencies:
72
78
  requirements:
73
79
  - - "~>"
74
80
  - !ruby/object:Gem::Version
75
- version: 0.9.1
81
+ version: 0.9.2
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: 0.9.2
89
+ - !ruby/object:Gem::Dependency
90
+ name: codeclimate-test-reporter
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: 0.4.7
76
96
  type: :development
77
97
  prerelease: false
78
98
  version_requirements: !ruby/object:Gem::Requirement
79
99
  requirements:
80
100
  - - "~>"
81
101
  - !ruby/object:Gem::Version
82
- version: 0.9.1
102
+ version: 0.4.7
83
103
  description: " Maps data to another structure through a mapping "
84
104
  email:
85
105
  - axel.wahlen@mixxt.de
@@ -97,16 +117,20 @@ files:
97
117
  - Rakefile
98
118
  - data_maps.gemspec
99
119
  - lib/data_maps.rb
120
+ - lib/data_maps/concerns/configurable.rb
100
121
  - lib/data_maps/concerns/factory.rb
101
122
  - lib/data_maps/condition.rb
102
123
  - lib/data_maps/converter/affixes.rb
103
124
  - lib/data_maps/converter/base.rb
104
125
  - lib/data_maps/converter/bool.rb
105
- - lib/data_maps/converter/keys.rb
126
+ - lib/data_maps/converter/key.rb
106
127
  - lib/data_maps/converter/map.rb
107
128
  - lib/data_maps/converter/numeric.rb
108
129
  - lib/data_maps/converter/ruby.rb
109
130
  - lib/data_maps/converter/string.rb
131
+ - lib/data_maps/dsl/mapping/conditions_dsl.rb
132
+ - lib/data_maps/dsl/mapping/field_dsl.rb
133
+ - lib/data_maps/dsl/mapping_dsl.rb
110
134
  - lib/data_maps/errors/invalid_data.rb
111
135
  - lib/data_maps/executable.rb
112
136
  - lib/data_maps/filtered_value.rb
@@ -122,16 +146,20 @@ files:
122
146
  - lib/data_maps/when/comparison.rb
123
147
  - lib/data_maps/when/empty.rb
124
148
  - lib/data_maps/when/regex.rb
149
+ - spec/data_maps/concerns/configurable_spec.rb
125
150
  - spec/data_maps/concerns/factory_spec.rb
126
151
  - spec/data_maps/condition_spec.rb
127
152
  - spec/data_maps/converter/affixes_spec.rb
128
153
  - spec/data_maps/converter/base_spec.rb
129
154
  - spec/data_maps/converter/bool_spec.rb
130
- - spec/data_maps/converter/keys_spec.rb
155
+ - spec/data_maps/converter/key_spec.rb
131
156
  - spec/data_maps/converter/map_spec.rb
132
157
  - spec/data_maps/converter/numeric_spec.rb
133
158
  - spec/data_maps/converter/ruby_spec.rb
134
159
  - spec/data_maps/converter/string_spec.rb
160
+ - spec/data_maps/dsl/mapping/conditions_dsl_spec.rb
161
+ - spec/data_maps/dsl/mapping/field_dsl_spec.rb
162
+ - spec/data_maps/dsl/mapping_dsl_spec.rb
135
163
  - spec/data_maps/executable_spec.rb
136
164
  - spec/data_maps/filtered_value_spec.rb
137
165
  - spec/data_maps/mapper_spec.rb
@@ -159,7 +187,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
159
187
  requirements:
160
188
  - - ">="
161
189
  - !ruby/object:Gem::Version
162
- version: '0'
190
+ version: 1.9.2
163
191
  required_rubygems_version: !ruby/object:Gem::Requirement
164
192
  requirements:
165
193
  - - ">="
@@ -167,21 +195,25 @@ required_rubygems_version: !ruby/object:Gem::Requirement
167
195
  version: '0'
168
196
  requirements: []
169
197
  rubyforge_project:
170
- rubygems_version: 2.4.2
198
+ rubygems_version: 2.4.6
171
199
  signing_key:
172
200
  specification_version: 4
173
201
  summary: Maps data to another structure through a mapping
174
202
  test_files:
203
+ - spec/data_maps/concerns/configurable_spec.rb
175
204
  - spec/data_maps/concerns/factory_spec.rb
176
205
  - spec/data_maps/condition_spec.rb
177
206
  - spec/data_maps/converter/affixes_spec.rb
178
207
  - spec/data_maps/converter/base_spec.rb
179
208
  - spec/data_maps/converter/bool_spec.rb
180
- - spec/data_maps/converter/keys_spec.rb
209
+ - spec/data_maps/converter/key_spec.rb
181
210
  - spec/data_maps/converter/map_spec.rb
182
211
  - spec/data_maps/converter/numeric_spec.rb
183
212
  - spec/data_maps/converter/ruby_spec.rb
184
213
  - spec/data_maps/converter/string_spec.rb
214
+ - spec/data_maps/dsl/mapping/conditions_dsl_spec.rb
215
+ - spec/data_maps/dsl/mapping/field_dsl_spec.rb
216
+ - spec/data_maps/dsl/mapping_dsl_spec.rb
185
217
  - spec/data_maps/executable_spec.rb
186
218
  - spec/data_maps/filtered_value_spec.rb
187
219
  - spec/data_maps/mapper_spec.rb