darlingtonia 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a2fc4e8abdff2180e2ef7ff1303661e806c4c304
4
- data.tar.gz: 7d0f74053c870263e63ff9b84dc72f77c3f923eb
3
+ metadata.gz: 3f8a94f2f8efae78fd25e95e947a1290759dc552
4
+ data.tar.gz: b2c3f7bdbb8f1047620b1d2a12fda977c76c5242
5
5
  SHA512:
6
- metadata.gz: 752c341d5200f4bdb1c9a59a3f0188a31522558d20ea6e0d2c7f01eec36e4581aea4e6b6ffbc73c6fbc3dbce81db17e0af80a1c29ddf54bc7b0d453567f36351
7
- data.tar.gz: 2ebc1641f150f1e34316a4a60f6fbb16d8fd6cf13a3a5a624f9b0d92707817662df32cdf8ff20512c4efb4ce9924f6c16fde9cef9f674174c6ab3f6483109771
6
+ metadata.gz: c33bd4225faab6259e72e4cd74cbb24bca5a7c8592fe61c2ea290bfd03922f2a3b80cead1c3db1f89fc033fee04868130459f841e2a2669a174ecc28f76a532a
7
+ data.tar.gz: ad7b5de36a1dafdfde876647713fc582218a3f9e7eca49385375751572785e0200209ca502425769d3cb88adcff134e1c56a8876a77c44432dc13bceedadf4f9
data/CHANGELOG.md ADDED
@@ -0,0 +1,14 @@
1
+ 0.1.1 - Fri Jan 12, 2018
2
+ ------------------------
3
+
4
+ Bugfix for nested class inheritance.
5
+
6
+ - Fix CI by requiring manually 'tempfile' in specs that use it
7
+ - Add a CSV format validator at `CsvFormatValidator`
8
+ - Fix `Parser` subclass registration and reorder parser class `#match`
9
+ priority.
10
+
11
+ 0.1.0 - Thu Jan 11, 2018
12
+ ------------------------
13
+
14
+ Inital release.
@@ -9,8 +9,10 @@ module Darlingtonia
9
9
  #
10
10
  # Parser.for(file: file).records
11
11
  #
12
+ # rubocop:disable Style/ClassVars
12
13
  class Parser
13
- @subclasses = [] # @private
14
+ DEFAULT_VALIDATORS = [].freeze
15
+ @@subclasses = [] # @private
14
16
 
15
17
  ##
16
18
  # @!attribute [rw] file
@@ -42,7 +44,7 @@ module Darlingtonia
42
44
  # @raise [NoParserError]
43
45
  def for(file:)
44
46
  klass =
45
- @subclasses.find { |k| k.match?(file: file) } ||
47
+ @@subclasses.find { |k| k.match?(file: file) } ||
46
48
  raise(NoParserError)
47
49
 
48
50
  klass.new(file: file)
@@ -58,7 +60,7 @@ module Darlingtonia
58
60
  ##
59
61
  # @private Register a new class when inherited
60
62
  def inherited(subclass)
61
- @subclasses << subclass
63
+ @@subclasses.unshift subclass
62
64
  super
63
65
  end
64
66
  end
@@ -99,5 +101,5 @@ module Darlingtonia
99
101
 
100
102
  class NoParserError < TypeError; end
101
103
  class ValidationError < RuntimeError; end
102
- end
104
+ end # rubocop:enable Style/ClassVars
103
105
  end
@@ -3,6 +3,19 @@
3
3
  module Darlingtonia
4
4
  ##
5
5
  # @abstract A null validator; always returns an empty error collection
6
+ #
7
+ # @example validating a parser
8
+ # validator = MyValidator.new
9
+ # validator.validate(parser: myParser)
10
+ #
11
+ # @example validating an invalid parser
12
+ # validator = MyValidator.new
13
+ # validator.validate(parser: invalidParser)
14
+ # # => Error<#... validator: MyValidator,
15
+ # name: 'An Error Name',
16
+ # description: '...'
17
+ # lineno: 37>
18
+ #
6
19
  class Validator
7
20
  Error = Struct.new(:validator, :name, :description, :lineno)
8
21
 
@@ -2,7 +2,23 @@
2
2
 
3
3
  module Darlingtonia
4
4
  ##
5
- # A validator for correctly formatted CSV
5
+ # A validator for correctly formatted CSV.
6
+ #
7
+ # @example
8
+ # parser = Parser.new(file: File.open('path/to/my.csv'))
9
+ #
10
+ # CsvFormatValidator.new.validate(parser: parser)
11
+ #
12
+ # @see http://ruby-doc.org/stdlib-2.0.0/libdoc/csv/rdoc/CSV/MalformedCSVError.html
6
13
  class CsvFormatValidator < Validator
14
+ ##
15
+ # @see Validator#validate
16
+ def validate(parser:, **)
17
+ return [] if CSV.parse(parser.file.read)
18
+ rescue CSV::MalformedCSVError => e
19
+ [Error.new(self.class, e.class, e.message)]
20
+ ensure
21
+ parser.file.rewind
22
+ end
7
23
  end
8
24
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Darlingtonia
4
- VERSION = '0.1.0'
4
+ VERSION = '0.1.1'
5
5
  end
@@ -3,5 +3,36 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe Darlingtonia::CsvFormatValidator do
6
- it_behaves_like 'a Darlingtonia::Validator'
6
+ subject(:validator) { described_class.new }
7
+ let(:invalid_parser) { Darlingtonia::CsvParser.new(file: invalid_file) }
8
+ let(:invalid_file) { File.open('spec/fixtures/bad_example.csv') }
9
+
10
+ it_behaves_like 'a Darlingtonia::Validator' do
11
+ let(:valid_parser) { Darlingtonia::CsvParser.new(file: valid_file) }
12
+ let(:valid_file) { File.open('spec/fixtures/example.csv') }
13
+ end
14
+
15
+ define :a_validator_error do
16
+ match do |error|
17
+ return false unless error.respond_to?(:validator)
18
+
19
+ if fields
20
+ return false if fields[:validator] && error.validator != fields[:validator]
21
+ return false if fields[:name] && error.name != fields[:name]
22
+ end
23
+
24
+ true
25
+ end
26
+
27
+ chain :with, :fields
28
+ end
29
+
30
+ describe '#validate' do
31
+ it 'returns a Validator::Error' do
32
+ expect(validator.validate(parser: invalid_parser))
33
+ .to contain_exactly a_validator_error
34
+ .with(validator: validator.class,
35
+ name: CSV::MalformedCSVError)
36
+ end
37
+ end
7
38
  end
@@ -2,6 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'spec_helper'
5
+ require 'tempfile'
5
6
 
6
7
  describe Darlingtonia::CsvParser do
7
8
  subject(:parser) { described_class.new(file: file) }
@@ -24,12 +24,17 @@ describe Darlingtonia::Parser do
24
24
  end
25
25
  end
26
26
  end
27
+
28
+ class NestedParser < FakeParser; end
27
29
  end
28
30
 
29
- after(:context) { Object.send(:remove_const, :FakeParser) }
31
+ after(:context) do
32
+ Object.send(:remove_const, :FakeParser)
33
+ Object.send(:remove_const, :NestedParser)
34
+ end
30
35
 
31
36
  it 'returns an importer instance' do
32
- expect(described_class.for(file: file)).to be_a FakeParser
37
+ expect(described_class.for(file: file)).to be_a NestedParser
33
38
  end
34
39
  end
35
40
  end
@@ -0,0 +1,2 @@
1
+ title,description
2
+ fake title, "fake description--quote wrap after delimiter then space is invalid"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: darlingtonia
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Johnson
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-01-11 00:00:00.000000000 Z
12
+ date: 2018-01-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: active-fedora
@@ -138,6 +138,7 @@ files:
138
138
  - ".gitignore"
139
139
  - ".rubocop.yml"
140
140
  - ".travis.yml"
141
+ - CHANGELOG.md
141
142
  - Gemfile
142
143
  - README.md
143
144
  - Rakefile
@@ -161,6 +162,7 @@ files:
161
162
  - spec/darlingtonia/parser_spec.rb
162
163
  - spec/darlingtonia/validator_spec.rb
163
164
  - spec/darlingtonia/version_spec.rb
165
+ - spec/fixtures/bad_example.csv
164
166
  - spec/fixtures/example.csv
165
167
  - spec/integration/import_csv_spec.rb
166
168
  - spec/spec_helper.rb