ostruct2 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (7) hide show
  1. data/.ruby +63 -0
  2. data/Config.rb +73 -0
  3. data/DEMO.rdoc +110 -0
  4. data/HISTORY.rdoc +8 -0
  5. data/README.rdoc +24 -0
  6. data/lib/ostruct2.rb +150 -0
  7. metadata +92 -0
data/.ruby ADDED
@@ -0,0 +1,63 @@
1
+ ---
2
+ source:
3
+ - meta
4
+ authors:
5
+ - name: Trans
6
+ email: transfire@gmail.com
7
+ copyrights:
8
+ - holder: Rubyworks
9
+ year: '2010'
10
+ license: BSD-2-Clause
11
+ requirements:
12
+ - name: detroit
13
+ groups:
14
+ - build
15
+ development: true
16
+ - name: qed
17
+ groups:
18
+ - test
19
+ development: true
20
+ - name: ae
21
+ groups:
22
+ - test
23
+ development: true
24
+ dependencies: []
25
+ alternatives: []
26
+ conflicts: []
27
+ repositories:
28
+ - uri: git://github.com/rubyworks/ostruct2.git
29
+ scm: git
30
+ name: upstream
31
+ resources:
32
+ - uri: http://rubyworks.github.com/ostruct2
33
+ label: Website
34
+ type: home
35
+ - uri: http://rubydoc.info/gems/ostruct2/frames
36
+ label: Documentation
37
+ type: docs
38
+ - uri: http://github.com/rubyworks/ostruct2
39
+ label: Source Code
40
+ type: code
41
+ - uri: http://groups.google.com/group/rubyworks-mailinglist
42
+ label: Mailing List
43
+ type: mail
44
+ - uri: http://chat.us.freenode.net/rubyworks
45
+ label: IRC Channel
46
+ type: chat
47
+ categories: []
48
+ extra: {}
49
+ load_path:
50
+ - lib
51
+ revision: 0
52
+ created: '2010-04-21'
53
+ summary: A Better OpenStruct
54
+ title: OStruct2
55
+ version: 0.1.0
56
+ name: ostruct2
57
+ description: ! 'OStruct2 is a reimplementation of Ruby''s standard ostruct.rb library.
58
+
59
+ This new OpenStruct class addresses issues the original has with conflicting
60
+
61
+ member names and cloning.'
62
+ organization: Rubyworks
63
+ date: '2012-05-20'
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #
4
+ # QED test coverage report using SimpleCov.
5
+ #
6
+ # Use `$properties.coverage_folder` to set directory in which to store
7
+ # coverage report this defaults to `log/coverage`.
8
+ #
9
+ # IMPORTANT! Unfortunately this will not give us a reliable report
10
+ # b/c QED uses the RC gem, so SimpleCov can't differentiate the two.
11
+ #
12
+ config 'qed', profile: 'cov' do
13
+ #puts "QED w/coverage!"
14
+ dir = $properties.coverage_folder
15
+ require 'simplecov'
16
+ SimpleCov.command_name 'QED'
17
+ SimpleCov.start do
18
+ coverage_dir(dir || 'log/coverage')
19
+ #add_group "Label", "lib/qed/directory"
20
+ end
21
+ end
22
+
23
+ #
24
+ # Pry
25
+ #
26
+ config 'pry' do
27
+ puts "RC on Pry!"
28
+ $LOAD_PATH.unshift('lib')
29
+ end
30
+
31
+ #
32
+ # Rake tasks
33
+ #
34
+ config 'rake' do
35
+ desc 'run unit tests'
36
+ task 'test' do
37
+ sh 'qed'
38
+ end
39
+ end
40
+
41
+ =begin
42
+ #
43
+ # Detroit assembly.
44
+ #
45
+ config 'detroit' do
46
+ service :email do |s|
47
+ s.mailto = ['ruby-talk@ruby-lang.org',
48
+ 'rubyworks-mailinglist@googlegroups.com']
49
+ end
50
+
51
+ service :gem do |s|
52
+ s.gemspec = 'pkg/ostruct2.gemspec'
53
+ end
54
+
55
+ service :github do |s|
56
+ s.folder = 'web'
57
+ end
58
+
59
+ service :dnote do |s|
60
+ s.title = 'Source Notes'
61
+ s.output = 'log/notes.html'
62
+ end
63
+
64
+ service :locat do |s|
65
+ s.output = 'log/locat.html'
66
+ end
67
+
68
+ service :vclog do |s|
69
+ s.output = ['log/history.html',
70
+ 'log/changes.html']
71
+ end
72
+ end
73
+ =end
@@ -0,0 +1,110 @@
1
+ # OpenStruct
2
+
3
+ The constructor can take a priming hash.
4
+
5
+ o = OpenStruct.new(:a=>1,:b=>2)
6
+ o.a #=> 1
7
+ o.b #=> 2
8
+
9
+ It can also take a default procedure, just like an Hash.
10
+
11
+ o = OpenStruct.new{ |h,k| h[k] = {} }
12
+ o.a #=> {}
13
+
14
+ Common usage of an OpenStruct is via the missing method dynamic calls.
15
+ An entry can be made by making an assignment and read back via the
16
+ same method call.
17
+
18
+ o = OpenStruct.new
19
+ o.a = 1
20
+ o.a #=> 1
21
+
22
+ Key existence can also be checked by adding a question mark.
23
+
24
+ o.a? #=> true
25
+
26
+ OpenStruct "circa 2" has a CRUDified design. There are only a few primary
27
+ methods that handle access to the underlying table and all other methods
28
+ route through these. Primarily they are `#read!`, `#store!`, `#delete!`
29
+ as well as `#key?` and `#keys!`.
30
+
31
+ o = OpenStruct.new
32
+ o.store!(:a, 1)
33
+ o.read!(:a) #=> 1
34
+ o.key?(:a) #=> true
35
+ o.keys! #=> [:a]
36
+ o.delete!(:a)
37
+ o.empty? #=> true
38
+
39
+ OpenStruct offers a number of methods to access the underlying table.
40
+ Each of these ends in a exlimation mark, and include `#fetch!`, `#update!`,
41
+ and `merge!`.
42
+
43
+ o = OpenStruct.new
44
+ o.update!(:a=>1, :b=>2)
45
+ o.fetch!(:a) #=> 1
46
+
47
+ Note that `#merge!` is akin to `Hash#merge`, not `Hash#merge!` --it does not
48
+ act in-place.
49
+
50
+ o = OpenStruct.new
51
+ x = o.merge!(:a=>1, :b=>2)
52
+ o.a #=> nil
53
+ x.a #=> 1
54
+
55
+ OpenStruct also supports Hash-like read and write operators, #[] and #[]=.
56
+
57
+ o = OpenStruct.new
58
+ o[:a] = 1
59
+ o[:a] #=> 1
60
+ o.a #=> 1
61
+
62
+ The OpenStruct object can be converted to a simple Hash, via `#to_h`.
63
+
64
+ o = OpenStruct.new(:a=>1,:b=>2)
65
+ o.to_h #=> {:a=>1, :b=>2}
66
+
67
+ Iteration can be achieved with `#each!`.
68
+
69
+ o = OpenStruct.new(:a=>1,:b=>2)
70
+ a = {}
71
+ o.each! do |k,v|
72
+ a[k] = v
73
+ end
74
+ a #=> {:a=>1, :b=>2}
75
+
76
+ Currently all Enumerable methods will work if suffixed with an exclemation mark. But they operate
77
+ directly on the underlying Hash rather than at the level of the "CRUDified" OpenStruct itself.
78
+
79
+ o = OpenStruct.new(:a=>1,:b=>2)
80
+ a = o.map!{ |k,v| [k,v] }
81
+ a #=> [[:a,1], [:b,2]]
82
+
83
+ In most cases this will work fine. But it may cause some minor discrepencies in how Enumerable
84
+ methods work presently and how ultimatley they should work. A fix is a bit tricky so this is an
85
+ endeavor left a future release. In the rare cases where it does matters, proper enumeratorion
86
+ can be assured by calling `#to_enum` first.
87
+
88
+ o = OpenStruct.new(:a=>1,:b=>2)
89
+ a = {}
90
+ o.to_enum.each do |k,v|
91
+ a[k] = v
92
+ end
93
+ a #=> {:a=>1, :b=>2}
94
+
95
+ OpenStruct also has a unique method called `#key!` that is used to check for an key entry,
96
+ and raise a KeyError if it not found.
97
+
98
+ o = OpenStruct.new
99
+ expect KeyError do
100
+ o.key!(:x)
101
+ end
102
+
103
+ Lastly, OpenStruct has a convenient feature for creating cascading OpenStructs.
104
+
105
+ o = OpenStruct.cascade
106
+ o.x.a = 1
107
+ o.x.a #=> 1
108
+ OpenStruct.assert === o.a
109
+
110
+
@@ -0,0 +1,8 @@
1
+ = RELEASE HISTORY
2
+
3
+ 0.1.0 | 2011-01-01
4
+
5
+ Summary of release...
6
+
7
+ * First release.
8
+
@@ -0,0 +1,24 @@
1
+ = OpenStruct 2
2
+
3
+ {Website}[http://rubyworks.github.com/ostruct2] /
4
+ {Report Issue}[http://github.com/rubyworks/ostruct2/issues] /
5
+ {Source Code}[http://github.com/rubyworks/ostruct2]
6
+
7
+ {<img src="https://secure.travis-ci.org/rubyworks/ostruct2.png" />}[http://travis-ci.org/rubyworks/ostruct2]
8
+
9
+
10
+ == Description
11
+
12
+ OStruct2 is a reimplementation of Ruby's standard ostruct.rb library.
13
+ This new OpenStruct class addresses issues the original has with conflicting
14
+ member names and cloning.
15
+
16
+
17
+ == Copyrights
18
+
19
+ Copyright (c) 2010 Rubyworks
20
+
21
+ OStruct2 is distributed under the *BSD-2-Clause* license.
22
+
23
+ See LICENSE.txt for detatils.
24
+
@@ -0,0 +1,150 @@
1
+ # A better OpenStruct class.
2
+ #
3
+ class OpenStruct < BasicObject
4
+
5
+ class << self
6
+ #
7
+ # Create cascading OpenStruct.
8
+ #
9
+ def cascade(data=nil)
10
+ leet = lambda{ |h,k| OpenStruct.new(&leet) }
11
+ new(&leet)
12
+ end
13
+
14
+ # Is there a better name for #auto?
15
+ #alias :autorenew :cascade
16
+
17
+ # Original name for #cascade method.
18
+ alias :auto :cascade
19
+ end
20
+
21
+ #
22
+ def initialize(data=nil, &block)
23
+ @table = ::Hash.new(&block)
24
+ update!(data || {})
25
+ end
26
+
27
+ #
28
+ def method_missing(sym, *args, &blk)
29
+ str = sym.to_s
30
+ type = str[-1,1]
31
+ name = str.chomp('=').chomp('!').chomp('?')
32
+
33
+ case type
34
+ when '='
35
+ store!(name, args.first)
36
+ when '!'
37
+ @table.public_send(name, *args, &blk)
38
+ when '?'
39
+ key?(name)
40
+ else
41
+ read!(name)
42
+ end
43
+ end
44
+
45
+ # CRUD method for listing all keys.
46
+ def keys!
47
+ @table.keys
48
+ end
49
+
50
+ # Also a CRUD method like #read!, but for checking for the existence of a key.
51
+ def key?(key)
52
+ @table.key?(key.to_sym)
53
+ end
54
+
55
+ # The CRUD method for read.
56
+ def read!(key)
57
+ @table[key.to_sym]
58
+ end
59
+
60
+ # The CRUD method for create and update.
61
+ def store!(key, value)
62
+ @table[key.to_sym] = value
63
+ end
64
+
65
+ # The CRUD method for destroy.
66
+ def delete!(key)
67
+ @table.delete(key.to_sym)
68
+ end
69
+
70
+ #
71
+ # Like #read but will raise a KeyError if key is not found.
72
+ #
73
+ def fetch!(key)
74
+ key!(key)
75
+ read!(key)
76
+ end
77
+
78
+ #
79
+ def [](key)
80
+ read!(key)
81
+ end
82
+
83
+ #
84
+ def []=(key, value)
85
+ store!(key, value)
86
+ end
87
+
88
+ # CRUDified each.
89
+ def each!
90
+ @table.each_key do |key|
91
+ yield(key, read!(key))
92
+ end
93
+ end
94
+
95
+ # CRUDified update method.
96
+ def update!(other)
97
+ other.each do |k,v|
98
+ store!(k,v)
99
+ end
100
+ end
101
+
102
+ #
103
+ # IMPORTANT! This method does not act in-place like `Hash#merge!`,
104
+ # rather it works like `Hash#merge`.
105
+ #
106
+ def merge!(other)
107
+ # TODO: is there anyway to #dup a BasicObject subclass instance?
108
+ o = ::OpenStruct.new(@table, &@table.default_proc)
109
+ other.each do |k,v|
110
+ o.store!(k,v)
111
+ end
112
+ o
113
+ end
114
+
115
+ #
116
+ # Is the OpenStruct void of entries?
117
+ #
118
+ def empty?
119
+ @table.empty?
120
+ end
121
+
122
+ #
123
+ # Get a duplicate of the underlying table.
124
+ #
125
+ def to_h
126
+ @table.dup
127
+ end
128
+
129
+ #
130
+ def to_enum
131
+ ::Enumerator.new(self, :each!)
132
+ end
133
+
134
+ #
135
+ # If key is not present raise a KeyError.
136
+ #
137
+ def key!(key)
138
+ return key if key?(key)
139
+ ::Kernel.raise ::KeyError, ("key not found: %s" % [key.inspect])
140
+ end
141
+
142
+ #
143
+ #
144
+ #
145
+ def inspect
146
+ "#<OpenStruct: #{@table.inspect}>"
147
+ end
148
+
149
+ end
150
+
metadata ADDED
@@ -0,0 +1,92 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ostruct2
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Trans
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-05-20 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: detroit
16
+ requirement: &26950880 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *26950880
25
+ - !ruby/object:Gem::Dependency
26
+ name: qed
27
+ requirement: &26950340 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *26950340
36
+ - !ruby/object:Gem::Dependency
37
+ name: ae
38
+ requirement: &26949840 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *26949840
47
+ description: ! 'OStruct2 is a reimplementation of Ruby''s standard ostruct.rb library.
48
+
49
+ This new OpenStruct class addresses issues the original has with conflicting
50
+
51
+ member names and cloning.'
52
+ email:
53
+ - transfire@gmail.com
54
+ executables: []
55
+ extensions: []
56
+ extra_rdoc_files:
57
+ - HISTORY.rdoc
58
+ - DEMO.rdoc
59
+ - README.rdoc
60
+ files:
61
+ - .ruby
62
+ - lib/ostruct2.rb
63
+ - HISTORY.rdoc
64
+ - DEMO.rdoc
65
+ - README.rdoc
66
+ - Config.rb
67
+ homepage:
68
+ licenses:
69
+ - BSD-2-Clause
70
+ post_install_message:
71
+ rdoc_options: []
72
+ require_paths:
73
+ - lib
74
+ required_ruby_version: !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ! '>='
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ requirements: []
87
+ rubyforge_project:
88
+ rubygems_version: 1.8.11
89
+ signing_key:
90
+ specification_version: 3
91
+ summary: A Better OpenStruct
92
+ test_files: []