pikelet 2.0.0.beta.4 → 2.0.0.beta.5
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/lib/pikelet/file_definition.rb +24 -13
- data/lib/pikelet/record_definer.rb +7 -13
- data/lib/pikelet/record_definition.rb +6 -15
- data/lib/pikelet/version.rb +1 -1
- data/lib/pikelet.rb +2 -2
- data/spec/pikelet/record_definer_spec.rb +0 -29
- data/spec/pikelet/record_definition_spec.rb +1 -27
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f1dcc5a3b20d8e3277715f1841f88ea4dc22839c
|
4
|
+
data.tar.gz: a7526777b26bc21e7966fc7e1386083fe3630aac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8f7957af9756008020b857e9ad2eb7e5e6c3474315900c55536babe8c685f6c596d2d798c1af2c597f5c30d34172b267aa4f68649dfed21c2b928f73805fc281
|
7
|
+
data.tar.gz: 275f4b314132e74d5cd74a73c32f78264d34f13cad6f286dc7a929d299f55fac5affeb040103d796ae98dde138e7d56672889203787fd88e52db8fb592f31d4d
|
@@ -1,15 +1,16 @@
|
|
1
1
|
module Pikelet
|
2
2
|
class FileDefinition
|
3
|
-
attr_reader :
|
3
|
+
attr_reader :base, :signature_field
|
4
4
|
|
5
|
-
def initialize(record_class: nil, &block)
|
6
|
-
@
|
5
|
+
def initialize(signature_field: nil, record_class: nil, &block)
|
6
|
+
@signature_field = signature_field
|
7
|
+
definer = RecordDefiner.new(self, record_class: record_class)
|
8
|
+
@base = definer.define(&block)
|
7
9
|
end
|
8
10
|
|
9
|
-
def record(
|
10
|
-
|
11
|
-
|
12
|
-
record_definitions[type_signature] = definer.define(&block)
|
11
|
+
def record(signature, record_class: nil, base: nil, &block)
|
12
|
+
definer = RecordDefiner.new(self, record_class: record_class, base: base || self.base)
|
13
|
+
record_definitions[signature] = definer.define(&block)
|
13
14
|
end
|
14
15
|
|
15
16
|
def record_definitions
|
@@ -30,8 +31,12 @@ module Pikelet
|
|
30
31
|
|
31
32
|
private
|
32
33
|
|
34
|
+
def all_record_definitions
|
35
|
+
[ base, *record_definitions.values ]
|
36
|
+
end
|
37
|
+
|
33
38
|
def records_with_type_signatures
|
34
|
-
|
39
|
+
all_record_definitions.select(&:type_signature)
|
35
40
|
end
|
36
41
|
|
37
42
|
def type_signatures
|
@@ -39,12 +44,17 @@ module Pikelet
|
|
39
44
|
end
|
40
45
|
|
41
46
|
def best_definition(signatures)
|
42
|
-
signatures.map { |sig| record_definitions[sig] }.detect { |d| d } ||
|
47
|
+
signatures.map { |sig| record_definitions[sig] }.detect { |d| d } || base
|
48
|
+
end
|
49
|
+
|
50
|
+
def record_signature(record)
|
51
|
+
field = signature_field || (all_record_definitions.detect(&:signature_field) && :type_signature)
|
52
|
+
record.send(field) if record.respond_to?(field)
|
43
53
|
end
|
44
54
|
|
45
55
|
def format_record(record, width:)
|
46
|
-
|
47
|
-
|
56
|
+
definition = record_definitions[record_signature(record)] || base
|
57
|
+
definition.format(record, width: width)
|
48
58
|
end
|
49
59
|
|
50
60
|
def parse_records(data, &block)
|
@@ -56,12 +66,13 @@ module Pikelet
|
|
56
66
|
end
|
57
67
|
|
58
68
|
def signature_fields
|
59
|
-
|
69
|
+
all_record_definitions.map(&:signature_field).compact.uniq
|
60
70
|
end
|
61
71
|
|
62
72
|
def parse_record(data)
|
63
73
|
signatures = signature_fields.lazy.map { |field| field.parse(data) }
|
64
|
-
|
74
|
+
definition = signatures.map { |sig| record_definitions[sig] }.detect { |defn| defn } || base
|
75
|
+
definition.parse(data)
|
65
76
|
end
|
66
77
|
end
|
67
78
|
end
|
@@ -2,9 +2,12 @@ module Pikelet
|
|
2
2
|
class RecordDefiner
|
3
3
|
attr_reader :file_definition, :definition
|
4
4
|
|
5
|
-
def initialize(file_definition, record_class: nil,
|
5
|
+
def initialize(file_definition, record_class: nil, base: nil)
|
6
6
|
@file_definition = file_definition
|
7
|
-
@definition = RecordDefinition.new(file_definition,
|
7
|
+
@definition = RecordDefinition.new(file_definition,
|
8
|
+
record_class: record_class,
|
9
|
+
base: base
|
10
|
+
)
|
8
11
|
end
|
9
12
|
|
10
13
|
def define(&block)
|
@@ -18,17 +21,8 @@ module Pikelet
|
|
18
21
|
definition.field(name, index, **options, &block)
|
19
22
|
end
|
20
23
|
|
21
|
-
def
|
22
|
-
|
23
|
-
field(:type_signature, field_or_index, **options, &block)
|
24
|
-
definition.type_signature = :type_signature
|
25
|
-
else
|
26
|
-
definition.type_signature = field_or_index
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def record(type_signature, record_class: nil, &block)
|
31
|
-
file_definition.record(type_signature, record_class: record_class, base_definition: definition, &block)
|
24
|
+
def record(signature, record_class: nil, &block)
|
25
|
+
file_definition.record(signature, record_class: record_class, base: definition, &block)
|
32
26
|
end
|
33
27
|
|
34
28
|
def method_missing(method, *args, **options, &block)
|
@@ -3,11 +3,10 @@ require "pikelet/record_definer"
|
|
3
3
|
module Pikelet
|
4
4
|
class RecordDefinition
|
5
5
|
attr_reader :file_definition, :field_definitions
|
6
|
-
attr_writer :type_signature
|
7
6
|
|
8
|
-
def initialize(file_definition, record_class: nil,
|
7
|
+
def initialize(file_definition, record_class: nil, base:)
|
9
8
|
@file_definition = file_definition
|
10
|
-
@field_definitions =
|
9
|
+
@field_definitions = base && base.field_definitions.dup || {}
|
11
10
|
@record_class = record_class
|
12
11
|
end
|
13
12
|
|
@@ -15,17 +14,6 @@ module Pikelet
|
|
15
14
|
field_definitions[name] = Pikelet::FieldDefinition.new(index, **options, &block)
|
16
15
|
end
|
17
16
|
|
18
|
-
def type_signature
|
19
|
-
unless defined? @type_signature
|
20
|
-
@type_signature = :type_signature if field_definitions.key? :type_signature
|
21
|
-
end
|
22
|
-
@type_signature
|
23
|
-
end
|
24
|
-
|
25
|
-
def signature_field
|
26
|
-
type_signature && field_definitions[type_signature]
|
27
|
-
end
|
28
|
-
|
29
17
|
def parse(data)
|
30
18
|
record_class.new(parse_fields(data))
|
31
19
|
end
|
@@ -44,7 +32,6 @@ module Pikelet
|
|
44
32
|
def default_record_class
|
45
33
|
Struct.new(*field_names) do
|
46
34
|
def initialize(**attributes)
|
47
|
-
# FIXME: Do we need to worry about missing attributes?
|
48
35
|
super(*attributes.values_at(*self.class.members))
|
49
36
|
end
|
50
37
|
end
|
@@ -54,6 +41,10 @@ module Pikelet
|
|
54
41
|
field_definitions.values.map { |d| d.index.max }.max + 1
|
55
42
|
end
|
56
43
|
|
44
|
+
def signature_field
|
45
|
+
field_definitions[file_definition.signature_field || :type_signature]
|
46
|
+
end
|
47
|
+
|
57
48
|
private
|
58
49
|
|
59
50
|
def field_names
|
data/lib/pikelet/version.rb
CHANGED
data/lib/pikelet.rb
CHANGED
@@ -4,7 +4,7 @@ require "pikelet/record_definition"
|
|
4
4
|
require "pikelet/field_definition"
|
5
5
|
|
6
6
|
module Pikelet
|
7
|
-
def self.define(record_class: nil, &block)
|
8
|
-
Pikelet::FileDefinition.new(record_class: record_class, &block)
|
7
|
+
def self.define(signature_field: nil, record_class: nil, &block)
|
8
|
+
Pikelet::FileDefinition.new(signature_field: signature_field, record_class: record_class, &block)
|
9
9
|
end
|
10
10
|
end
|
@@ -4,34 +4,5 @@ require "pikelet"
|
|
4
4
|
describe Pikelet::RecordDefiner do
|
5
5
|
let(:definer) { described_class.new(nil) }
|
6
6
|
let(:definition) { definer.definition }
|
7
|
-
|
8
|
-
describe "#type_signature" do
|
9
|
-
context "given a field name" do
|
10
|
-
before do
|
11
|
-
allow(definition).to receive(:type_signature=).and_call_original
|
12
|
-
definer.type_signature :type
|
13
|
-
end
|
14
|
-
|
15
|
-
it "sets the type signature field on the record definition" do
|
16
|
-
expect(definition).to have_received(:type_signature=).with(:type)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
context "legacy usage" do
|
21
|
-
before do
|
22
|
-
allow(definition).to receive(:type_signature=).and_call_original
|
23
|
-
allow(definer).to receive(:field).and_call_original
|
24
|
-
definer.type_signature 0...4, align: :right, pad: "0", &:to_i
|
25
|
-
end
|
26
|
-
|
27
|
-
it "creates the field" do
|
28
|
-
expect(definer).to have_received(:field).with(:type_signature, 0...4, align: :right, pad: "0", &:to_i)
|
29
|
-
end
|
30
|
-
|
31
|
-
it "sets the type signature field on the record definition" do
|
32
|
-
expect(definition).to have_received(:type_signature=).with(:type_signature)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
7
|
end
|
37
8
|
|
@@ -2,7 +2,7 @@ require "spec_helper"
|
|
2
2
|
require "pikelet"
|
3
3
|
|
4
4
|
describe Pikelet::RecordDefinition do
|
5
|
-
let(:definer) { Pikelet::RecordDefiner.new(nil,
|
5
|
+
let(:definer) { Pikelet::RecordDefiner.new(nil, base: nil) }
|
6
6
|
|
7
7
|
let(:data) { "Hello world" }
|
8
8
|
|
@@ -21,32 +21,6 @@ describe Pikelet::RecordDefinition do
|
|
21
21
|
it { is_expected.to eq "Hello world" }
|
22
22
|
end
|
23
23
|
|
24
|
-
describe "#type_signature" do
|
25
|
-
let(:definition) { described_class.new(nil, base_definition: nil) }
|
26
|
-
|
27
|
-
subject { definition }
|
28
|
-
|
29
|
-
context "with no fields and no signature defined" do
|
30
|
-
its(:type_signature) { is_expected.to be_nil }
|
31
|
-
end
|
32
|
-
|
33
|
-
context "with signature defined" do
|
34
|
-
before do
|
35
|
-
definition.type_signature = :type
|
36
|
-
end
|
37
|
-
|
38
|
-
its(:type_signature) { is_expected.to eq :type }
|
39
|
-
end
|
40
|
-
|
41
|
-
context "with a field named :type_signature" do
|
42
|
-
before do
|
43
|
-
definition.field(:type_signature, 0...3)
|
44
|
-
end
|
45
|
-
|
46
|
-
its(:type_signature) { is_expected.to eq :type_signature }
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
24
|
describe "#width" do
|
51
25
|
subject(:width) { definition.width }
|
52
26
|
|
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.
|
4
|
+
version: 2.0.0.beta.5
|
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-
|
11
|
+
date: 2015-02-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|