fencer 0.4.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: