fencer 0.4.2 → 0.5.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d8981e820e834eea1a54a757a871ef64e291d6dd
4
+ data.tar.gz: d27a6805f3b8d4e0f8e5d0273bf8a1fa97462a92
5
+ SHA512:
6
+ metadata.gz: 2c6acb3d3c01e970d94825cc926d61d1b041feef527a5b203f6d2185549634903bc170efc4556bc60114debb44c0b4e71c223f4f8a159feddbb49dfecd95702a
7
+ data.tar.gz: 45c2085f2732448d64af44dfe8f033e939e350024b5ab1f7a73a1b81752c9d6e543e115c91bd48a8c16daf173d0d2df912bf4ac975a0c9d5788a467b385d4281
data/README.md CHANGED
@@ -18,16 +18,16 @@ provided.
18
18
  converter.
19
19
 
20
20
  ## Field Conversion
21
- `Fencer::Base::Converters` is a `Hash<` defines some commonly-used converters.
22
- It's left un-frozen, so it can be extended as required.
21
+ `Fencer::Base::Converters` is a `Hash` that defines some commonly-used
22
+ converters. It's left un-frozen, so it can be extended as required.
23
23
 
24
24
  Short-cut methods for the default field types are also available:
25
25
 
26
- class EmployeeRecord < Fencer::Base
27
- string :department, 20 => String
28
- integer :age, 2 => Integer
29
- decimal :salary, 10 => BigDecimal
30
- end
26
+ class EmployeeRecord < Fencer::Base
27
+ string :department, 20 => String
28
+ integer :age, 2 => Integer
29
+ decimal :salary, 10 => BigDecimal
30
+ end
31
31
 
32
32
  Additionally, custom conversions can be defined by passing a `lambda`
33
33
  as the final argument.
@@ -60,7 +60,7 @@ without any change of layout:
60
60
  ## Known Deficiencies
61
61
 
62
62
  Currently, Fencer works with Ruby 1.9 only. Sorry. I wanted Hashes that
63
- preserve field-order. P;us, the newer syntax is pretty.
63
+ preserve field-order. Plus, the newer syntax is pretty.
64
64
 
65
65
  Fencer is also blissfully unaware of any sort of encoding. This is a planned
66
66
  feature for the 1.0 release.
@@ -2,39 +2,38 @@ require "bigdecimal"
2
2
  require "fencer/version"
3
3
 
4
4
  module Fencer
5
-
6
5
  class Base
7
6
  Converters = {
8
- string: -> s { s.strip },
7
+ string: -> s { s.to_s.strip },
9
8
  integer: -> s { s.to_i },
10
- decimal: -> s { BigDecimal(s) },
9
+ decimal: -> s { s.nil? ? nil : BigDecimal(s) },
11
10
  }
12
11
 
13
12
  class << self
14
13
  attr_reader :fields
15
-
16
- def inherited(subclass)
14
+
15
+ def inherited(subclass)
17
16
  subclass.instance_variable_set(:@fields, {})
18
17
  end
19
-
18
+
20
19
  def field(name, size, convert = nil)
21
20
  # error handling, ahoy!
22
21
  raise "#{name} already defined as a field on #{self.name}" if fields.has_key?(name)
23
-
22
+
24
23
  unless convert.nil? || Converters.has_key?(convert) || convert.is_a?(Proc)
25
24
  raise "Invalid converter"
26
25
  end
27
26
 
28
27
  fields[name] = { size: size, convert: convert }
29
-
28
+
30
29
  # create our attr method
31
- define_method(name) { @values[name] }
30
+ define_method(name) { @values[name] }
32
31
  end
33
-
32
+
34
33
  def space(size)
35
34
  fields[:"_#{fields.length.succ}"] = { size: size, space: true }
36
35
  end
37
-
36
+
38
37
  def string(name, size)
39
38
  field(name, size, :string)
40
39
  end
@@ -42,48 +41,50 @@ module Fencer
42
41
  def integer(name, size)
43
42
  field(name, size, :integer)
44
43
  end
45
-
44
+
46
45
  def decimal(name, size)
47
46
  field(name, size, :decimal)
48
- end
47
+ end
49
48
  end
50
-
51
- def initialize(str, delimiter = nil)
49
+
50
+ def initialize(raw_data, delimiter = nil)
52
51
  @values = {}
53
52
  @delimiter = delimiter
54
- @str = str
53
+ @raw_data = raw_data
55
54
 
56
55
  parse!
57
56
  end
58
-
57
+
59
58
  def to_hash
60
59
  @values
61
60
  end
62
-
61
+
63
62
  private
64
-
65
- def parse!
66
- if @delimiter
67
- raw_values = @str.split(@delimiter)
63
+
64
+ def parse!
65
+ if @raw_data.kind_of?(Array)
66
+ raw_values = @raw_data
67
+ elsif @delimiter
68
+ raw_values = @raw_data.split(@delimiter)
68
69
  else
69
70
  unpack_phrase = self.class.fields.values.map { |s| "A#{s[:size]}" }.join
70
- raw_values = @str.unpack(unpack_phrase)
71
+ raw_values = @raw_data.unpack(unpack_phrase)
71
72
  end
72
73
 
73
- _index = 0
74
- self.class.fields.each do |name, opts|
75
- unless opts[:space]
76
- _conversion_proc = case opts[:convert]
74
+ field_index = 0
75
+ self.class.fields.each do |name, opts|
76
+ unless opts[:space]
77
+ converter = case opts[:convert]
77
78
  when Symbol then Converters[opts[:convert]]
78
79
  when Proc then opts[:convert]
79
80
  else nil
80
- end
81
-
82
- @values[name] = _conversion_proc ? _conversion_proc.call(raw_values[_index]) : raw_values[_index]
81
+ end
82
+
83
+ @values[name] = converter ? converter.call(raw_values[field_index]) : raw_values[field_index]
83
84
  end
84
-
85
- _index += 1 unless opts[:space] && @delimiter
86
- end
87
- end
85
+
86
+ field_index += 1 unless opts[:space] && (@delimiter || @raw_data.kind_of?(Array))
87
+ end
88
+ end
88
89
  end
89
90
  end
@@ -1,3 +1,3 @@
1
1
  module Fencer
2
- VERSION = "0.4.2"
2
+ VERSION = "0.5.0"
3
3
  end
@@ -68,7 +68,21 @@ describe Fencer do
68
68
  values.department.should eq(department)
69
69
  values.employment_date.should eq("2012-05-25")
70
70
  values.id_number.should eq(id_number.to_i)
71
- values.leave_accrued.should eq(BigDecimal(leave_accrued))
71
+ values.leave_accrued.should eq(BigDecimal(leave_accrued))
72
+ end
73
+
74
+ it "also describes arrays!" do
75
+ compiled_record = [
76
+ name, department, employment_date, id_number, leave_accrued
77
+ ]
78
+
79
+ values = EmployeeRecord.new(compiled_record)
80
+
81
+ values.name.should eq(name)
82
+ values.department.should eq(department)
83
+ values.employment_date.should eq("2012-05-25")
84
+ values.id_number.should eq(id_number.to_i)
85
+ values.leave_accrued.should eq(BigDecimal(leave_accrued))
72
86
  end
73
87
  end
74
88
 
metadata CHANGED
@@ -1,38 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fencer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
5
- prerelease:
4
+ version: 0.5.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Dan Cheail
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-05-31 00:00:00.000000000 Z
11
+ date: 2017-10-12 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rspec
16
- requirement: &70270773693060 !ruby/object:Gem::Requirement
17
- none: false
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
- - - ~>
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
19
  version: '2.10'
22
20
  type: :development
23
21
  prerelease: false
24
- version_requirements: *70270773693060
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.10'
25
27
  - !ruby/object:Gem::Dependency
26
28
  name: rake
27
- requirement: &70270773692560 !ruby/object:Gem::Requirement
28
- none: false
29
+ requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
- - - ! '>='
31
+ - - ">="
31
32
  - !ruby/object:Gem::Version
32
33
  version: '0'
33
34
  type: :development
34
35
  prerelease: false
35
- version_requirements: *70270773692560
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
36
41
  description: Fixed-length/delimited record parser DSL
37
42
  email:
38
43
  - dan@undumb.com
@@ -40,7 +45,7 @@ executables: []
40
45
  extensions: []
41
46
  extra_rdoc_files: []
42
47
  files:
43
- - .rspec
48
+ - ".rspec"
44
49
  - LICENSE
45
50
  - README.md
46
51
  - Rakefile
@@ -50,33 +55,26 @@ files:
50
55
  - spec/fencer_spec.rb
51
56
  homepage: https://github.com/undumb/fencer
52
57
  licenses: []
58
+ metadata: {}
53
59
  post_install_message:
54
60
  rdoc_options: []
55
61
  require_paths:
56
62
  - lib
57
63
  required_ruby_version: !ruby/object:Gem::Requirement
58
- none: false
59
64
  requirements:
60
- - - ! '>='
65
+ - - ">="
61
66
  - !ruby/object:Gem::Version
62
67
  version: '0'
63
- segments:
64
- - 0
65
- hash: 1981968692186319614
66
68
  required_rubygems_version: !ruby/object:Gem::Requirement
67
- none: false
68
69
  requirements:
69
- - - ! '>='
70
+ - - ">="
70
71
  - !ruby/object:Gem::Version
71
72
  version: '0'
72
- segments:
73
- - 0
74
- hash: 1981968692186319614
75
73
  requirements: []
76
74
  rubyforge_project:
77
- rubygems_version: 1.8.17
75
+ rubygems_version: 2.6.13
78
76
  signing_key:
79
- specification_version: 3
77
+ specification_version: 4
80
78
  summary: Fencer makes working with fixed-length and delimited text-based records simpler
81
79
  by providing a flexible DSL for defining field lengths and transformations
82
80
  test_files: