pikelet 0.1.0 → 1.0.0

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