pikelet 0.1.0 → 1.0.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 +4 -4
- data/README.md +0 -46
- data/lib/pikelet/field_definition.rb +5 -24
- data/lib/pikelet/record_definition.rb +4 -4
- data/lib/pikelet/version.rb +1 -1
- data/pikelet.gemspec +0 -2
- data/spec/pikelet/field_definition_spec.rb +9 -38
- data/spec/pikelet_spec.rb +2 -20
- metadata +1 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dacccea06922299a0d633783508e02e9ecdffb5c
|
4
|
+
data.tar.gz: 60844ae6f649d78df19fc3a3104a1e8270869ccb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 15e82690246aeb038429e4aca2a160c1b5cc3329266b0a99cfaa3e4525e26ae0d56f42d2a292e6e3733d7f58a75fc2eeba95b7b161c3fb6d6f294d4cf15a5eb7
|
7
|
+
data.tar.gz: d50efdf234ef8828b69c536de57f59ba569cffcb824eb724abefcca72d7b84cee99cdebad0ce276ff1939b0659a0ce6358c2b4e27a697da5c2ec4686e257f310
|
data/README.md
CHANGED
@@ -211,52 +211,6 @@ You can also use shorthand syntax:
|
|
211
211
|
a_number 0...4, &:to_i
|
212
212
|
end
|
213
213
|
|
214
|
-
### A stupid trick
|
215
|
-
|
216
|
-
The `field` statement will actually accepts multiple ranges/indices and will
|
217
|
-
simply glue the sections described together. Consider the following data:
|
218
|
-
|
219
|
-
|BFH|00000001|01|LONZZZ 203TEST1101022359GB000001 |
|
220
|
-
|BCH|00000002|02|0111101007F110107 |
|
221
|
-
|BOH|00000003|03|91200001101031 GBP2|
|
222
|
-
|BKT|00000004|06| 000001 011X ZZZ |
|
223
|
-
|
224
|
-
In this format the first three characters are a 'message identifier', the next
|
225
|
-
8 characters are a sequence number and the next 2 are a 'numeric qualifier'.
|
226
|
-
The message identifier and numeric qualifier together form the type signature.
|
227
|
-
|
228
|
-
We can describe this as follows (let's not bother describing all the
|
229
|
-
different record types):
|
230
|
-
|
231
|
-
Pikelet.define do
|
232
|
-
type_signature 0... 3, 11...13
|
233
|
-
sequence 3...11, &:to_i
|
234
|
-
payload 13.. -1
|
235
|
-
end
|
236
|
-
|
237
|
-
Which will yield:
|
238
|
-
|
239
|
-
#<struct
|
240
|
-
type_signature="BFH01",
|
241
|
-
sequence=1,
|
242
|
-
payload="LONZZZ 203TEST1101022359GB000001">,
|
243
|
-
#<struct
|
244
|
-
type_signature="BCH02",
|
245
|
-
sequence=2,
|
246
|
-
payload="0111101007F110107">,
|
247
|
-
#<struct
|
248
|
-
type_signature="BOH03",
|
249
|
-
sequence=3,
|
250
|
-
payload="91200001101031 GBP2">,
|
251
|
-
#<struct
|
252
|
-
type_signature="BKT06",
|
253
|
-
sequence=4,
|
254
|
-
payload="000001 011X ZZZ">
|
255
|
-
|
256
|
-
In case you were wondering, no I didn't make that format up. That is what a
|
257
|
-
[BSP HOT file][dish] actually looks like, except there's a hell of a lot more
|
258
|
-
of it and many, many more record types.
|
259
|
-
|
260
214
|
## Thoughts/plans
|
261
215
|
|
262
216
|
* With some work, Pikelet could produce flat file records as easily as it
|
@@ -1,33 +1,14 @@
|
|
1
|
-
require "overpunch"
|
2
|
-
|
3
1
|
module Pikelet
|
4
2
|
class FieldDefinition
|
5
|
-
attr_reader :
|
3
|
+
attr_reader :index, :parser
|
6
4
|
|
7
|
-
def initialize(
|
8
|
-
@
|
9
|
-
|
10
|
-
@parser = parser
|
11
|
-
else
|
12
|
-
@parser = parser_from_type(type)
|
13
|
-
end
|
5
|
+
def initialize(index, &parser)
|
6
|
+
@index = index
|
7
|
+
@parser = parser || :strip.to_proc
|
14
8
|
end
|
15
9
|
|
16
10
|
def parse(text)
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
def parser_from_type(type)
|
23
|
-
case type
|
24
|
-
when :integer
|
25
|
-
:to_i.to_proc
|
26
|
-
when :overpunch
|
27
|
-
Proc.new { |value| Overpunch.parse(value) }
|
28
|
-
else
|
29
|
-
:strip.to_proc
|
30
|
-
end
|
11
|
+
parser.call(text[index])
|
31
12
|
end
|
32
13
|
end
|
33
14
|
end
|
@@ -10,9 +10,9 @@ module Pikelet
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
def field(name,
|
13
|
+
def field(name, index, &block)
|
14
14
|
@record_class = nil
|
15
|
-
field_definitions[name] = Pikelet::FieldDefinition.new(
|
15
|
+
field_definitions[name] = Pikelet::FieldDefinition.new(index, &block)
|
16
16
|
end
|
17
17
|
|
18
18
|
def record(type_signature, &block)
|
@@ -23,8 +23,8 @@ module Pikelet
|
|
23
23
|
record_class.new(*field_definitions.values.map { |field| field.parse(data) })
|
24
24
|
end
|
25
25
|
|
26
|
-
def method_missing(method, *args,
|
27
|
-
field(method, *args,
|
26
|
+
def method_missing(method, *args, &block)
|
27
|
+
field(method, *args, &block)
|
28
28
|
end
|
29
29
|
|
30
30
|
def record_class
|
data/lib/pikelet/version.rb
CHANGED
data/pikelet.gemspec
CHANGED
@@ -20,8 +20,6 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.required_ruby_version = '>= 2.0.0'
|
22
22
|
|
23
|
-
spec.add_runtime_dependency "overpunch"
|
24
|
-
|
25
23
|
spec.add_development_dependency "bundler", "~> 1.5"
|
26
24
|
spec.add_development_dependency "rake"
|
27
25
|
spec.add_development_dependency "rspec"
|
@@ -4,13 +4,12 @@ require "csv"
|
|
4
4
|
|
5
5
|
describe Pikelet::FieldDefinition do
|
6
6
|
let(:data) { "The quick brown fox" }
|
7
|
-
let(:
|
8
|
-
let(:definition) { Pikelet::FieldDefinition.new(indices, type: type) }
|
7
|
+
let(:definition) { Pikelet::FieldDefinition.new(index) }
|
9
8
|
|
10
9
|
subject(:value) { definition.parse(data) }
|
11
10
|
|
12
11
|
describe "for a fixed-width field" do
|
13
|
-
let(:
|
12
|
+
let(:index) { 4...9 }
|
14
13
|
|
15
14
|
it "extracts the field content from the data" do
|
16
15
|
expect(value).to eq "quick"
|
@@ -18,54 +17,26 @@ describe Pikelet::FieldDefinition do
|
|
18
17
|
end
|
19
18
|
|
20
19
|
describe "given whitespace" do
|
21
|
-
let(:
|
20
|
+
let(:index) { 3...16 }
|
22
21
|
|
23
22
|
it "strips leading and trailing whitespace" do
|
24
23
|
expect(value).to eq "quick brown"
|
25
24
|
end
|
26
25
|
end
|
27
26
|
|
28
|
-
describe "with multiple indices" do
|
29
|
-
let(:indices) { [ 0...4, 16...19 ] }
|
30
|
-
|
31
|
-
it "joins the sections together" do
|
32
|
-
expect(value).to eq "The fox"
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
27
|
describe "given a CSV row" do
|
37
|
-
let(:data)
|
38
|
-
let(:
|
28
|
+
let(:data) { CSV.parse("The,quick,brown,fox").first }
|
29
|
+
let(:index) { 2 }
|
39
30
|
|
40
31
|
it "extracts the field" do
|
41
32
|
expect(value).to eq "brown"
|
42
33
|
end
|
43
34
|
end
|
44
35
|
|
45
|
-
describe "for integer fields" do
|
46
|
-
let(:data) { "xx326xx" }
|
47
|
-
let(:indices) { [ 2...5] }
|
48
|
-
let(:type) { :integer }
|
49
|
-
|
50
|
-
it "converts the value to an integer" do
|
51
|
-
expect(value).to eq 326
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
describe "for overpunch fields" do
|
56
|
-
let(:data) { "xx67Kxx" }
|
57
|
-
let(:indices) { [ 2...5] }
|
58
|
-
let(:type) { :overpunch }
|
59
|
-
|
60
|
-
it "converts the value to an integer" do
|
61
|
-
expect(value).to eq -672
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
36
|
describe "given a parser block" do
|
66
|
-
let(:
|
37
|
+
let(:index) { 4...9 }
|
67
38
|
let(:definition) do
|
68
|
-
Pikelet::FieldDefinition.new(
|
39
|
+
Pikelet::FieldDefinition.new(index) { |value| value.reverse }
|
69
40
|
end
|
70
41
|
|
71
42
|
it "yields the value to the parser" do
|
@@ -74,9 +45,9 @@ describe Pikelet::FieldDefinition do
|
|
74
45
|
end
|
75
46
|
|
76
47
|
describe "given a symbol for the parser block" do
|
77
|
-
let(:
|
48
|
+
let(:index) { 4...9 }
|
78
49
|
let(:definition) do
|
79
|
-
Pikelet::FieldDefinition.new(
|
50
|
+
Pikelet::FieldDefinition.new(index, &:upcase)
|
80
51
|
end
|
81
52
|
|
82
53
|
it "invokes the named method on the value" do
|
data/spec/pikelet_spec.rb
CHANGED
@@ -114,10 +114,10 @@ describe Pikelet do
|
|
114
114
|
its(:last) { is_expected.to match_hash(name: "Sue", number: "087654321", type_signature: "FANCY") }
|
115
115
|
end
|
116
116
|
|
117
|
-
describe "given
|
117
|
+
describe "given a block for field parsing" do
|
118
118
|
let(:definition) do
|
119
119
|
Pikelet.define do
|
120
|
-
value
|
120
|
+
value(0...4) { |value| value.to_i }
|
121
121
|
end
|
122
122
|
end
|
123
123
|
|
@@ -132,24 +132,6 @@ describe Pikelet do
|
|
132
132
|
its(:value) { is_expected.to eq 5637 }
|
133
133
|
end
|
134
134
|
|
135
|
-
describe "given overpunch fields" do
|
136
|
-
let(:definition) do
|
137
|
-
Pikelet.define do
|
138
|
-
value(0...4) { |value| Overpunch.parse(value) }
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
let(:data) do
|
143
|
-
<<-FILE.gsub(/^\s*/, "").split(/[\r\n]+/)
|
144
|
-
563J
|
145
|
-
FILE
|
146
|
-
end
|
147
|
-
|
148
|
-
subject { records.first }
|
149
|
-
|
150
|
-
its(:value) { is_expected.to eq -5631 }
|
151
|
-
end
|
152
|
-
|
153
135
|
describe "given a block when parsing" do
|
154
136
|
let(:collected_records) { [] }
|
155
137
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pikelet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Carney
|
@@ -10,20 +10,6 @@ bindir: bin
|
|
10
10
|
cert_chain: []
|
11
11
|
date: 2014-07-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: overpunch
|
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
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: bundler
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|