map 5.8.0 → 6.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/map.rb +104 -44
- data/map.gemspec +1 -1
- metadata +2 -2
data/lib/map.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
class Map < Hash
|
3
|
-
Version = '
|
3
|
+
Version = '6.0.0' unless defined?(Version)
|
4
4
|
Load = Kernel.method(:load) unless defined?(Load)
|
5
5
|
|
6
6
|
class << Map
|
@@ -648,6 +648,7 @@ class Map < Hash
|
|
648
648
|
#
|
649
649
|
def get(*keys)
|
650
650
|
keys = key_for(keys)
|
651
|
+
|
651
652
|
if keys.size <= 1
|
652
653
|
if !self.has_key?(keys.first) && block_given?
|
653
654
|
return yield
|
@@ -655,50 +656,51 @@ class Map < Hash
|
|
655
656
|
return self[keys.first]
|
656
657
|
end
|
657
658
|
end
|
659
|
+
|
658
660
|
keys, key = keys[0..-2], keys[-1]
|
659
661
|
collection = self
|
662
|
+
|
660
663
|
keys.each do |k|
|
661
|
-
|
662
|
-
|
663
|
-
collection = collection[k]
|
664
|
+
if Map.collection_has?(collection, k)
|
665
|
+
collection = Map.collection_key(collection, k)
|
664
666
|
else
|
665
667
|
collection = nil
|
666
668
|
end
|
669
|
+
|
667
670
|
unless collection.respond_to?('[]')
|
668
671
|
leaf = collection
|
669
672
|
return leaf
|
670
673
|
end
|
671
674
|
end
|
672
|
-
alphanumeric_key = alphanumeric_key_for(key)
|
673
675
|
|
674
|
-
if !
|
675
|
-
yield
|
676
|
+
if !Map.collection_has?(collection, key) && block_given?
|
677
|
+
default_value = yield
|
676
678
|
else
|
677
|
-
collection
|
679
|
+
Map.collection_key(collection, key)
|
678
680
|
end
|
679
681
|
end
|
680
682
|
|
681
683
|
def has?(*keys)
|
682
684
|
keys = key_for(keys)
|
683
685
|
collection = self
|
684
|
-
|
686
|
+
|
687
|
+
return Map.collection_has?(collection, keys.first) if keys.size <= 1
|
688
|
+
|
685
689
|
keys, key = keys[0..-2], keys[-1]
|
690
|
+
|
686
691
|
keys.each do |k|
|
687
|
-
|
688
|
-
|
689
|
-
collection = collection[k]
|
692
|
+
if Map.collection_has?(collection, k)
|
693
|
+
collection = Map.collection_key(collection, k)
|
690
694
|
else
|
691
695
|
collection = nil
|
692
696
|
end
|
697
|
+
|
693
698
|
return collection unless collection.respond_to?('[]')
|
694
699
|
end
|
700
|
+
|
695
701
|
return false unless(collection.is_a?(Hash) or collection.is_a?(Array))
|
696
|
-
collection_has_key?(collection, alphanumeric_key_for(key))
|
697
|
-
end
|
698
702
|
|
699
|
-
|
700
|
-
return empty? if keys.empty?
|
701
|
-
!has?(*keys) or Map.blank?(get(*keys))
|
703
|
+
Map.collection_has?(collection, key)
|
702
704
|
end
|
703
705
|
|
704
706
|
def Map.blank?(value)
|
@@ -716,13 +718,84 @@ class Map < Hash
|
|
716
718
|
end
|
717
719
|
end
|
718
720
|
|
719
|
-
def
|
721
|
+
def blank?(*keys)
|
722
|
+
return empty? if keys.empty?
|
723
|
+
!has?(*keys) or Map.blank?(get(*keys))
|
724
|
+
end
|
725
|
+
|
726
|
+
def Map.collection_key(collection, key, &block)
|
720
727
|
case collection
|
728
|
+
when Array
|
729
|
+
begin
|
730
|
+
key = Integer(key)
|
731
|
+
rescue
|
732
|
+
raise(IndexError, "(#{ collection.inspect })[#{ key.inspect }]")
|
733
|
+
end
|
734
|
+
collection[key]
|
735
|
+
|
721
736
|
when Hash
|
722
|
-
collection
|
737
|
+
collection[key]
|
738
|
+
|
739
|
+
else
|
740
|
+
raise(IndexError, "(#{ collection.inspect })[#{ key.inspect }]")
|
741
|
+
end
|
742
|
+
end
|
743
|
+
|
744
|
+
def collection_key(*args, &block)
|
745
|
+
Map.collection_key(*args, &block)
|
746
|
+
end
|
747
|
+
|
748
|
+
def Map.collection_has?(collection, key, &block)
|
749
|
+
has_key =
|
750
|
+
case collection
|
751
|
+
when Array
|
752
|
+
key = (Integer(key) rescue -1)
|
753
|
+
(0...collection.size).include?(key)
|
754
|
+
|
755
|
+
when Hash
|
756
|
+
collection.has_key?(key)
|
757
|
+
|
758
|
+
else
|
759
|
+
raise(IndexError, "(#{ collection.inspect })[#{ key.inspect }]")
|
760
|
+
end
|
761
|
+
|
762
|
+
block.call(key) if(has_key and block)
|
763
|
+
|
764
|
+
has_key
|
765
|
+
end
|
766
|
+
|
767
|
+
def collection_has?(*args, &block)
|
768
|
+
Map.collection_has?(*args, &block)
|
769
|
+
end
|
770
|
+
|
771
|
+
def Map.collection_set(collection, key, value, &block)
|
772
|
+
set_key = false
|
773
|
+
|
774
|
+
case collection
|
723
775
|
when Array
|
724
|
-
|
776
|
+
begin
|
777
|
+
key = Integer(key)
|
778
|
+
rescue
|
779
|
+
raise(IndexError, "(#{ collection.inspect })[#{ key.inspect }]=#{ value.inspect }")
|
780
|
+
end
|
781
|
+
set_key = true
|
782
|
+
collection[key] = value
|
783
|
+
|
784
|
+
when Hash
|
785
|
+
set_key = true
|
786
|
+
collection[key] = value
|
787
|
+
|
788
|
+
else
|
789
|
+
raise(IndexError, "(#{ collection.inspect })[#{ key.inspect }]=#{ value.inspect }")
|
725
790
|
end
|
791
|
+
|
792
|
+
block.call(key) if(set_key and block)
|
793
|
+
|
794
|
+
[key, value]
|
795
|
+
end
|
796
|
+
|
797
|
+
def collection_set(*args, &block)
|
798
|
+
Map.collection_set(*args, &block)
|
726
799
|
end
|
727
800
|
|
728
801
|
def set(*args)
|
@@ -742,7 +815,7 @@ class Map < Hash
|
|
742
815
|
|
743
816
|
strategy.each do |key, value|
|
744
817
|
leaf_for(key, :autovivify => true) do |leaf, k|
|
745
|
-
leaf
|
818
|
+
Map.collection_set(leaf, k, value)
|
746
819
|
end
|
747
820
|
end
|
748
821
|
|
@@ -844,40 +917,24 @@ class Map < Hash
|
|
844
917
|
def leaf_for(key, options = {}, &block)
|
845
918
|
leaf = self
|
846
919
|
key = Array(key).flatten
|
847
|
-
k =
|
920
|
+
k = key.first
|
848
921
|
|
849
922
|
key.each_cons(2) do |a, b|
|
850
|
-
|
851
|
-
|
852
|
-
exists = collection_has_key?(leaf, a)
|
923
|
+
exists = Map.collection_has?(leaf, a)
|
853
924
|
|
854
925
|
case b
|
855
926
|
when Numeric
|
856
927
|
if options[:autovivify]
|
857
|
-
leaf
|
858
|
-
end
|
859
|
-
|
860
|
-
case
|
861
|
-
when Array, Hash
|
862
|
-
nil
|
863
|
-
else
|
864
|
-
raise(IndexError, "(#{ leaf.inspect })[#{ a.inspect }][#{ b.inspect }]")
|
928
|
+
Map.collection_set(leaf, a, Array.new) unless exists
|
865
929
|
end
|
866
930
|
|
867
931
|
when String, Symbol
|
868
932
|
if options[:autovivify]
|
869
|
-
leaf
|
870
|
-
end
|
871
|
-
|
872
|
-
case
|
873
|
-
when Hash
|
874
|
-
nil
|
875
|
-
else
|
876
|
-
raise(IndexError, "(#{ leaf.inspect })[#{ a.inspect }][#{ b.inspect }]")
|
933
|
+
Map.collection_set(leaf, a, Map.new) unless exists
|
877
934
|
end
|
878
935
|
end
|
879
936
|
|
880
|
-
leaf = leaf
|
937
|
+
leaf = Map.collection_key(leaf, a)
|
881
938
|
k = b
|
882
939
|
end
|
883
940
|
|
@@ -940,8 +997,11 @@ class Map < Hash
|
|
940
997
|
end
|
941
998
|
|
942
999
|
def Map.alphanumeric_key_for(key)
|
943
|
-
return key if Numeric
|
944
|
-
|
1000
|
+
return key if key.is_a?(Numeric)
|
1001
|
+
|
1002
|
+
digity, stringy, digits = %r/^(~)?(\d+)$/iomx.match(key).to_a
|
1003
|
+
|
1004
|
+
digity ? stringy ? String(digits) : Integer(digits) : key
|
945
1005
|
end
|
946
1006
|
|
947
1007
|
def alphanumeric_key_for(key)
|
data/map.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: map
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 6.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-05-
|
12
|
+
date: 2012-05-23 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: ! 'description: map kicks the ass'
|
15
15
|
email: ara.t.howard@gmail.com
|