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.
- checksums.yaml +7 -0
- data/README.md +8 -8
- data/lib/fencer.rb +35 -34
- data/lib/fencer/version.rb +1 -1
- data/spec/fencer_spec.rb +15 -1
- metadata +22 -24
checksums.yaml
ADDED
@@ -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
|
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
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
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.
|
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.
|
data/lib/fencer.rb
CHANGED
@@ -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(
|
49
|
+
|
50
|
+
def initialize(raw_data, delimiter = nil)
|
52
51
|
@values = {}
|
53
52
|
@delimiter = delimiter
|
54
|
-
@
|
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 @
|
67
|
-
raw_values = @
|
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 = @
|
71
|
+
raw_values = @raw_data.unpack(unpack_phrase)
|
71
72
|
end
|
72
73
|
|
73
|
-
|
74
|
-
self.class.fields.each do |name, opts|
|
75
|
-
unless opts[:space]
|
76
|
-
|
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] =
|
81
|
+
end
|
82
|
+
|
83
|
+
@values[name] = converter ? converter.call(raw_values[field_index]) : raw_values[field_index]
|
83
84
|
end
|
84
|
-
|
85
|
-
|
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
|
data/lib/fencer/version.rb
CHANGED
data/spec/fencer_spec.rb
CHANGED
@@ -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.
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
75
|
+
rubygems_version: 2.6.13
|
78
76
|
signing_key:
|
79
|
-
specification_version:
|
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:
|