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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b08f706b9dfcb52105cbcbafdb725cca95db84fc
4
- data.tar.gz: 0a4362f589115d5b7fc082322b9d419f68e62c0a
3
+ metadata.gz: dacccea06922299a0d633783508e02e9ecdffb5c
4
+ data.tar.gz: 60844ae6f649d78df19fc3a3104a1e8270869ccb
5
5
  SHA512:
6
- metadata.gz: db9ac7654c8a926801bde9f537b36990b7d9560477eae190116b1ab24fe6915b0d44e0abe48357a25497bba512c3d555e6c4c6d3c4a5a260d750963183350843
7
- data.tar.gz: 44e690c9a0913d61bc7a77df2ec460e4ee38479425c166fd6c24ab657699650ee511927829638bd723309487551e03932b1b21b52fc35052619803f5bf66f5d9
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 :indices, :parser
3
+ attr_reader :index, :parser
6
4
 
7
- def initialize(indices, type: nil, &parser)
8
- @indices = indices
9
- if block_given?
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
- @parser.call(indices.map { |index| text[index] }.join)
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, *indices, type: nil, &block)
13
+ def field(name, index, &block)
14
14
  @record_class = nil
15
- field_definitions[name] = Pikelet::FieldDefinition.new(indices, type: type, &block)
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, **options, &block)
27
- field(method, *args, **options, &block)
26
+ def method_missing(method, *args, &block)
27
+ field(method, *args, &block)
28
28
  end
29
29
 
30
30
  def record_class
@@ -1,3 +1,3 @@
1
1
  module Pikelet
2
- VERSION = "0.1.0"
2
+ VERSION = "1.0.0"
3
3
  end
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(:type) { nil }
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(:indices) { [ 4...9 ] }
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(:indices) { [ 3...16 ] }
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) { CSV.parse("The,quick,brown,fox").first }
38
- let(:indices) { [ 2 ] }
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(:indices) { [ 4...9] }
37
+ let(:index) { 4...9 }
67
38
  let(:definition) do
68
- Pikelet::FieldDefinition.new(indices) { |value| value.reverse }
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(:indices) { [ 4...9] }
48
+ let(:index) { 4...9 }
78
49
  let(:definition) do
79
- Pikelet::FieldDefinition.new(indices, &:upcase)
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 integer fields" do
117
+ describe "given a block for field parsing" do
118
118
  let(:definition) do
119
119
  Pikelet.define do
120
- value 0...4, &:to_i
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: 0.1.0
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