palletjack 0.1.3 → 0.2.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: a92cd24bafb3571920c17d5169cfb443d5ecf802
4
- data.tar.gz: 0ced78f0c35522bacd9731c8e49de89f1a94e95f
3
+ metadata.gz: ad0c8785d6c2e0df5f352e67ea82abad9ee6803b
4
+ data.tar.gz: ce7296d715491c9a78e139b7578552b505e21c1d
5
5
  SHA512:
6
- metadata.gz: d263c08676ea7b3fb2ca09392e52397ca8398a7ddba90f478da4dad4c733e6874f29538ac46dc48630f6a743614b385ab87e131d7fac8dd191ce9d9486eba04c
7
- data.tar.gz: a999088ef12bbd9ec420745b36c9e02ded2a9f91e3b34885e8445d0dd4bd4e9d60ea0051dfccc880ccfeeca4cb9f5554a0357dca88e06bd8eada146b5a188f6b
6
+ metadata.gz: ca68935c9d97734d28b139629873774eeaca5d8f06bb468047c0a16a09c5c51f4983b04cfbabce97517c9fb259739830782acea3e93b6334cc4400392b19274f
7
+ data.tar.gz: 6963849234c18071bdece0e5f5fd37fcf9edf8984775f69ec71084e994bbdf297959d2a1511e6c12dcc3e80a4a84c06c77efc4b5a52c3c2519d84d5fed5945ab
Binary file
Binary file
data/README.md CHANGED
@@ -241,3 +241,11 @@ We are happy to accept contributions in the form of issues and pull requests on
241
241
  - If your code needs larger chunks of static data to work, please provide it in a separate directory under `examples/`. See e.g. [the `examples/pxelinux/` tree](https://github.com/saab-simc-admin/palletjack/tree/master/examples/pxelinux), which contains files required to make sense of the output from `palletjack2pxelinux`.
242
242
 
243
243
  - Write your commit messages in the usual Git style: a short summary in the first line, then paragraphs of explanatory text, line wrapped.
244
+
245
+ - Test your code.
246
+
247
+ - Tests shall be written in [RSpec](http://rspec.info/).
248
+
249
+ - Library code shall have unit tests.
250
+
251
+ - Tools shall have integration and end-to-end tests.
@@ -6,10 +6,12 @@ require 'palletjack/keytransformer'
6
6
  require 'palletjack/pallet'
7
7
 
8
8
  class PalletJack < KVDAG
9
- attr_reader :pallets
9
+ attr_reader :warehouse
10
10
  attr_reader :keytrans_reader
11
11
  attr_reader :keytrans_writer
12
12
 
13
+ # Create and load a PalletJack warehouse, and all its pallets
14
+
13
15
  def self.load(warehouse)
14
16
  new.load(warehouse)
15
17
  end
@@ -19,6 +21,8 @@ class PalletJack < KVDAG
19
21
  @pallets = Hash.new
20
22
  end
21
23
 
24
+ # Load a PalletJack warehouse, and all its pallets
25
+
22
26
  def load(warehouse)
23
27
  @warehouse = File.expand_path(warehouse)
24
28
  key_transforms = YAML::load_file(File.join(@warehouse, "transforms.yaml"))
@@ -32,12 +36,26 @@ class PalletJack < KVDAG
32
36
  Dir.foreach(kindpath) do |pallet|
33
37
  palletpath = File.join(kindpath, pallet)
34
38
  next unless File.directory?(palletpath) and pallet !~ /^\.{1,2}$/
35
- Pallet.new(self, palletpath)
39
+ pallet(kind, pallet)
36
40
  end
37
41
  end
38
42
  self
39
43
  end
40
44
 
45
+ # Return a named pallet from the warehouse
46
+ #
47
+ # If the pallet is not yet loaded, it will be.
48
+ #
49
+ # Raises RuntimeError if the warehouse is not loaded.
50
+ # Raises Errno::ENOENT if the pallet can't be loaded.
51
+
52
+ def pallet(kind, name)
53
+ raise "warehouse is not loaded" unless @warehouse
54
+
55
+ identity = Pallet::Identity.new(self, File.join(kind, name))
56
+ @pallets[identity.path] ||= Pallet.load(self, identity)
57
+ end
58
+
41
59
  # Search for pallets in a PalletJack warehouse
42
60
  #
43
61
  # The search is filtered by KVDAG::Vertex#match? expressions.
@@ -64,7 +82,7 @@ class PalletJack < KVDAG
64
82
  result = self[filter]
65
83
 
66
84
  if result.length != 1
67
- raise KeyError.new("#{options} matched #{result.length} pallets")
85
+ raise KeyError.new("#{filter} matched #{result.length} pallets")
68
86
  end
69
87
  result.first
70
88
  end
@@ -1,52 +1,39 @@
1
- class PalletJack
1
+ require 'palletjack/pallet/identity'
2
+
3
+ class PalletJack < KVDAG
2
4
  # PalletJack managed pallet of key boxes inside a warehouse.
3
5
  class Pallet < KVDAG::Vertex
4
6
 
5
- attr_reader :name
6
- attr_reader :kind
7
-
8
- # N.B: A pallet should never be created manually; use
9
- # +PalletJack::new+ to initialize a complete warehouse.
7
+ # N.B: A pallet should never be loaded manually; use
8
+ # +PalletJack.load+ to initialize a complete warehouse.
10
9
  #
11
10
  # [+jack+] PalletJack that will manage this pallet.
12
- # [+path+] Filesystem path to pallet data.
11
+ # [+identity+] Identity of the pallet to be loaded.
13
12
  #
14
- # Create PalletJack managed singletonish pallet.
15
- #
16
- # Use relative path inside of warehouse as kind/name for this
17
- # pallet, and make a singletonish object for that key.
18
-
19
- def Pallet.new(jack, path) #:doc:
20
- ppath, name = File.split(path)
21
- _, kind = File.split(ppath)
13
+ # Creates and loads a new PalletJack warehouse pallet.
22
14
 
23
- jack.pallets[kind] ||= Hash.new
24
- jack.pallets[kind][name] || super
15
+ def self.load(jack, identity)
16
+ new(jack).load(identity)
25
17
  end
26
18
 
27
- # N.B: A pallet should never be created manually; use
28
- # +PalletJack::new+ to initialize a complete warehouse.
19
+ # N.B: A pallet should never be loaded manually; use
20
+ # +PalletJack::load+ to initialize a complete warehouse.
29
21
  #
30
- # [+jack+] PalletJack that will manage this pallet.
31
- # [+path+] Filesystem path to pallet data.
22
+ # [+identity+] Identity of the pallet to be loaded.
32
23
  #
33
24
  # Loads and merges all YAML files in +path+ into this Vertex.
34
25
  #
35
26
  # Follows all symlinks in +path+ and creates edges towards
36
27
  # the pallet located in the symlink target.
37
28
 
38
- private :initialize
39
- def initialize(jack, path) #:notnew:
40
- @jack = jack
41
- @path = path
42
- ppath, @name = File.split(path)
43
- _, @kind = File.split(ppath)
29
+ def load(identity)
30
+ @identity = identity
44
31
  boxes = Array.new
45
-
46
- super(jack, pallet:{@kind => @name})
32
+ path = @identity.path
47
33
 
48
34
  Dir.foreach(path) do |file|
49
- next if file[0] == '.'
35
+ next if file[0] == '.' # skip dot.files
36
+
50
37
  filepath = File.join(path, file)
51
38
  filestat = File.lstat(filepath)
52
39
  case
@@ -55,15 +42,19 @@ class PalletJack
55
42
  boxes << file
56
43
  when filestat.symlink?
57
44
  link = File.readlink(filepath)
58
- _, lname = File.split(link)
45
+ link_id = Identity.new(jack, File.expand_path(link, path))
59
46
 
60
- pallet = Pallet.new(jack, File.absolute_path(link, path))
61
- edge(pallet, pallet:{references:{file => lname}})
47
+ pallet = jack.pallet(link_id.kind, link_id.full_name)
48
+ edge(pallet, pallet:{references:{file => link_id.full_name}})
49
+ when filestat.directory?
50
+ child = jack.pallet(kind, File.join(name, file))
51
+ child.edge(self, pallet:{references:{_parent: name}})
62
52
  end
63
53
  end
64
- merge!(pallet:{boxes: boxes})
65
- @jack.keytrans_writer.transform!(self)
66
- @jack.pallets[@kind][@name] = self
54
+ merge!(pallet:{kind => name, boxes: boxes})
55
+ jack.keytrans_writer.transform!(self)
56
+
57
+ self
67
58
  end
68
59
 
69
60
  def inspect
@@ -73,8 +64,42 @@ class PalletJack
73
64
  # Override standard to_yaml serialization, because pallet objects
74
65
  # are ephemeral by nature. The natural serialization is that of
75
66
  # their to_hash analogue.
67
+
76
68
  def to_yaml
77
69
  to_hash.to_yaml
78
70
  end
71
+
72
+ # The kind of this pallet
73
+
74
+ def kind
75
+ @identity.kind
76
+ end
77
+
78
+ # The leaf name of this pallet in its hierarchy
79
+
80
+ def leaf_name
81
+ @identity.leaf_name
82
+ end
83
+
84
+ # Compatibility alias name is the leaf name
85
+
86
+ alias name leaf_name
87
+
88
+ # The full hierarchical name of this pallet
89
+
90
+ def full_name
91
+ @identity.full_name
92
+ end
93
+
94
+ # The full name of the hierarchical parent for this pallet,
95
+ # or nil if there is no parent.
96
+
97
+ def parent_name
98
+ @identity.parent_name
99
+ end
100
+
101
+ private
102
+
103
+ alias :jack :dag
79
104
  end
80
105
  end
@@ -0,0 +1,65 @@
1
+ class PalletJack < KVDAG
2
+ class Pallet < KVDAG::Vertex
3
+
4
+ # Represents the identity aspects of a warehouse pallet
5
+
6
+ class Identity
7
+ include Comparable
8
+
9
+ # Full expanded path to this pallet
10
+ attr_reader :path
11
+
12
+ # Base path of the warehouse for this pallet
13
+ attr_reader :warehouse
14
+
15
+ # The kind of this pallet
16
+ attr_reader :kind
17
+
18
+ # The full name of the hierarchical parent for this pallet,
19
+ # or nil if there is no parent.
20
+ attr_reader :parent_name
21
+
22
+ # The full hierarchical name for this pallet
23
+ attr_reader :full_name
24
+
25
+ # The leaf name for this pallet in its hierarchy
26
+ attr_reader :leaf_name
27
+
28
+ # Initialize identity aspects for a Pallet from components of its
29
+ # +path+ within the +jack.warehouse+
30
+
31
+ def initialize(jack, path)
32
+ @warehouse = jack.warehouse
33
+ @path = path = File.expand_path(path, @warehouse)
34
+
35
+ path_components = []
36
+ while path > @warehouse do
37
+ path, part = File.split(path)
38
+ path_components = [part, *path_components]
39
+ end
40
+
41
+ @kind, *path_components = path_components
42
+ @full_name = File.join(*path_components)
43
+ @leaf_name = path_components.last
44
+ *path_components, _ = path_components
45
+ @parent_name = File.join(*path_components) unless path_components.empty?
46
+ end
47
+
48
+ # Comparability uses the full path of the pallet
49
+
50
+ def <=>(other)
51
+ path <=> other.path
52
+ end
53
+
54
+ # Hashing uses the full path of the pallet for uniqueness
55
+
56
+ def hash
57
+ path.hash
58
+ end
59
+
60
+ # eql? must be overridden for Hash comparisons to work as expected
61
+
62
+ alias eql? ==
63
+ end
64
+ end
65
+ end
@@ -49,8 +49,6 @@ class PalletJack
49
49
  class Tool
50
50
  include Singleton
51
51
 
52
- # v0.1.1 API:
53
- #
54
52
  # :call-seq:
55
53
  # run
56
54
  #
@@ -67,34 +65,10 @@ class PalletJack
67
65
  # MyTool.run
68
66
  # end
69
67
 
70
- # v0.1.0 API, retained until all tools have been updated to
71
- # v0.1.1:
72
- #
73
- # :call-seq:
74
- # run &block
75
- #
76
- # Run the +block+ given in the context of the tool singleton instance
77
- # as convenience for simple tools.
78
- #
79
- # More complex tools probably want to override parse_options to
80
- # add option parsing, and split functionality into multiple methods.
81
- #
82
- # Example:
83
- #
84
- # MyTool.run { jack.each(kind:'system') {|sys| puts sys.to_yaml } }
85
-
86
68
  def self.run(&block)
87
- if block
88
- # v0.1.0 API. When all tools have been ported, remove this and
89
- # bump the minor version number.
90
- instance.setup
91
- instance.instance_eval(&block)
92
- else
93
- # v0.1.1 API
94
- instance.setup
95
- instance.process
96
- instance.output
97
- end
69
+ instance.setup
70
+ instance.process
71
+ instance.output
98
72
  end
99
73
 
100
74
  # Predicate for detecting if we are being invoked as a standalone
@@ -1,5 +1,5 @@
1
1
  require 'kvdag'
2
2
 
3
3
  class PalletJack < KVDAG
4
- VERSION = "0.1.3"
4
+ VERSION = "0.2.0"
5
5
  end
@@ -31,6 +31,8 @@ Gem::Specification.new do |spec|
31
31
  spec.add_development_dependency "bundler", "~> 1.13"
32
32
  spec.add_development_dependency "rake", "~> 10.0"
33
33
  spec.add_development_dependency "rspec", "~> 3.0"
34
+ spec.add_development_dependency "rspec_structure_matcher", "~> 0.0.6"
35
+ spec.add_development_dependency "rspec-collection_matchers", "~> 1.1.2"
34
36
 
35
37
  spec.has_rdoc = true
36
38
  end
metadata CHANGED
@@ -1,14 +1,37 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: palletjack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Calle Englund
8
8
  autorequire:
9
9
  bindir: exe
10
- cert_chain: []
11
- date: 2016-11-10 00:00:00.000000000 Z
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDljCCAn6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBIMRYwFAYDVQQDDA1jYWxs
14
+ ZS5lbmdsdW5kMRkwFwYKCZImiZPyLGQBGRYJc2FhYmdyb3VwMRMwEQYKCZImiZPy
15
+ LGQBGRYDY29tMB4XDTE2MTEwMjA5MjYyN1oXDTE3MTEwMjA5MjYyN1owSDEWMBQG
16
+ A1UEAwwNY2FsbGUuZW5nbHVuZDEZMBcGCgmSJomT8ixkARkWCXNhYWJncm91cDET
17
+ MBEGCgmSJomT8ixkARkWA2NvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
18
+ ggEBAM7OxaztzD0LyOwK1mPcg3BhioX1EDVbD/qAFOAzBSGGlAhtmHMqAkyvJMvs
19
+ iiG7xvBidWUapxiEiBwamXiOTSrp2eW+XSXW9omdWHXjBZcwHqwb1VmAlYRDkSHf
20
+ dzcM/z4xlV+DJw/pFyMRWzqNdVBtWTbVXAFGjJSqQ6q21ACYJldV9U71AIpXo+oF
21
+ VEMf6PZS2uhB1G+FgAtnX/xmy7OM1Cy3qc/CaJbWSddpegxWJMUn2HNQxFwIe40g
22
+ WoEoiFA7qQg9DnR/5i3lW6QyfIaA5k9cv2su1VyjqKLbkFTTTjYw0P1BJmvfXjtc
23
+ rMl+3HCWYj6UunZwfZi2wDGsBkkCAwEAAaOBijCBhzAJBgNVHRMEAjAAMAsGA1Ud
24
+ DwQEAwIEsDAdBgNVHQ4EFgQUwHCMEKgrIMaiTkTVLKZn6yOD1SIwJgYDVR0RBB8w
25
+ HYEbY2FsbGUuZW5nbHVuZEBzYWFiZ3JvdXAuY29tMCYGA1UdEgQfMB2BG2NhbGxl
26
+ LmVuZ2x1bmRAc2FhYmdyb3VwLmNvbTANBgkqhkiG9w0BAQUFAAOCAQEAP9OnE0jP
27
+ 2vRHI/vnOkgCvLFNoOqK/YB4yDVVW69Pza+xIXcmUBvl7DQ+bBdF5AK0B1A7U0rp
28
+ Pbdj0bpQtWxmUmMIbnE1w6iuVCXAabsyUfHY4mlztToWXMVOXc1SPlJ/S2XXaRd5
29
+ fiNj/nBTb0YTQA0E4pZ0Aud80qZ2WLdc6FfzHUEMW91BL3bhLeDL40noHK5Lvk52
30
+ phzVHIrDjCowUMTnGiPZCXEo4KZW76KwYYV6oQ6LzcrYBw5mJ4XpdgQKZgnTnRBP
31
+ f8wtQllq82VF0AXUYeLtTh1f+DW3WW5BO1e2OCu5eOV7dbyaVPaNK/+rHjCN8kM/
32
+ DGZSwUoNADmVkQ==
33
+ -----END CERTIFICATE-----
34
+ date: 2016-11-11 00:00:00.000000000 Z
12
35
  dependencies:
13
36
  - !ruby/object:Gem::Dependency
14
37
  name: activesupport
@@ -94,6 +117,34 @@ dependencies:
94
117
  - - ~>
95
118
  - !ruby/object:Gem::Version
96
119
  version: '3.0'
120
+ - !ruby/object:Gem::Dependency
121
+ name: rspec_structure_matcher
122
+ requirement: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ~>
125
+ - !ruby/object:Gem::Version
126
+ version: 0.0.6
127
+ type: :development
128
+ prerelease: false
129
+ version_requirements: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ~>
132
+ - !ruby/object:Gem::Version
133
+ version: 0.0.6
134
+ - !ruby/object:Gem::Dependency
135
+ name: rspec-collection_matchers
136
+ requirement: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - ~>
139
+ - !ruby/object:Gem::Version
140
+ version: 1.1.2
141
+ type: :development
142
+ prerelease: false
143
+ version_requirements: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ~>
146
+ - !ruby/object:Gem::Version
147
+ version: 1.1.2
97
148
  description: Lightweight Configuration Management Database
98
149
  email:
99
150
  - calle.englund@saabgroup.com
@@ -111,6 +162,7 @@ files:
111
162
  - lib/palletjack.rb
112
163
  - lib/palletjack/keytransformer.rb
113
164
  - lib/palletjack/pallet.rb
165
+ - lib/palletjack/pallet/identity.rb
114
166
  - lib/palletjack/tool.rb
115
167
  - lib/palletjack/version.rb
116
168
  - palletjack.gemspec
@@ -134,7 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
134
186
  version: '0'
135
187
  requirements: []
136
188
  rubyforge_project:
137
- rubygems_version: 2.4.8
189
+ rubygems_version: 2.0.14
138
190
  signing_key:
139
191
  specification_version: 4
140
192
  summary: Lightweight Configuration Management Database
Binary file