cascade-rb 0.1.5 → 0.2.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: e76a5428ad502dfd46ba38144264758b9db61701
4
- data.tar.gz: c806af678c7b76c650100d0468b10894d6fd1e6d
3
+ metadata.gz: b321e02345f0116d9def142e1ef8ece2dda722e4
4
+ data.tar.gz: ae08c0071e7abf966764e3b2d8fc194428b28244
5
5
  SHA512:
6
- metadata.gz: 81b4fee7d44a42ae18deea8c2cb61c7629bd56703350833f9cd0e3e52b01b1809c38e8a4c709d9cdfe7c596c9680e4079fb8c5c18b0cc289d4d118b67e6e0425
7
- data.tar.gz: 12fb5bf658fd193b8dd92a45f90b9de140f834f534e3902fe0948f90b7507fdd6bb73a789ce70a9feeb12bed6e4901232eb886855046b22d47b6b77dc9c2af32
6
+ metadata.gz: 0b6d62c7ed816ab434ed9a245e8a278753e73bbf3b031b899946b7afe095eeb1276e9760fbe7c6ef1381a76a2c12a8c2a439b92aa24c328129c2e5a8b9d1bae8
7
+ data.tar.gz: 4604b3cd290fda7437b9e91dc4453d1e92800f4e8ea3f8cf5fef87973ccf42f235c60b598e247e34a7d9f5dbc3420dc88715ca3d4cbf65c60dc1fdbcf7f466b6
data/README.md CHANGED
@@ -52,9 +52,9 @@ Cascade.configuration do
52
52
  end
53
53
  ```
54
54
 
55
- Provide file for parsing and run it!
55
+ Provide iteratable object for parsing and run it!
56
56
  ```ruby
57
- Cascade::DataParser.new("data_test.txt").call
57
+ Cascade::DataParser.new(data_provider: Csv.open("data_test.csv")).call
58
58
  ```
59
59
 
60
60
  ## Columns mapping
@@ -69,7 +69,6 @@ There are several alredy defined fields parsers (types):
69
69
 
70
70
  - currency
71
71
  - boolean
72
- - country_iso
73
72
  - string
74
73
 
75
74
  Feel free to add new fields parsers and provide it through PR.
@@ -110,9 +109,9 @@ DATE_PARSER = -> (value) { Date.parse(value) }
110
109
  ```
111
110
  Provide all this stuff into data parser
112
111
  ```ruby
113
- Cascade::DataParser.new("data_test.json",
112
+ Cascade::DataParser.new(
113
+ data_provider: ParserJSON.new.open("data_test.csv"),
114
114
  row_processor: Cascade::RowProcessor.new(date: DateParser.new),
115
- data_provider: ParserJSON.new,
116
115
  data_saver: PERSON_SAVER
117
116
  ).call
118
117
  ```
@@ -18,15 +18,12 @@ 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 "iso_country_codes"
22
- spec.add_dependency "awesome_print"
23
-
24
21
  spec.add_development_dependency "bundler", "~> 1.6"
25
22
  spec.add_development_dependency "yard"
26
23
  spec.add_development_dependency "rake"
27
24
  spec.add_development_dependency "minitest"
28
25
  spec.add_development_dependency "rr"
29
- spec.add_development_dependency "shoulda-matchers"
26
+ spec.add_development_dependency "shoulda-matchers", "2.8.0"
30
27
  spec.add_development_dependency "simplecov"
31
28
  spec.add_development_dependency "pry"
32
29
  spec.add_development_dependency "rubocop"
@@ -1,7 +1,6 @@
1
1
  require "cascade/version"
2
2
  require "cascade/columns_matching"
3
3
  require "cascade/row_processor"
4
- require "cascade/error_handler"
5
4
  require "cascade/helpers/configuration"
6
5
 
7
6
  # Base gem module
@@ -1,4 +1,5 @@
1
1
  require "yaml"
2
+ require 'forwardable'
2
3
  require "cascade/exceptions"
3
4
  require "cascade/helpers/configuration"
4
5
 
@@ -1,3 +1,2 @@
1
- require "cascade/complex_fields/country_iso"
2
1
  require "cascade/complex_fields/currency"
3
2
  require "cascade/complex_fields/boolean"
@@ -1,21 +1,13 @@
1
- require "awesome_print"
2
-
3
1
  require "cascade/columns_matching"
4
- require "cascade/cascade_csv"
5
- require "cascade/row_processor"
6
- require "cascade/error_handler"
7
- require "cascade/helpers/hash"
2
+ require "cascade/registry"
8
3
 
9
4
  module Cascade
10
5
  class DataParser
11
- PUTS_DATA_SAVER = ->(*args) { ap args }
12
-
13
- def initialize(filename, options = {})
14
- @filename = filename
15
- @data_provider = options.fetch(:data_provider) { CascadeCsv }
16
- @row_processor = options.fetch(:row_processor) { RowProcessor.new }
17
- @error_handler = options.fetch(:error_handler) { ErrorHandler.new }
18
- @data_saver = options.fetch(:data_saver) { PUTS_DATA_SAVER }
6
+ def initialize(options = {})
7
+ @data_provider = options.fetch(:data_provider) { Registry.data_provider }
8
+ @row_processor = options.fetch(:row_processor) { Registry.row_processor }
9
+ @error_handler = options.fetch(:error_handler) { Registry.error_handler }
10
+ @data_saver = options.fetch(:data_saver) { Registry.data_saver }
19
11
  end
20
12
 
21
13
  # Starts parsing processing with opening file and iterating through each
@@ -23,7 +15,7 @@ module Cascade
23
15
  # DataSaver
24
16
  #
25
17
  def call
26
- @data_provider.open(@filename).each do |row|
18
+ @data_provider.each do |row|
27
19
  @error_handler.with_errors_handling(row) do
28
20
  @data_saver.call @row_processor.call(row)
29
21
  end
@@ -6,8 +6,8 @@ module Cascade
6
6
 
7
7
  define_setting :raise_parse_errors, false
8
8
 
9
- HANDLING_EXCEPTIONS = [IsoCountryCodes::UnknownCodeError, IndexError]
10
- DEFAULT_ERROR_STORE = ->(row, reason) do
9
+ HANDLING_EXCEPTIONS = [IndexError]
10
+ DEFAULT_ERROR_STORE = lambda do |row, reason|
11
11
  @errors ||= []
12
12
  @errors << [row, reason]
13
13
  end
@@ -1,2 +1,3 @@
1
1
  require "cascade/exceptions/wrong_mapping_format"
2
2
  require "cascade/exceptions/unknown_presenter_type"
3
+ require "cascade/exceptions/unsupported_component"
@@ -0,0 +1,9 @@
1
+ module Cascade
2
+ class UnsupportedComponent < ::StandardError
3
+ MESSAGE = "You should provide data provider that respond to `each` method"
4
+
5
+ def initialize(msg = MESSAGE)
6
+ super
7
+ end
8
+ end
9
+ end
@@ -1,5 +1,5 @@
1
- class Hash
2
- unless Hash.instance_methods.include? :reverse_merge
1
+ module HashRefinements
2
+ refine Hash do
3
3
  # Merges the caller into +other_hash+
4
4
  #
5
5
  def reverse_merge(other_hash)
@@ -0,0 +1,24 @@
1
+ require "cascade/error_handler"
2
+ require "cascade/row_processor"
3
+
4
+ module Cascade
5
+ module Registry
6
+ PUTS_DATA_SAVER = ->(*args) { p args }
7
+
8
+ def self.row_processor
9
+ RowProcessor.new
10
+ end
11
+
12
+ def self.error_handler
13
+ ErrorHandler.new
14
+ end
15
+
16
+ def self.data_saver
17
+ PUTS_DATA_SAVER
18
+ end
19
+
20
+ def self.data_provider
21
+ raise Cascade::UnsupportedComponent
22
+ end
23
+ end
24
+ end
@@ -1,10 +1,12 @@
1
1
  require "cascade/complex_fields"
2
2
  require "cascade/exceptions"
3
3
  require "cascade/helpers/configuration"
4
+ require "cascade/helpers/hash"
4
5
 
5
6
  module Cascade
6
7
  class RowProcessor
7
8
  extend Configuration
9
+ using HashRefinements
8
10
 
9
11
  DEFAULT_PROCESSOR = ->(value) { value }
10
12
 
@@ -43,7 +45,6 @@ module Cascade
43
45
  {
44
46
  string: DEFAULT_PROCESSOR,
45
47
  currency: ComplexFields::Currency.new,
46
- country_iso: ComplexFields::CountryIso.new,
47
48
  boolean: ComplexFields::Boolean.new,
48
49
  }
49
50
  end
@@ -1,4 +1,4 @@
1
1
  module Cascade
2
2
  # current gem version
3
- VERSION = "0.1.5"
3
+ VERSION = "0.2.0"
4
4
  end
@@ -7,7 +7,7 @@ describe Cascade::DataParser do
7
7
  end
8
8
 
9
9
  class FakeDataProvider
10
- def open(_)
10
+ def self.open(_)
11
11
  [
12
12
  ["Sally Whittaker", "2018", "McCarren House", "312",
13
13
  "3.75", "France", "+", "123.123"],
@@ -18,14 +18,14 @@ describe Cascade::DataParser do
18
18
  end
19
19
 
20
20
  let(:filename) { "spec/examples/data_test.txt" }
21
- let(:data_provider) { FakeDataProvider.new }
21
+ let(:data_provider) { FakeDataProvider.open(filename) }
22
22
 
23
23
  before do
24
24
  @processor_calls_count = 0
25
25
  @data_saves_count = 0
26
26
  row_processor = ->(_row) { @processor_calls_count += 1 }
27
27
  data_saver = ->(*) { @data_saves_count += 1 }
28
- @parser = described_class.new(filename, row_processor: row_processor,
28
+ @parser = described_class.new(row_processor: row_processor,
29
29
  data_saver: data_saver, data_provider: data_provider)
30
30
  end
31
31
 
@@ -7,7 +7,7 @@ describe Cascade::ErrorHandler do
7
7
  end
8
8
 
9
9
  let(:error_store) do
10
- ->(row, reason) do
10
+ lambda do |row, reason|
11
11
  @errors ||= []
12
12
  @errors << [row, reason]
13
13
  end
@@ -0,0 +1,20 @@
1
+ require "spec_helper"
2
+ require "cascade/exceptions/unsupported_component"
3
+
4
+ describe Cascade::UnsupportedComponent do
5
+ subject { Cascade::UnsupportedComponent.new }
6
+ it "exception raisable" do
7
+ assert_respond_to subject, :exception
8
+ end
9
+
10
+ context "#message" do
11
+ it "uses passed message" do
12
+ subject = Cascade::UnsupportedComponent.new("custom_message")
13
+ assert_equal subject.message, "custom_message"
14
+ end
15
+
16
+ it "uses default message if not passed" do
17
+ assert_equal subject.message, Cascade::UnsupportedComponent::MESSAGE
18
+ end
19
+ end
20
+ end
@@ -3,11 +3,13 @@ require "cascade/helpers/hash"
3
3
 
4
4
  describe Hash do
5
5
  describe "#reverse_merge" do
6
+ using HashRefinements
7
+
6
8
  let(:another_hash) { { a: 1, b: 2 } }
7
- let(:hash) { { a: 4, c: 3 } }
9
+ let(:example_hash) { { a: 4, c: 3 } }
8
10
 
9
11
  it "merge self into anothe hash" do
10
- assert_equal hash.reverse_merge(another_hash),
12
+ assert_equal example_hash.reverse_merge(another_hash),
11
13
  a: 4, b: 2, c: 3
12
14
  end
13
15
  end
@@ -0,0 +1,28 @@
1
+ require "spec_helper"
2
+ require "cascade/registry"
3
+
4
+ describe Cascade::Registry do
5
+ def described_class
6
+ Cascade::Registry
7
+ end
8
+
9
+ it "creates new instance of default row processor" do
10
+ mock(Cascade::RowProcessor).new
11
+ described_class.row_processor
12
+ end
13
+
14
+ it "creates new instance of default error handler" do
15
+ mock(Cascade::ErrorHandler).new
16
+ described_class.error_handler
17
+ end
18
+
19
+ it "return default callable data saver" do
20
+ assert_respond_to described_class.data_saver, :call
21
+ end
22
+
23
+ it "return default data provider" do
24
+ assert_raises(Cascade::UnsupportedComponent) do
25
+ described_class.data_provider
26
+ end
27
+ end
28
+ end
@@ -7,10 +7,17 @@ end
7
7
  require "minitest/autorun"
8
8
  require "minitest/pride"
9
9
  require "minitest/mock"
10
+ require "minitest/hell"
10
11
  require "shoulda/matchers"
11
12
  require "rr"
12
13
 
13
14
  require "codeclimate-test-reporter"
14
15
  CodeClimate::TestReporter.start
15
16
 
16
- alias :context :describe
17
+ class Minitest::Test
18
+ parallelize_me!
19
+ end
20
+
21
+ module Kernel
22
+ alias_method :context, :describe
23
+ end
metadata CHANGED
@@ -1,43 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cascade-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ignat Zakrevsky
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-06 00:00:00.000000000 Z
11
+ date: 2015-11-23 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: iso_country_codes
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: awesome_print
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
13
  - !ruby/object:Gem::Dependency
42
14
  name: bundler
43
15
  requirement: !ruby/object:Gem::Requirement
@@ -112,16 +84,16 @@ dependencies:
112
84
  name: shoulda-matchers
113
85
  requirement: !ruby/object:Gem::Requirement
114
86
  requirements:
115
- - - ">="
87
+ - - '='
116
88
  - !ruby/object:Gem::Version
117
- version: '0'
89
+ version: 2.8.0
118
90
  type: :development
119
91
  prerelease: false
120
92
  version_requirements: !ruby/object:Gem::Requirement
121
93
  requirements:
122
- - - ">="
94
+ - - '='
123
95
  - !ruby/object:Gem::Version
124
- version: '0'
96
+ version: 2.8.0
125
97
  - !ruby/object:Gem::Dependency
126
98
  name: simplecov
127
99
  requirement: !ruby/object:Gem::Requirement
@@ -193,20 +165,20 @@ files:
193
165
  - Rakefile
194
166
  - cascade.gemspec
195
167
  - lib/cascade.rb
196
- - lib/cascade/cascade_csv.rb
197
168
  - lib/cascade/columns_matching.rb
198
169
  - lib/cascade/complex_fields.rb
199
170
  - lib/cascade/complex_fields/boolean.rb
200
- - lib/cascade/complex_fields/country_iso.rb
201
171
  - lib/cascade/complex_fields/currency.rb
202
172
  - lib/cascade/concerns/statistics_collectible.rb
203
173
  - lib/cascade/data_parser.rb
204
174
  - lib/cascade/error_handler.rb
205
175
  - lib/cascade/exceptions.rb
206
176
  - lib/cascade/exceptions/unknown_presenter_type.rb
177
+ - lib/cascade/exceptions/unsupported_component.rb
207
178
  - lib/cascade/exceptions/wrong_mapping_format.rb
208
179
  - lib/cascade/helpers/configuration.rb
209
180
  - lib/cascade/helpers/hash.rb
181
+ - lib/cascade/registry.rb
210
182
  - lib/cascade/row_processor.rb
211
183
  - lib/cascade/statistics.rb
212
184
  - lib/cascade/statistics_stores.rb
@@ -214,18 +186,18 @@ files:
214
186
  - lib/cascade/statistics_stores/array_store.rb
215
187
  - lib/cascade/statistics_stores/counter_store.rb
216
188
  - lib/cascade/version.rb
217
- - spec/lib/cascade_csv_spec.rb
218
189
  - spec/lib/columns_matching_spec.rb
219
190
  - spec/lib/complex_fields/boolean_spec.rb
220
- - spec/lib/complex_fields/country_iso_spec.rb
221
191
  - spec/lib/complex_fields/currency_spec.rb
222
192
  - spec/lib/concerns/statistics_collectible_spec.rb
223
193
  - spec/lib/data_parser_spec.rb
224
194
  - spec/lib/error_handler_spec.rb
225
195
  - spec/lib/exceptions/unknown_presenter_type_spec.rb
196
+ - spec/lib/exceptions/unsupported_component_spec.rb
226
197
  - spec/lib/exceptions/wrong_mapping_format_spec.rb
227
198
  - spec/lib/helpers/configuration_spec.rb
228
- - spec/lib/helpers/hash.rb
199
+ - spec/lib/helpers/hash_spec.rb
200
+ - spec/lib/registry_spec.rb
229
201
  - spec/lib/row_processor_spec.rb
230
202
  - spec/lib/statistics_spec.rb
231
203
  - spec/lib/statistics_stores/abstract_store_spec.rb
@@ -252,27 +224,26 @@ required_rubygems_version: !ruby/object:Gem::Requirement
252
224
  version: '0'
253
225
  requirements: []
254
226
  rubyforge_project:
255
- rubygems_version: 2.2.0
227
+ rubygems_version: 2.4.5
256
228
  signing_key:
257
229
  specification_version: 4
258
230
  summary: Ruby data parser gem.
259
231
  test_files:
260
- - spec/lib/cascade_csv_spec.rb
261
232
  - spec/lib/columns_matching_spec.rb
262
233
  - spec/lib/complex_fields/boolean_spec.rb
263
- - spec/lib/complex_fields/country_iso_spec.rb
264
234
  - spec/lib/complex_fields/currency_spec.rb
265
235
  - spec/lib/concerns/statistics_collectible_spec.rb
266
236
  - spec/lib/data_parser_spec.rb
267
237
  - spec/lib/error_handler_spec.rb
268
238
  - spec/lib/exceptions/unknown_presenter_type_spec.rb
239
+ - spec/lib/exceptions/unsupported_component_spec.rb
269
240
  - spec/lib/exceptions/wrong_mapping_format_spec.rb
270
241
  - spec/lib/helpers/configuration_spec.rb
271
- - spec/lib/helpers/hash.rb
242
+ - spec/lib/helpers/hash_spec.rb
243
+ - spec/lib/registry_spec.rb
272
244
  - spec/lib/row_processor_spec.rb
273
245
  - spec/lib/statistics_spec.rb
274
246
  - spec/lib/statistics_stores/abstract_store_spec.rb
275
247
  - spec/lib/statistics_stores/array_store_spec.rb
276
248
  - spec/lib/statistics_stores/counter_store_spec.rb
277
249
  - spec/spec_helper.rb
278
- has_rdoc:
@@ -1,13 +0,0 @@
1
- require "csv"
2
-
3
- module Cascade
4
- class CascadeCsv
5
- # Delegates oepn method to CSV with passed and alredy-defined params
6
- # This method opens an IO object, and wraps that with CSV.
7
- #
8
- def self.open(*args)
9
- options = if args.last.is_a? Hash then args.pop else Hash.new end
10
- CSV.open(*args << options.reverse_merge(col_sep: "\t", quote_char: "\0"))
11
- end
12
- end
13
- end
@@ -1,12 +0,0 @@
1
- require "iso_country_codes"
2
-
3
- module Cascade
4
- module ComplexFields
5
- class CountryIso
6
- def call(country)
7
- return unless country
8
- IsoCountryCodes.search_by_name(country).first.alpha2
9
- end
10
- end
11
- end
12
- end
@@ -1,21 +0,0 @@
1
- require "spec_helper"
2
- require "cascade/cascade_csv"
3
-
4
- describe Cascade::CascadeCsv do
5
- def described_class
6
- Cascade::CascadeCsv
7
- end
8
-
9
- let(:filename) { "filename.csv" }
10
-
11
- it "pass default col_sep and quote_char if in not setted" do
12
- mock(CSV).open(filename, col_sep: "\t", quote_char: "\0")
13
- described_class.open(filename)
14
- end
15
-
16
- it "pass specified col_sep and quote_char" do
17
- mock(CSV).open(filename, col_sep: "custom_sep", quote_char: "custom_quote")
18
- described_class.open(filename, col_sep: "custom_sep",
19
- quote_char: "custom_quote")
20
- end
21
- end
@@ -1,24 +0,0 @@
1
- require "spec_helper"
2
- require "cascade/complex_fields/country_iso"
3
-
4
- describe Cascade::ComplexFields::CountryIso do
5
- def described_class
6
- Cascade::ComplexFields::CountryIso
7
- end
8
-
9
- let(:subject) { described_class.new }
10
-
11
- it "translate country name to alpha-2 code" do
12
- assert_equal subject.call("France"), "FR"
13
- end
14
-
15
- it "raise error if there is no such country" do
16
- assert_raises IsoCountryCodes::UnknownCodeError do
17
- subject.call("some_blank_value")
18
- end
19
- end
20
-
21
- it "return nil if nil value passed" do
22
- assert_nil subject.call(nil)
23
- end
24
- end