palletjack 0.3.0 → 0.4.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: aa38de4b29c6cceadd2fecc3e88e74f041eccfef
4
- data.tar.gz: 1532f5e70753e10d7cd08497426ca23d5384de21
3
+ metadata.gz: f14f5c45a068c34bf0fc6444ec9b05ce81f26397
4
+ data.tar.gz: 3eadcf8f4243fca26d2f7bac66eb0822c8b7543f
5
5
  SHA512:
6
- metadata.gz: c3b79c7b5762b97e7ab13c1149f087e7e0267fa5af90fcd19a6511948cafa2651f237989da3c9f1a16c50a32d78c5b91c564239bb94e7c26f5981ad66fd1ddc5
7
- data.tar.gz: 0d74674d2e2394365658cb8ac8a005ab52e877c651cf6ed5f34b38d8f5db5c989ce1c3f6a73088a1e397177131a5f146ac76f1d027bb95c432509179d4b68562
6
+ metadata.gz: a9c5a9585753b2bc53a007063ac4e9562419fb44d060220ba5a7e3e557391ad99600e4d0738402c8f3fa32311e6ea60402e29cb7636185ce40ea8bfca7af6940
7
+ data.tar.gz: 3b7044a659bd1cd171095d9a2faf5041c56c70f0026ec219b7b374bb18dd66c9c42180aacab3c4cd4c69d8065de5837d000c0647bbfc7ee3680d35ee128894f5
checksums.yaml.gz.sig CHANGED
Binary file
@@ -1,3 +1,5 @@
1
+ require 'traceable'
2
+
1
3
  class PalletJack
2
4
  class KeyTransformer
3
5
  class Reader < KeyTransformer
@@ -251,6 +253,11 @@ class PalletJack
251
253
  if self.respond_to?(transform.to_sym) then
252
254
  if new_value = self.send(transform.to_sym, param, context)
253
255
  then
256
+ new_value = TraceableString.new(new_value)
257
+ new_value.file = transform.file
258
+ new_value.line = transform.line
259
+ new_value.column = transform.column
260
+ new_value.byte = transform.byte
254
261
  pallet[key] = new_value
255
262
  break
256
263
  end
@@ -1,4 +1,5 @@
1
1
  require 'palletjack/pallet/identity'
2
+ require 'traceable'
2
3
 
3
4
  class PalletJack < KVDAG
4
5
  # PalletJack managed pallet of key boxes inside a warehouse.
@@ -38,7 +39,8 @@ class PalletJack < KVDAG
38
39
  filestat = File.lstat(filepath)
39
40
  case
40
41
  when (filestat.file? and file =~ /\.yaml$/)
41
- merge!(YAML::load_file(filepath))
42
+ merge!(TraceableYAML::load_file(filepath,
43
+ filepath.sub(@identity.warehouse, '')[1..-1]))
42
44
  boxes << file
43
45
  when filestat.symlink?
44
46
  link = File.readlink(filepath)
@@ -1,5 +1,5 @@
1
1
  require 'kvdag'
2
2
 
3
3
  class PalletJack < KVDAG
4
- VERSION = "0.3.0"
4
+ VERSION = "0.4.0"
5
5
  end
data/lib/palletjack.rb CHANGED
@@ -4,6 +4,7 @@ require 'kvdag'
4
4
  require 'palletjack/version'
5
5
  require 'palletjack/keytransformer'
6
6
  require 'palletjack/pallet'
7
+ require 'traceable'
7
8
 
8
9
  class PalletJack < KVDAG
9
10
  attr_reader :warehouse
@@ -23,7 +24,7 @@ class PalletJack < KVDAG
23
24
 
24
25
  def load(warehouse)
25
26
  @warehouse = File.expand_path(warehouse)
26
- key_transforms = YAML::load_file(File.join(@warehouse, "transforms.yaml"))
27
+ key_transforms = TraceableYAML::load_file(File.join(@warehouse, 'transforms.yaml'), 'transforms.yaml')
27
28
  @keytrans_reader = KeyTransformer::Reader.new(key_transforms)
28
29
  @keytrans_writer = KeyTransformer::Writer.new(key_transforms)
29
30
 
data/lib/traceable.rb ADDED
@@ -0,0 +1,217 @@
1
+ require 'psych'
2
+
3
+ # Read YAML files and remember where each value came from.
4
+ #
5
+ # Objects behave like normal in most respects. Objects that implement
6
+ # Traceable can be asked for their position by calling file(), line(),
7
+ # column() and byte().
8
+ #
9
+ # If the class attribute TraceableString.debug is set, +inspect+ and
10
+ # +to_yaml+ output position information for each atom, in the case of
11
+ # +to_yaml+ separated from its value by the string " =^.^= ".
12
+ #
13
+ # Example:
14
+ #
15
+ # yaml = "---
16
+ # foo:
17
+ # bar: 1
18
+ # baz:
19
+ # - gazonk
20
+ # - foobar"
21
+ # handler = PositionHandler.new("<STDIN>")
22
+ # parser = Psych::Parser.new(handler)
23
+ # handler.parser = parser
24
+ # parser.parse(yaml)
25
+ # visitor = PositionVisitor.new
26
+ # tree = visitor.accept(handler.root)
27
+ #
28
+ # tree[0]['foo']['bar']
29
+ # => "1"
30
+ # tree[0]['foo']['bar'].file
31
+ # => "<STDIN>"
32
+ # tree[0]['foo']['bar'].line
33
+ # => 3
34
+ # tree[0]['foo']['bar'].column
35
+ # => 2
36
+ #
37
+ # puts tree[0].to_yaml
38
+ # ---
39
+ # foo:
40
+ # bar: 1
41
+ # baz:
42
+ # - gazonk
43
+ # - foobar
44
+ #
45
+ # TraceableString.debug = true
46
+ # puts tree[0].to_yaml.gsub(' =^.^= ', ' # ')
47
+ # ---
48
+ # foo # <STDIN> (line 1, column 4):
49
+ # bar # <STDIN> (line 2, column 6): 1 # <STDIN> (line 3, column 2)
50
+ # baz # <STDIN> (line 3, column 6):
51
+ # - gazonk # <STDIN> (line 5, column 4)
52
+ # - foobar # <STDIN> (line 6, column 0)
53
+
54
+ # Attributes required to trace the origin of a value.
55
+ module Traceable
56
+ attr_accessor :file
57
+ attr_accessor :byte
58
+ attr_accessor :line
59
+ attr_accessor :column
60
+ end
61
+
62
+ # A string that remembers the source of its value, and can output it
63
+ # again when serialised to YAML.
64
+ class TraceableString < String
65
+ include Traceable
66
+
67
+ def encode_with(coder)
68
+ coder.tag = nil
69
+ coder.scalar = self.to_str
70
+ if debug?
71
+ # LibYAML, the C YAML library which underlies Ruby's Psych
72
+ # library, does not handle comments at all. The parser ignores
73
+ # them and the emitter cannot write them. Thus, to output the
74
+ # sourcing information in a manner that is at least semi-sane,
75
+ # we need to put it in the actual value, behind some sort of
76
+ # separator.
77
+ #
78
+ # The separator needs to be representable in Latin-1, otherwise
79
+ # LibYAML quotes it. It needs to be non-breaking, otherwise
80
+ # LibYAML will break here to wrap at 80 characters. It cannot
81
+ # have any special meaning in YAML (including the quote
82
+ # character), otherwise LibYAML quotes it. It shouldn't appear
83
+ # in real data, sine we'll need to substitute all instances of
84
+ # it.
85
+ #
86
+ # Also, I like cats, even ASCII ones.
87
+ coder.scalar += " =^.^= #{@file} (line #{@line}, column #{@column})"
88
+ end
89
+ end
90
+
91
+ def inspect
92
+ if debug?
93
+ "\"%s\" (%s, line: %i, col: %i, byte: %i)" %
94
+ [self.to_str, @file, @line, @column, @byte]
95
+ else
96
+ super
97
+ end
98
+ end
99
+
100
+ def self.debug=(maybe)
101
+ @@debug = maybe
102
+ end
103
+
104
+ def self.debug
105
+ @@debug ||= false
106
+ end
107
+
108
+ private
109
+
110
+ def debug?
111
+ self.class.debug
112
+ end
113
+ end
114
+
115
+ # Make the nodes in Psych's YAML parse tree track their positions.
116
+ class Psych::Nodes::Node
117
+ include Traceable
118
+ end
119
+
120
+ # Extend the parser to remember the position of each object.
121
+ class PositionHandler < Psych::TreeBuilder
122
+
123
+ # The handler needs access to the parser in order to call mark
124
+ attr_accessor :parser
125
+
126
+ # +filename+ is the name of the source file the YAML structure will
127
+ # be parsed from. It is only copied into parsed objects, not
128
+ # interpreted.
129
+ def initialize(filename)
130
+ super()
131
+ @file = filename
132
+ end
133
+
134
+ # Copy a parser position from a +Psych::Parser::Mark+ to a parse
135
+ # tree node.
136
+ def record_position(node, mark)
137
+ node.extend Traceable
138
+ node.file = @file
139
+ node.byte = mark.index
140
+ node.line = mark.line
141
+ node.column = mark.column
142
+ node
143
+ end
144
+
145
+ def start_mapping(anchor, tag, implicit, style)
146
+ record_position(super, parser.mark)
147
+ end
148
+
149
+ def start_sequence(anchor, tag, implicit, style)
150
+ record_position(super, parser.mark)
151
+ end
152
+
153
+ def scalar(value, anchor, tag, plain, quoted, style)
154
+ record_position(super, parser.mark)
155
+ end
156
+ end
157
+
158
+ # Extend the Ruby structure builder to remeber each object's position.
159
+ class PositionVisitor < Psych::Visitors::ToRuby
160
+
161
+ # Copy a parser position from a parse tree node to a primitive
162
+ # object.
163
+ def record_position(s, o)
164
+ s.extend Traceable
165
+ s.file = o.file
166
+ s.byte = o.byte
167
+ s.line = o.line
168
+ s.column = o.column
169
+ s
170
+ end
171
+
172
+ def visit_Psych_Nodes_Scalar o
173
+ # Primitive YAML values can be either strings or integers. Ruby
174
+ # integers cannot be extended, so convert everything to strings
175
+ # before inserting position information.
176
+ record_position(TraceableString.new(String(super)), o)
177
+ end
178
+
179
+ def visit_Psych_Nodes_Sequence o
180
+ record_position(super, o)
181
+ end
182
+
183
+ def visit_Psych_Nodes_Mapping o
184
+ record_position(super, o)
185
+ end
186
+ end
187
+
188
+ module TraceableYAML
189
+
190
+ # Parse a YAML document from the string +doc+, tagging each value
191
+ # with the source +tag+, and return a Ruby object tree representing
192
+ # the result.
193
+ def self.parse(doc, tag)
194
+ handler = PositionHandler.new(tag)
195
+ parser = Psych::Parser.new(handler)
196
+ handler.parser = parser
197
+ parser.parse doc
198
+ if PositionVisitor.respond_to?(:create)
199
+ # Ruby 2.1 and above
200
+ visitor = PositionVisitor.create
201
+ else
202
+ # Ruby 2.0
203
+ visitor = PositionVisitor.new
204
+ end
205
+ tree = visitor.accept(handler.root)
206
+ tree[0]
207
+ end
208
+
209
+ # Load a YAML document from the file +path+, tagging each value with
210
+ # the source +tag+, and return a Ruby object tree representing the
211
+ # result.
212
+ def self.load_file(path, tag)
213
+ File.open(path) do |f|
214
+ parse(f.read, tag)
215
+ end
216
+ end
217
+ end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: palletjack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Calle Englund
@@ -31,7 +31,7 @@ cert_chain:
31
31
  f8wtQllq82VF0AXUYeLtTh1f+DW3WW5BO1e2OCu5eOV7dbyaVPaNK/+rHjCN8kM/
32
32
  DGZSwUoNADmVkQ==
33
33
  -----END CERTIFICATE-----
34
- date: 2016-11-18 00:00:00.000000000 Z
34
+ date: 2016-11-23 00:00:00.000000000 Z
35
35
  dependencies:
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: activesupport
@@ -165,6 +165,7 @@ files:
165
165
  - lib/palletjack/pallet/identity.rb
166
166
  - lib/palletjack/tool.rb
167
167
  - lib/palletjack/version.rb
168
+ - lib/traceable.rb
168
169
  - palletjack.gemspec
169
170
  homepage: https://github.com/saab-simc-admin/palletjack
170
171
  licenses:
metadata.gz.sig CHANGED
Binary file