pikelet 2.0.0.beta.1 → 2.0.0.beta.2

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: 580f25b1ccc1b345208d99f759cbca4d42e86933
4
- data.tar.gz: 6e333e33e68c71825143a2b393c0376f20f35c5f
3
+ metadata.gz: 38ba6a85d7364f3d8a5b93bb24cc8d64bac5de91
4
+ data.tar.gz: e6e9e5e60b8ac35c8669fa992327ee422d3871f6
5
5
  SHA512:
6
- metadata.gz: cd176128b19db2521917463563b00e5e6ca4caefd8086be747ae24b6ee36f80273690e33fcbe36879cfc9e9afd327dd4e65415d35554cf420fa234b7f9cd8166
7
- data.tar.gz: 6ad11890c1fb69fc6c3641faeba9183b71a13153a350466df873ba37a12abbd27c46866a651198d0d41e28061c47d111a9e1b4035c90619ba526eaf9dd1a3ff9
6
+ metadata.gz: b0a0c5500a5f72c17735608a678f78fbdd9c433c086be1875e1077d11da3e2463c3704cf75621f4a4c6ff569e8ea8873d82bd26d06f4042ee47b8b9a68a83c08
7
+ data.tar.gz: e65c43af74592ffe8462c91dab56abc0d67bbb82880ba227b0342f3ea542827686653dadbf46873dc244a2e0d55313c5d23e5daf821ce78f200ea62e2ead15ab
@@ -1,23 +1,25 @@
1
1
  module Pikelet
2
2
  class FieldDefinition
3
- attr_reader :index, :parser, :width
3
+ attr_reader :index, :parser, :formatter, :padding, :alignment, :width
4
4
 
5
- def initialize(index, parse: nil, &block)
5
+ def initialize(index, parse: nil, format: nil, pad: nil, align: nil, &block)
6
6
  raise ArgumentError, "index must be a range" unless index.is_a? Range
7
7
  @index = index
8
8
  @width = index.size
9
9
  @parser = parse || block || :strip
10
- @parser = @parser.to_proc unless @parser.respond_to? :call
10
+ @formatter = format || :to_s
11
+ @padding = pad && pad.to_s || " "
12
+ @alignment = align || :left
11
13
  end
12
14
 
13
15
  def parse(record)
14
16
  if value = record[index]
15
- parser.call(value)
17
+ parser.to_proc.call(value)
16
18
  end
17
19
  end
18
20
 
19
21
  def format(value)
20
- pad(truncate(value))
22
+ pad(truncate(formatter.to_proc.call(value)))
21
23
  end
22
24
 
23
25
  def insert(value, record)
@@ -27,12 +29,20 @@ module Pikelet
27
29
 
28
30
  private
29
31
 
32
+ def blank
33
+ @blank ||= padding * width
34
+ end
35
+
30
36
  def truncate(value)
31
- value.to_s[0...width]
37
+ value[0...width]
32
38
  end
33
39
 
34
40
  def pad(value)
35
- (" " * (width - value.size)) + value
41
+ if alignment == :left
42
+ value + blank[value.size...width]
43
+ else
44
+ blank[-width..-(1+value.size)] + value
45
+ end
36
46
  end
37
47
  end
38
48
  end
@@ -1,3 +1,3 @@
1
1
  module Pikelet
2
- VERSION = "2.0.0.beta.1"
2
+ VERSION = "2.0.0.beta.2"
3
3
  end
@@ -3,9 +3,26 @@ require "pikelet"
3
3
  require "csv"
4
4
 
5
5
  describe Pikelet::FieldDefinition do
6
+ let(:parser) { { } }
7
+ let(:formatter) { { } }
8
+ let(:padding) { { } }
9
+ let(:alignment) { { } }
10
+ let(:block) { nil }
11
+ let(:definition) { Pikelet::FieldDefinition.new(index, **parser, **formatter, **padding, **alignment, &block) }
12
+
13
+ describe "defaults" do
14
+ let(:index) { 0...1 }
15
+
16
+ subject { definition }
17
+
18
+ its(:parser) { is_expected.to eq :strip }
19
+ its(:formatter) { is_expected.to eq :to_s }
20
+ its(:padding) { is_expected.to eq " " }
21
+ its(:alignment) { is_expected.to eq :left }
22
+ end
23
+
6
24
  describe "#parse" do
7
25
  let(:data) { "The quick brown fox" }
8
- let(:definition) { Pikelet::FieldDefinition.new(index) }
9
26
 
10
27
  subject(:parsed) { definition.parse(data) }
11
28
 
@@ -26,38 +43,38 @@ describe Pikelet::FieldDefinition do
26
43
  end
27
44
 
28
45
  context "given a custom parser" do
29
- let(:parser) { ->(value) { value } }
46
+ let(:block_parser) { ->(value) { value } }
30
47
 
31
48
  before do
32
- allow(parser).to receive(:call)
49
+ allow(block_parser).to receive(:call).and_call_original
33
50
  parsed
34
51
  end
35
52
 
36
53
  context "as a block" do
37
- let(:index) { 4...9 }
38
- let(:definition) { Pikelet::FieldDefinition.new(index, &parser) }
54
+ let(:index) { 4...9 }
55
+ let(:block) { block_parser }
39
56
 
40
57
  it "yields the value to the parser" do
41
- expect(parser).to have_received(:call).with("quick")
58
+ expect(block_parser).to have_received(:call).with("quick")
42
59
  end
43
60
  end
44
61
 
45
62
  context "as a parse option" do
46
- let(:index) { 10...15 }
47
- let(:definition) { Pikelet::FieldDefinition.new(index, parse: parser) }
63
+ let(:index) { 10...15 }
64
+ let(:parser) { { parse: block_parser } }
48
65
 
49
66
  it "yields the value to the parser" do
50
- expect(parser).to have_received(:call).with("brown")
67
+ expect(block_parser).to have_received(:call).with("brown")
51
68
  end
52
69
  end
53
70
  end
54
71
 
55
72
  context "given a shorthand parser" do
56
- let(:parser) { :upcase }
73
+ let(:symbol_parser) { :upcase }
57
74
 
58
75
  context "as a block" do
59
- let(:index) { 10...15 }
60
- let(:definition) { Pikelet::FieldDefinition.new(index, &parser) }
76
+ let(:index) { 10...15 }
77
+ let(:block) { symbol_parser }
61
78
 
62
79
  it "invokes the named method on the value" do
63
80
  expect(parsed).to eq "BROWN"
@@ -65,8 +82,8 @@ describe Pikelet::FieldDefinition do
65
82
  end
66
83
 
67
84
  context "as a parse option" do
68
- let(:index) { 4...9 }
69
- let(:definition) { Pikelet::FieldDefinition.new(index, parse: parser) }
85
+ let(:index) { 4...9 }
86
+ let(:parser) { { parse: symbol_parser } }
70
87
 
71
88
  it "invokes the named method on the value" do
72
89
  expect(parsed).to eq "QUICK"
@@ -87,7 +104,6 @@ describe Pikelet::FieldDefinition do
87
104
  let(:index) { 4...9 }
88
105
  let(:record) { "The _____ brown fox" }
89
106
  let(:value) { "quick" }
90
- let(:definition) { Pikelet::FieldDefinition.new(index) }
91
107
 
92
108
  subject(:result) { definition.insert(value, record) }
93
109
 
@@ -106,34 +122,106 @@ describe Pikelet::FieldDefinition do
106
122
  end
107
123
 
108
124
  describe "#format" do
109
- let(:index) { 4...9 }
110
-
111
125
  subject(:formatted) { definition.format(value) }
112
126
 
113
- context "with the default formatter" do
114
- let(:definition) { Pikelet::FieldDefinition.new(index) }
127
+ describe "truncation" do
128
+ let(:index) { 4...9 }
115
129
 
116
130
  context "given a value that fits the field exactly" do
117
131
  let(:value) { "quick" }
118
132
 
119
- it "returns the value" do
120
- expect(formatted).to eq "quick"
133
+ it "does not truncate the value" do
134
+ expect(formatted).to eq value
121
135
  end
122
136
  end
123
137
 
124
- context "given a value larger than the field" do
125
- let(:value) { "quickk" }
138
+ context "given a value that overflows the field" do
139
+ let(:value) { "12345678" }
126
140
 
127
141
  it "truncates the value" do
128
- expect(formatted).to eq "quick"
142
+ expect(formatted).to eq value[0...5]
143
+ end
144
+ end
145
+ end
146
+
147
+ describe "given a custom formatter" do
148
+ let(:index) { 4...5 }
149
+ let(:block_formatter) { ->(value) { value } }
150
+ let(:formatter) { { format: block_formatter} }
151
+ let(:value) { "brown" }
152
+
153
+ before do
154
+ allow(block_formatter).to receive(:call).and_call_original
155
+ formatted
156
+ end
157
+
158
+ it "yields the raw value to the formatter" do
159
+ expect(block_formatter).to have_received(:call).with("brown")
160
+ end
161
+ end
162
+
163
+ describe "using a shorthand formatter" do
164
+ let(:index) { 4...9 }
165
+ let(:formatter) { { format: :upcase } }
166
+ let(:value) { "brown" }
167
+
168
+ it "invokes the named method on the raw value" do
169
+ expect(formatted).to eq "BROWN"
170
+ end
171
+ end
172
+
173
+ describe "padding & alignment" do
174
+ let(:index) { 3...7 }
175
+
176
+ context "given a value that fits the field exactly" do
177
+ let(:value) { "1234" }
178
+
179
+ it "does not pad the field" do
180
+ expect(formatted).to eq value
129
181
  end
130
182
  end
131
183
 
132
- context "givem a value smaller than the field" do
133
- let(:value) { "quik" }
184
+ context "given a value that underflows the field" do
185
+ let(:value) { "12" }
186
+
187
+ context "with left alignment" do
188
+ let(:alignment) { { align: :left } }
189
+
190
+ context "with single-character padding" do
191
+ let(:padding) { { pad: '-' } }
192
+
193
+ it "pads the field on the right" do
194
+ expect(formatted).to eq "12--"
195
+ end
196
+ end
197
+
198
+ context "with multi-character padding" do
199
+ let(:padding) { { pad: '<->' } }
200
+
201
+ it "pads the field on the right" do
202
+ expect(formatted).to eq "12><"
203
+ end
204
+ end
205
+ end
206
+
207
+ context "with right alignment" do
208
+ let(:alignment) { { align: :right } }
209
+
210
+ context "with single-character padding" do
211
+ let(:padding) { { pad: '-' } }
212
+
213
+ it "pads the field on the left" do
214
+ expect(formatted).to eq "--12"
215
+ end
216
+ end
217
+
218
+ context "with multi-character padding" do
219
+ let(:padding) { { pad: '<->' } }
134
220
 
135
- it "pads the the value with spaces at the left" do
136
- expect(formatted).to eq " quik"
221
+ it "pads the field on the left" do
222
+ expect(formatted).to eq "><12"
223
+ end
224
+ end
137
225
  end
138
226
  end
139
227
  end
data/spec/pikelet_spec.rb CHANGED
@@ -39,8 +39,8 @@ describe Pikelet do
39
39
 
40
40
  it { is_expected.to have(2).lines }
41
41
 
42
- its(:first) { is_expected.to eq "NAME NicolausCopernicus " }
43
- its(:last) { is_expected.to eq "ADDR 123 South Street Nowhereville 45678Y Someplace" }
42
+ its(:first) { is_expected.to eq "NAMENicolaus Copernicus " }
43
+ its(:last) { is_expected.to eq "ADDR123 South Street Nowhereville 45678Y Someplace " }
44
44
  end
45
45
 
46
46
  describe "#parse" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pikelet
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.beta.1
4
+ version: 2.0.0.beta.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Carney
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-18 00:00:00.000000000 Z
11
+ date: 2015-02-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler