sycamore 0.3.0 → 0.3.1
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/.gitignore +1 -0
- data/.travis.yml +4 -4
- data/CHANGELOG.md +19 -0
- data/Gemfile +1 -2
- data/VERSION +1 -1
- data/lib/sycamore/path.rb +5 -0
- data/lib/sycamore/tree.rb +30 -23
- data/sycamore.gemspec +2 -2
- metadata +6 -7
- data/.ruby-version +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3400b36a441f2a76477f4d0de2e6ffca2daefe49
|
4
|
+
data.tar.gz: cf08112b5fbe999cb12e09736a6828912c7cc41a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b4675895dca790b7a8968fba0363ca713d592b1be4454fc23446e26f607f7b5dc75bfca6bd572a35bd477a989df265a19ba692fb2a09dfe078d44c625e509fe3
|
7
|
+
data.tar.gz: 5ee07612195732f7c15234c9f8f8555e60ba3cb557de10d44c104c89f7819c15ba41606cebed3783e42d965841ccc25abbaa7e58b0a49a0279b9cecd4f41a899
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -5,6 +5,22 @@ This project adheres to [Semantic Versioning](http://semver.org/) and
|
|
5
5
|
[Keep a CHANGELOG](http://keepachangelog.com).
|
6
6
|
|
7
7
|
|
8
|
+
## 0.3.1 - 2016-05-07
|
9
|
+
|
10
|
+
### Added
|
11
|
+
|
12
|
+
- array-access operator and `fetch` on `Path` for random access
|
13
|
+
|
14
|
+
### Changed
|
15
|
+
|
16
|
+
- Lazy initialization of the internal hash. This improves extensibility, eg. by
|
17
|
+
not requiring a `super` call in the constructors of `Tree` subclasses.
|
18
|
+
|
19
|
+
|
20
|
+
[Compare v0.3.0...v0.3.1](https://github.com/marcelotto/sycamore/compare/v0.3.0...v0.3.1)
|
21
|
+
|
22
|
+
|
23
|
+
|
8
24
|
## 0.3.0 - 2016-04-23
|
9
25
|
|
10
26
|
### Added
|
@@ -32,6 +48,7 @@ This project adheres to [Semantic Versioning](http://semver.org/) and
|
|
32
48
|
- `Tree#delete` deleted paths, when they matched a given input path partially,
|
33
49
|
e.g. `Tree[a: 1] >> a: {1 => 2}` deleted successfully.
|
34
50
|
|
51
|
+
|
35
52
|
[Compare v0.2.1...v0.3.0](https://github.com/marcelotto/sycamore/compare/v0.2.1...v0.3.0)
|
36
53
|
|
37
54
|
|
@@ -47,6 +64,7 @@ This project adheres to [Semantic Versioning](http://semver.org/) and
|
|
47
64
|
|
48
65
|
- [#2](https://github.com/marcelotto/sycamore/issues/2): Rubinius support
|
49
66
|
|
67
|
+
|
50
68
|
[Compare v0.2.0...v0.2.1](https://github.com/marcelotto/sycamore/compare/v0.2.0...v0.2.1)
|
51
69
|
|
52
70
|
|
@@ -60,6 +78,7 @@ This project adheres to [Semantic Versioning](http://semver.org/) and
|
|
60
78
|
- `Tree#node!` as a more strict variant of `Tree#node`, which raises an error
|
61
79
|
when no node present
|
62
80
|
|
81
|
+
|
63
82
|
[Compare v0.1.0...v0.2.0](https://github.com/marcelotto/sycamore/compare/v0.1.0...v0.2.0)
|
64
83
|
|
65
84
|
|
data/Gemfile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.1
|
data/lib/sycamore/path.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
1
3
|
module Sycamore
|
2
4
|
|
3
5
|
##
|
@@ -21,6 +23,7 @@ module Sycamore
|
|
21
23
|
#
|
22
24
|
class Path
|
23
25
|
include Enumerable
|
26
|
+
extend Forwardable
|
24
27
|
|
25
28
|
attr_reader :node, :parent
|
26
29
|
|
@@ -75,6 +78,8 @@ module Sycamore
|
|
75
78
|
# @group Elements
|
76
79
|
########################################################################
|
77
80
|
|
81
|
+
def_delegators :to_a, :[], :fetch
|
82
|
+
|
78
83
|
##
|
79
84
|
# Returns a new path based on this path, but with the given nodes extended.
|
80
85
|
#
|
data/lib/sycamore/tree.rb
CHANGED
@@ -65,7 +65,14 @@ module Sycamore
|
|
65
65
|
# Creates a new empty Tree.
|
66
66
|
#
|
67
67
|
def initialize
|
68
|
-
|
68
|
+
end
|
69
|
+
|
70
|
+
protected def data
|
71
|
+
@data ||= Hash.new
|
72
|
+
end
|
73
|
+
|
74
|
+
protected def clear_data
|
75
|
+
@data = nil
|
69
76
|
end
|
70
77
|
|
71
78
|
##
|
@@ -218,7 +225,7 @@ module Sycamore
|
|
218
225
|
alias << add
|
219
226
|
|
220
227
|
protected def add_node(node)
|
221
|
-
|
228
|
+
data[node] ||= Nothing
|
222
229
|
|
223
230
|
self
|
224
231
|
end
|
@@ -227,7 +234,7 @@ module Sycamore
|
|
227
234
|
# @api private
|
228
235
|
#
|
229
236
|
def clear_child_of_node(node)
|
230
|
-
|
237
|
+
data[valid_node! node] = Nothing
|
231
238
|
|
232
239
|
self
|
233
240
|
end
|
@@ -238,8 +245,8 @@ module Sycamore
|
|
238
245
|
def add_node_with_empty_child(node)
|
239
246
|
valid_node! node
|
240
247
|
|
241
|
-
if
|
242
|
-
|
248
|
+
if data.fetch(node, Nothing).nothing?
|
249
|
+
data[node] = new_child(node)
|
243
250
|
end
|
244
251
|
|
245
252
|
self
|
@@ -249,7 +256,7 @@ module Sycamore
|
|
249
256
|
return add_node(node) if Nothing.like?(children)
|
250
257
|
|
251
258
|
add_node_with_empty_child(node)
|
252
|
-
|
259
|
+
data[node] << children
|
253
260
|
|
254
261
|
self
|
255
262
|
end
|
@@ -329,7 +336,7 @@ module Sycamore
|
|
329
336
|
alias >> delete
|
330
337
|
|
331
338
|
protected def delete_node(node)
|
332
|
-
|
339
|
+
data.delete(node)
|
333
340
|
|
334
341
|
self
|
335
342
|
end
|
@@ -491,7 +498,7 @@ module Sycamore
|
|
491
498
|
# tree.size # => 0
|
492
499
|
#
|
493
500
|
def clear
|
494
|
-
|
501
|
+
data.clear
|
495
502
|
|
496
503
|
self
|
497
504
|
end
|
@@ -509,7 +516,7 @@ module Sycamore
|
|
509
516
|
# tree.to_h # => {foo: :bar}
|
510
517
|
#
|
511
518
|
def compact
|
512
|
-
|
519
|
+
data.each do |node, child| case
|
513
520
|
when child.nothing? then next
|
514
521
|
when child.empty? then clear_child_of_node(node)
|
515
522
|
else child.compact
|
@@ -535,7 +542,7 @@ module Sycamore
|
|
535
542
|
# tree[:foo].nodes # => [:bar, :baz]
|
536
543
|
#
|
537
544
|
def nodes
|
538
|
-
|
545
|
+
data.keys
|
539
546
|
end
|
540
547
|
|
541
548
|
alias keys nodes # Hash compatibility
|
@@ -605,7 +612,7 @@ module Sycamore
|
|
605
612
|
def child_of(node)
|
606
613
|
valid_node! node
|
607
614
|
|
608
|
-
Nothing.like?(child =
|
615
|
+
Nothing.like?(child = data[node]) ? Absence.at(self, node) : child
|
609
616
|
end
|
610
617
|
|
611
618
|
##
|
@@ -684,7 +691,7 @@ module Sycamore
|
|
684
691
|
return fetch_path(node, *default, &block) if node.is_a? Path
|
685
692
|
valid_node! node
|
686
693
|
|
687
|
-
child =
|
694
|
+
child = data.fetch(node, *default, &block)
|
688
695
|
if child.equal? Nothing
|
689
696
|
child = case
|
690
697
|
when block_given? then yield
|
@@ -754,7 +761,7 @@ module Sycamore
|
|
754
761
|
def each_node(&block)
|
755
762
|
return enum_for(__callee__) unless block_given?
|
756
763
|
|
757
|
-
|
764
|
+
data.each_key(&block)
|
758
765
|
|
759
766
|
self
|
760
767
|
end
|
@@ -783,7 +790,7 @@ module Sycamore
|
|
783
790
|
def each_pair(&block)
|
784
791
|
return enum_for(__callee__) unless block_given?
|
785
792
|
|
786
|
-
|
793
|
+
data.each_pair(&block)
|
787
794
|
|
788
795
|
self
|
789
796
|
end
|
@@ -870,7 +877,7 @@ module Sycamore
|
|
870
877
|
def include_node?(node)
|
871
878
|
return include_path?(node) if node.is_a? Path
|
872
879
|
|
873
|
-
|
880
|
+
data.include?(node)
|
874
881
|
end
|
875
882
|
|
876
883
|
alias member? include_node? # Hash compatibility
|
@@ -954,7 +961,7 @@ module Sycamore
|
|
954
961
|
# tree["e"].size # => 2
|
955
962
|
#
|
956
963
|
def size
|
957
|
-
|
964
|
+
data.size
|
958
965
|
end
|
959
966
|
|
960
967
|
##
|
@@ -971,7 +978,7 @@ module Sycamore
|
|
971
978
|
#
|
972
979
|
def total_size
|
973
980
|
total = size
|
974
|
-
|
981
|
+
data.each { |_, child| total += child.total_size }
|
975
982
|
total
|
976
983
|
end
|
977
984
|
|
@@ -1001,7 +1008,7 @@ module Sycamore
|
|
1001
1008
|
# Tree[a: 1].empty? # => false
|
1002
1009
|
#
|
1003
1010
|
def empty?
|
1004
|
-
|
1011
|
+
data.empty?
|
1005
1012
|
end
|
1006
1013
|
|
1007
1014
|
alias blank? empty?
|
@@ -1146,7 +1153,7 @@ module Sycamore
|
|
1146
1153
|
# @return [Fixnum]
|
1147
1154
|
#
|
1148
1155
|
def hash
|
1149
|
-
|
1156
|
+
data.hash ^ self.class.hash
|
1150
1157
|
end
|
1151
1158
|
|
1152
1159
|
##
|
@@ -1165,7 +1172,7 @@ module Sycamore
|
|
1165
1172
|
# tree1.eql? tree4 # => false
|
1166
1173
|
#
|
1167
1174
|
def eql?(other)
|
1168
|
-
(other.instance_of?(self.class) and
|
1175
|
+
(other.instance_of?(self.class) and data.eql?(other.data)) or
|
1169
1176
|
(other.instance_of?(Absence) and other.eql?(self))
|
1170
1177
|
end
|
1171
1178
|
|
@@ -1339,7 +1346,7 @@ module Sycamore
|
|
1339
1346
|
# not the nicest, but fastest way to inject on hashes, as noted here:
|
1340
1347
|
# http://stackoverflow.com/questions/3230863/ruby-rails-inject-on-hashes-good-style
|
1341
1348
|
hash = {}
|
1342
|
-
|
1349
|
+
data.each do |node, child|
|
1343
1350
|
hash[node] = child.to_native_object(*args)
|
1344
1351
|
end
|
1345
1352
|
|
@@ -1444,7 +1451,7 @@ module Sycamore
|
|
1444
1451
|
#
|
1445
1452
|
def initialize_clone(other)
|
1446
1453
|
super
|
1447
|
-
|
1454
|
+
clear_data
|
1448
1455
|
add other
|
1449
1456
|
end
|
1450
1457
|
|
@@ -1454,7 +1461,7 @@ module Sycamore
|
|
1454
1461
|
# @see http://ruby-doc.org/core/Object.html#method-i-freeze
|
1455
1462
|
#
|
1456
1463
|
def freeze
|
1457
|
-
|
1464
|
+
data.freeze
|
1458
1465
|
each { |_, child| child.freeze }
|
1459
1466
|
super
|
1460
1467
|
end
|
data/sycamore.gemspec
CHANGED
@@ -21,8 +21,8 @@ Gem::Specification.new do |spec|
|
|
21
21
|
|
22
22
|
spec.required_ruby_version = '>= 2.1'
|
23
23
|
|
24
|
-
spec.add_development_dependency 'bundler', '~> 1.
|
25
|
-
spec.add_development_dependency 'rake', '~>
|
24
|
+
spec.add_development_dependency 'bundler', '~> 1.11'
|
25
|
+
spec.add_development_dependency 'rake', '~> 11.0'
|
26
26
|
spec.add_development_dependency 'rspec', '~> 3.4.0'
|
27
27
|
spec.add_development_dependency 'yard', '~> 0.8'
|
28
28
|
spec.add_development_dependency 'yard-doctest'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sycamore
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marcel Otto
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-05-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1.
|
19
|
+
version: '1.11'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1.
|
26
|
+
version: '1.11'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '11.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '11.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -90,7 +90,6 @@ files:
|
|
90
90
|
- ".editorconfig"
|
91
91
|
- ".gitignore"
|
92
92
|
- ".rspec"
|
93
|
-
- ".ruby-version"
|
94
93
|
- ".travis.yml"
|
95
94
|
- ".yardopts"
|
96
95
|
- AUTHORS
|
data/.ruby-version
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
2.3.0
|