structure 0.0.1 → 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/.gitignore CHANGED
@@ -1,3 +1,5 @@
1
1
  pkg/*
2
2
  *.gem
3
3
  .bundle
4
+ .rvmrc
5
+ Gemfile.lock
data/README.md ADDED
@@ -0,0 +1,25 @@
1
+ Structure
2
+ =========
3
+
4
+ Structure is a nested OpenStruct implementation. Or, recursively put, Structure is a truly OpenStruct OpenStruct.
5
+
6
+ require 'structure'
7
+
8
+ source = {
9
+ :title => 'Mille Plateaux',
10
+ :authors => [
11
+ {
12
+ :name => "Deleuze",
13
+ }
14
+ ],
15
+ :publisher => {
16
+ :name => "Minuit",
17
+ }
18
+
19
+ book = Structure.new(source)
20
+
21
+ puts book.authors.first.name
22
+ => "Gilles Deleuze"
23
+
24
+ puts book.publisher.name
25
+ => "Minuit"
data/lib/structure.rb CHANGED
@@ -1,3 +1,44 @@
1
- module Structure
2
- # Your code goes here...
1
+ require 'ostruct'
2
+
3
+ #
4
+ # Structure is a nested OpenStruct implementation.
5
+ #
6
+ class Structure < OpenStruct
7
+ def initialize(source = {})
8
+ @table = {}
9
+ source.each do |k, v|
10
+ @table[k.to_sym] = structure(v)
11
+ new_ostruct_member(k)
12
+ end
13
+ end
14
+
15
+ def method_missing(mid, *args) # :nodoc:
16
+ mname = mid.id2name
17
+ len = args.length
18
+ if mname.chomp!('=')
19
+ if len != 1
20
+ raise ArgumentError, "wrong number of arguments (#{len} for 1)", caller(1)
21
+ end
22
+ modifiable[new_ostruct_member(mname)] = structure(args[0])
23
+ elsif len == 0
24
+ @table[mid]
25
+ else
26
+ raise NoMethodError, "undefined method `#{mname}' for #{self}", caller(1)
27
+ end
28
+ end
29
+
30
+ alias :to_hash :marshal_dump
31
+
32
+ private
33
+
34
+ def structure(o)
35
+ case o
36
+ when Hash
37
+ self.class.new(o)
38
+ when Array
39
+ o.map { |o| structure(o) }
40
+ else
41
+ o
42
+ end
43
+ end
3
44
  end
data/structure.gemspec CHANGED
@@ -1,16 +1,13 @@
1
1
  # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "structure/version"
4
-
5
2
  Gem::Specification.new do |s|
6
3
  s.name = "structure"
7
- s.version = Structure::VERSION
4
+ s.version = "0.1.0"
8
5
  s.platform = Gem::Platform::RUBY
9
6
  s.authors = ["Paper Cavalier"]
10
7
  s.email = ["code@papercavalier.com"]
11
8
  s.homepage = ""
12
- s.summary = %q{Stub}
13
- s.description = %q{Stub}
9
+ s.summary = %q{Structure is a nested OpenStruct implementation.}
10
+ s.description = %q{A nested OpenStruct implementation}
14
11
 
15
12
  s.rubyforge_project = "structure"
16
13
 
@@ -0,0 +1,46 @@
1
+ require 'minitest/spec'
2
+ require File.expand_path('../../lib/structure', __FILE__)
3
+
4
+ MiniTest::Unit.autorun
5
+
6
+ describe Structure do
7
+ before do
8
+ @hash = {
9
+ :name => "John",
10
+ :children => [ { :name => "Jim" } ],
11
+ :location => { :city => { :name => "London" } }
12
+ }
13
+ end
14
+
15
+ describe ".new" do
16
+ before do
17
+ @person = Structure.new(@hash)
18
+ end
19
+
20
+ it "structures nested hashes" do
21
+ @person.location.city.name.must_equal "London"
22
+ end
23
+
24
+ it "structures hashes in arrays" do
25
+ @person.children.must_be_instance_of Array
26
+ @person.children.first.name.must_equal "Jim"
27
+ end
28
+ end
29
+
30
+ describe "#=" do
31
+ before do
32
+ @person = Structure.new
33
+ end
34
+
35
+ it "structures nested hashes" do
36
+ @person.location = { :city => { :name => "London" } }
37
+ @person.location.city.name.must_equal "London"
38
+ end
39
+
40
+ it "structures hashes in arrays" do
41
+ @person.children = [ { :name => "Jim" } ]
42
+ @person.children.must_be_instance_of Array
43
+ @person.children.first.name.must_equal "Jim"
44
+ end
45
+ end
46
+ end
metadata CHANGED
@@ -1,12 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: structure
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 0
8
- - 1
9
- version: 0.0.1
4
+ prerelease:
5
+ version: 0.1.0
10
6
  platform: ruby
11
7
  authors:
12
8
  - Paper Cavalier
@@ -14,11 +10,11 @@ autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
12
 
17
- date: 2010-12-09 00:00:00 +00:00
13
+ date: 2011-02-09 00:00:00 +00:00
18
14
  default_executable:
19
15
  dependencies: []
20
16
 
21
- description: Stub
17
+ description: A nested OpenStruct implementation
22
18
  email:
23
19
  - code@papercavalier.com
24
20
  executables: []
@@ -30,10 +26,11 @@ extra_rdoc_files: []
30
26
  files:
31
27
  - .gitignore
32
28
  - Gemfile
29
+ - README.md
33
30
  - Rakefile
34
31
  - lib/structure.rb
35
- - lib/structure/version.rb
36
32
  - structure.gemspec
33
+ - test/structure_test.rb
37
34
  has_rdoc: true
38
35
  homepage: ""
39
36
  licenses: []
@@ -48,23 +45,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
48
45
  requirements:
49
46
  - - ">="
50
47
  - !ruby/object:Gem::Version
51
- segments:
52
- - 0
53
48
  version: "0"
54
49
  required_rubygems_version: !ruby/object:Gem::Requirement
55
50
  none: false
56
51
  requirements:
57
52
  - - ">="
58
53
  - !ruby/object:Gem::Version
59
- segments:
60
- - 0
61
54
  version: "0"
62
55
  requirements: []
63
56
 
64
57
  rubyforge_project: structure
65
- rubygems_version: 1.3.7
58
+ rubygems_version: 1.5.0
66
59
  signing_key:
67
60
  specification_version: 3
68
- summary: Stub
69
- test_files: []
70
-
61
+ summary: Structure is a nested OpenStruct implementation.
62
+ test_files:
63
+ - test/structure_test.rb
@@ -1,3 +0,0 @@
1
- module Structure
2
- VERSION = "0.0.1"
3
- end