angry_hash 0.0.5 → 0.1.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.
- data/VERSION +1 -1
- data/angry_hash.gemspec +5 -2
- data/examples/accessors_eg.rb +11 -0
- data/examples/creation_eg.rb +1 -0
- data/examples/dsl.eg.rb +18 -0
- data/examples/dup_eg.rb +53 -55
- data/examples/eg_helper.rb +8 -0
- data/examples/merge_eg.rb +1 -0
- data/lib/angry_hash/dsl.rb +44 -0
- data/lib/angry_hash/extension_tracking.rb +12 -0
- data/lib/angry_hash.rb +13 -5
- metadata +6 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
0.1.0
|
data/angry_hash.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{angry_hash}
|
8
|
-
s.version = "0.0
|
8
|
+
s.version = "0.1.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Lachie Cox"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-08-07}
|
13
13
|
s.description = %q{A stabler mash with different emphases. Used in plus2 projects AngryMob and Igor.}
|
14
14
|
s.email = %q{lachie@plus2.com.au}
|
15
15
|
s.files = [
|
@@ -19,10 +19,13 @@ Gem::Specification.new do |s|
|
|
19
19
|
"angry_hash.gemspec",
|
20
20
|
"examples/accessors_eg.rb",
|
21
21
|
"examples/creation_eg.rb",
|
22
|
+
"examples/dsl.eg.rb",
|
22
23
|
"examples/dup_eg.rb",
|
23
24
|
"examples/eg_helper.rb",
|
24
25
|
"examples/merge_eg.rb",
|
25
26
|
"lib/angry_hash.rb",
|
27
|
+
"lib/angry_hash/dsl.rb",
|
28
|
+
"lib/angry_hash/extension_tracking.rb",
|
26
29
|
"lib/angry_hash/merge_string.rb"
|
27
30
|
]
|
28
31
|
s.homepage = %q{http://github.com/plus2/angry_hash}
|
data/examples/accessors_eg.rb
CHANGED
data/examples/creation_eg.rb
CHANGED
data/examples/dsl.eg.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'eg_helper'
|
2
|
+
|
3
|
+
eg 'eval a block as dsl' do
|
4
|
+
original = AngryHash[ :a => 'x', :b => {:c => 1}, :d => 'z' ]
|
5
|
+
|
6
|
+
original.__eval_as_dsl do
|
7
|
+
foo 'bar'
|
8
|
+
a 'y'
|
9
|
+
b :e => 2
|
10
|
+
end
|
11
|
+
|
12
|
+
Assert(original.foo == 'bar')
|
13
|
+
Assert(original.a == 'y')
|
14
|
+
Assert(original.d == 'z')
|
15
|
+
|
16
|
+
Assert(original.b.c == 1)
|
17
|
+
Assert(original.b.e == 2)
|
18
|
+
end
|
data/examples/dup_eg.rb
CHANGED
@@ -1,61 +1,15 @@
|
|
1
1
|
require 'eg_helper'
|
2
2
|
|
3
|
+
require 'angry_hash/extension_tracking'
|
4
|
+
AngryHash.send :include, AngryHash::ExtensionTracking
|
5
|
+
|
3
6
|
eg.setup do
|
4
7
|
@original = { 'database' => {
|
5
|
-
"micropower_micropower_sandbox"=>
|
6
|
-
{"app_owner"=>"
|
7
|
-
|
8
|
-
{"app_owner"=>"
|
9
|
-
|
10
|
-
{"app_owner"=>"froggy_owner",
|
11
|
-
"backup"=>{"to_s3"=>true},
|
12
|
-
"server"=>:postfrog},
|
13
|
-
"isg_url_shortener"=>
|
14
|
-
{"app_owner"=>"isg_sandbox_v5", "server"=>:isg_forums_mysql},
|
15
|
-
"isg_forums"=>{"app_owner"=>"isg_forums", "server"=>:isg_forums_mysql},
|
16
|
-
"eggs_eggs"=>
|
17
|
-
{"app_owner"=>"eggs_eggs",
|
18
|
-
"backup"=>{"to_s3"=>true},
|
19
|
-
"server"=>:db,
|
20
|
-
"admin_owner"=>"eggs_admin"},
|
21
|
-
"myfrogdb"=>{"app_owner"=>:myfroggy, "server"=>:myfrog},
|
22
|
-
"amc_exam_staging"=>
|
23
|
-
{"app_owner"=>"amc_exam", "server"=>:plus2staging_local_mysql},
|
24
|
-
"micropower_golfo"=>{"app_owner"=>:golfo, "server"=>:linode_golfo_mysql},
|
25
|
-
"linode_golfo"=>{"app_owner"=>:golfo, "server"=>:linode_golfo_mysql},
|
26
|
-
"halal_staging"=>
|
27
|
-
{"app_owner"=>"halal", "server"=>:plus2staging_local_postgres},
|
28
|
-
"eggs_enag"=>
|
29
|
-
{"app_owner"=>"eggs_enag", "backup"=>{"to_s3"=>true}, "server"=>:db},
|
30
|
-
"amc_store"=>
|
31
|
-
{"app_owner"=>"amc_store", "backup"=>{"to_s3"=>true}, "server"=>:amc},
|
32
|
-
"weatherzone_wengine"=>
|
33
|
-
{"app_owner"=>"weatherzone_wengine", "server"=>:linode_postgres},
|
34
|
-
"weatherzone_wzfb_staging"=>
|
35
|
-
{"app_owner"=>"weatherzone_wzfb_staging", "server"=>:db},
|
36
|
-
"amc_ncmr"=>
|
37
|
-
{"app_owner"=>"amc_ncmr", "backup"=>{"to_s3"=>true}, "server"=>:amc},
|
38
|
-
"westpac_thinkbank_staging"=>
|
39
|
-
{"app_owner"=>"westpac_thinkbank_staging", "server"=>:db},
|
40
|
-
"micropower_micropower_staging"=>
|
41
|
-
{"app_owner"=>"micropower", "server"=>:staging_mysql},
|
42
|
-
"weatherzone_wx_staging"=>
|
43
|
-
{"app_owner"=>"weatherzone_wx_staging", "server"=>:db},
|
44
|
-
"isg_sandbox_v4"=>
|
45
|
-
{"app_owner"=>"isg_sandbox_v5", "server"=>:isg_forums_mysql},
|
46
|
-
"eggs_aecl"=>
|
47
|
-
{"app_owner"=>"eggs_aecl", "backup"=>{"to_s3"=>true}, "server"=>:db},
|
48
|
-
"eggs_hwag"=>
|
49
|
-
{"app_owner"=>"eggs_hwag", "backup"=>{"to_s3"=>true}, "server"=>:db},
|
50
|
-
"plus2_gemcutter"=>{"app_owner"=>"plus2_gemcutter", "server"=>:db},
|
51
|
-
"isg_sandbox_v5"=>
|
52
|
-
{"app_owner"=>"isg_sandbox_v5", "server"=>:isg_forums_mysql},
|
53
|
-
"amc_exam"=>
|
54
|
-
{"app_owner"=>"amc_exam", "backup"=>{"to_s3"=>true}, "server"=>:amc},
|
55
|
-
"weatherzone_wzfb"=>
|
56
|
-
{"app_owner"=>"weatherzone_wzfb", "backup"=>{"to_s3"=>true}, "server"=>:db},
|
57
|
-
"amc_store_staging"=>
|
58
|
-
{"app_owner"=>"amc_store", "server"=>:plus2staging_local_mysql}
|
8
|
+
"micropower_micropower_sandbox" => {"app_owner" => "micropower_micropower_sandbox", "server" => :db},
|
9
|
+
"post_froggy" => {"app_owner" => "froggy_owner", "backup" => {"to_s3" => true}, "server" => :postfrog},
|
10
|
+
"myfrogdb" => {"app_owner" => :myfroggy, "server" => :myfrog},
|
11
|
+
"eggs_hwag" => {"app_owner" => "eggs_hwag", "backup" => {"to_s3" => true}, "server" => :db},
|
12
|
+
"isg_sandbox_v5" => {"app_owner" => "isg_sandbox_v5", "server" => :isg_forums_mysql},
|
59
13
|
}}
|
60
14
|
end
|
61
15
|
|
@@ -67,11 +21,34 @@ eg 'duping copies symbols' do
|
|
67
21
|
Assert( ah2.database.isg_sandbox_v5.server == @original['database']['isg_sandbox_v5']['server'] )
|
68
22
|
end
|
69
23
|
|
24
|
+
def same_obj(a,b)
|
25
|
+
a.__id__ == b.__id__
|
26
|
+
end
|
27
|
+
|
28
|
+
def diff_obj(a,b)
|
29
|
+
! same_obj(a,b)
|
30
|
+
end
|
31
|
+
|
32
|
+
eg 'dup is deep' do
|
33
|
+
ah = AngryHash[ @original ]
|
34
|
+
ah2 = ah.dup
|
35
|
+
|
36
|
+
Assert( diff_obj ah , ah2 )
|
37
|
+
Assert( diff_obj ah.database , ah2.database )
|
38
|
+
Assert( diff_obj ah.database.post_froggy , ah2.database.post_froggy )
|
39
|
+
Assert( diff_obj ah.database.post_froggy.backup, ah2.database.post_froggy.backup )
|
40
|
+
|
41
|
+
end
|
42
|
+
|
70
43
|
module Extendo
|
71
44
|
def as_dag
|
72
45
|
dag = dup
|
73
46
|
dag
|
74
47
|
end
|
48
|
+
|
49
|
+
def is_extended?
|
50
|
+
true
|
51
|
+
end
|
75
52
|
end
|
76
53
|
|
77
54
|
eg 'duping from ext' do
|
@@ -80,9 +57,30 @@ eg 'duping from ext' do
|
|
80
57
|
|
81
58
|
ah2 = ah.as_dag
|
82
59
|
|
83
|
-
Show( AngryHash.shooper )
|
84
60
|
Show( ah.__id__ )
|
85
61
|
Show( ah2.__id__ )
|
86
62
|
|
87
63
|
Show( ah2 )
|
88
64
|
end
|
65
|
+
|
66
|
+
module ExtendoDb
|
67
|
+
def is_db_extended?
|
68
|
+
true
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
eg 'extension preservation' do
|
73
|
+
ah = AngryHash[ @original ]
|
74
|
+
Assert( ! ah.is_extended? )
|
75
|
+
Assert( ! ah.database.post_froggy.is_db_extended? )
|
76
|
+
|
77
|
+
ah.extend(Extendo)
|
78
|
+
ah.database.post_froggy.extend(ExtendoDb)
|
79
|
+
|
80
|
+
Assert( ah.is_extended? )
|
81
|
+
Assert( ah.database.post_froggy.is_db_extended? )
|
82
|
+
|
83
|
+
ah2 = ah.dup
|
84
|
+
Show( ah2.is_extended? )
|
85
|
+
Show( ah2.database.post_froggy.is_db_extended? )
|
86
|
+
end
|
data/examples/eg_helper.rb
CHANGED
data/examples/merge_eg.rb
CHANGED
@@ -0,0 +1,44 @@
|
|
1
|
+
class AngryHash
|
2
|
+
module DSL
|
3
|
+
# from ActiveSupport 3
|
4
|
+
if defined? ::BasicObject
|
5
|
+
# A class with no predefined methods that behaves similarly to Builder's
|
6
|
+
# BlankSlate. Used for proxy classes.
|
7
|
+
class BasicObject < ::BasicObject
|
8
|
+
undef_method :==
|
9
|
+
undef_method :equal?
|
10
|
+
|
11
|
+
# Let BasicObject at least raise exceptions.
|
12
|
+
def raise(*args)
|
13
|
+
::Object.send(:raise, *args)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
else
|
17
|
+
class BasicObject #:nodoc:
|
18
|
+
instance_methods.each do |m|
|
19
|
+
undef_method(m) if m.to_s !~ /(?:^__|^nil\?$|^send$|^object_id$|^instance_eval$)/
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class Env < BasicObject
|
25
|
+
def __store
|
26
|
+
@store ||= {}
|
27
|
+
end
|
28
|
+
def method_missing(method,*args,&blk)
|
29
|
+
method_s = method.to_s
|
30
|
+
if method_s[/[A-Za-z0-9]$/] && args.size == 1
|
31
|
+
__store[method.to_s] = args.first
|
32
|
+
else
|
33
|
+
super
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def __eval_as_dsl(&blk)
|
39
|
+
env = Env.new
|
40
|
+
env.instance_eval(&blk)
|
41
|
+
deep_update(env.__store)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/angry_hash.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
+
|
1
2
|
class AngryHash < Hash
|
2
|
-
|
3
|
-
|
4
|
-
end
|
3
|
+
require 'angry_hash/dsl'
|
4
|
+
include AngryHash::DSL
|
5
5
|
|
6
6
|
def self.[](other)
|
7
7
|
super(__convert(other))
|
@@ -19,6 +19,10 @@ class AngryHash < Hash
|
|
19
19
|
regular_reader(__convert_key(key))
|
20
20
|
end
|
21
21
|
|
22
|
+
def id
|
23
|
+
regular_reader('id')
|
24
|
+
end
|
25
|
+
|
22
26
|
def dup_and_store(key,value)
|
23
27
|
regular_writer(__convert_key(key), self.class.__convert_value(value))
|
24
28
|
end
|
@@ -39,7 +43,8 @@ class AngryHash < Hash
|
|
39
43
|
end
|
40
44
|
|
41
45
|
def deep_merge(other_hash)
|
42
|
-
|
46
|
+
# XXX this should convert other to AHash!
|
47
|
+
self.regular_merge( other_hash ) do |key, oldval, newval|
|
43
48
|
oldval = AngryHash.__convert_value(oldval)
|
44
49
|
newval = AngryHash.__convert_value(newval)
|
45
50
|
|
@@ -119,17 +124,20 @@ class AngryHash < Hash
|
|
119
124
|
|
120
125
|
case method_s[-1]
|
121
126
|
when ?=
|
122
|
-
|
127
|
+
return super unless args.size == 1 && !block_given?
|
123
128
|
self[ key ] = args.first
|
124
129
|
|
125
130
|
when ??
|
131
|
+
return super unless args.empty? && !block_given?
|
126
132
|
!! self[key]
|
127
133
|
|
128
134
|
when ?!
|
135
|
+
return super unless args.empty?
|
129
136
|
self[key] = AngryHash.new unless self.key?(key)
|
130
137
|
self[key]
|
131
138
|
|
132
139
|
else
|
140
|
+
return super unless args.empty? && !block_given?
|
133
141
|
self[method_s]
|
134
142
|
end
|
135
143
|
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
+
- 1
|
7
8
|
- 0
|
8
|
-
|
9
|
-
version: 0.0.5
|
9
|
+
version: 0.1.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Lachie Cox
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-08-07 00:00:00 +10:00
|
18
18
|
default_executable:
|
19
19
|
dependencies: []
|
20
20
|
|
@@ -33,10 +33,13 @@ files:
|
|
33
33
|
- angry_hash.gemspec
|
34
34
|
- examples/accessors_eg.rb
|
35
35
|
- examples/creation_eg.rb
|
36
|
+
- examples/dsl.eg.rb
|
36
37
|
- examples/dup_eg.rb
|
37
38
|
- examples/eg_helper.rb
|
38
39
|
- examples/merge_eg.rb
|
39
40
|
- lib/angry_hash.rb
|
41
|
+
- lib/angry_hash/dsl.rb
|
42
|
+
- lib/angry_hash/extension_tracking.rb
|
40
43
|
- lib/angry_hash/merge_string.rb
|
41
44
|
has_rdoc: true
|
42
45
|
homepage: http://github.com/plus2/angry_hash
|