deep_struct 0.0.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.
@@ -0,0 +1,16 @@
1
+ class DeepStruct::Array < Array
2
+ def [](index)
3
+ v = super
4
+ return DeepStruct::Hash.new(v) if v.is_a?(::Hash)
5
+ return DeepStruct::Array.new(v) if v.is_a?(::Array)
6
+ return v
7
+ end
8
+
9
+ # The annoyance of subclassing Array is that ruby implements many array
10
+ # methods directly in C, bypassing my pretty little [] method above. I
11
+ # expect to implement many methods like #first in the future
12
+
13
+ def first
14
+ self[0]
15
+ end
16
+ end
@@ -0,0 +1,39 @@
1
+ class DeepStruct::FileReader
2
+ class UnknownFileFormat < RuntimeError; end
3
+
4
+ def initialize(path)
5
+ @path = path
6
+ @type = extract_type
7
+ bad_type! unless @type
8
+ end
9
+
10
+ def data
11
+ send("read_#{@type}_file")
12
+ rescue NoMethodError
13
+ bad_type!
14
+ end
15
+
16
+ private
17
+
18
+ def bad_type!
19
+ raise UnknownFileFormat.new(
20
+ "Unsupported filetype (#{@type.inspect}) for #{@path}")
21
+ end
22
+
23
+ def extract_type
24
+ @path.split(".").last.downcase
25
+ end
26
+
27
+ def contents
28
+ File.read(@path)
29
+ end
30
+
31
+ def read_json_file
32
+ JSON.load(contents)
33
+ end
34
+
35
+ def read_yaml_file
36
+ YAML.load(contents)
37
+ end
38
+ alias read_yml_file read_yaml_file
39
+ end
@@ -0,0 +1,24 @@
1
+ class DeepStruct::Hash < Hash
2
+
3
+ def initialize(hash)
4
+ hash.each do |k, v|
5
+ self[k.to_sym] = v
6
+ end
7
+ end
8
+
9
+ def [](key)
10
+ v = super(key)
11
+ return DeepStruct::Hash.new(v) if v.is_a?(::Hash)
12
+ return DeepStruct::Array.new(v) if v.is_a?(::Array)
13
+ return v
14
+ end
15
+
16
+ def method_missing(key, *args, &block)
17
+ self[key]
18
+ end
19
+
20
+ def responds_to?(method)
21
+ self[method]
22
+ end
23
+ end
24
+
@@ -0,0 +1,3 @@
1
+ module DeepStruct
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,20 @@
1
+ require 'json'
2
+
3
+ module DeepStruct
4
+ def self.from_data(data)
5
+ case data
6
+ when ::Array then DeepStruct::Array.new(data)
7
+ when ::Hash then DeepStruct::Hash.new(data)
8
+ else
9
+ raise "Unrecognized data: #{data.inspect}"
10
+ end
11
+ end
12
+
13
+ def self.from_file(path)
14
+ from_data(FileReader.new(path).data)
15
+ end
16
+ end
17
+
18
+ require "deep_struct/array"
19
+ require "deep_struct/hash"
20
+ require "deep_struct/file_reader"
metadata ADDED
@@ -0,0 +1,116 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: deep_struct
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Thunderbolt Labs
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-02-06 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: guard
16
+ requirement: &70223701562840 !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: *70223701562840
25
+ - !ruby/object:Gem::Dependency
26
+ name: guard-rspec
27
+ requirement: &70223701562000 !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: *70223701562000
36
+ - !ruby/object:Gem::Dependency
37
+ name: guard-bundler
38
+ requirement: &70223701561580 !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: *70223701561580
47
+ - !ruby/object:Gem::Dependency
48
+ name: ruby_gntp
49
+ requirement: &70223701560940 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70223701560940
58
+ - !ruby/object:Gem::Dependency
59
+ name: rspec
60
+ requirement: &70223701560000 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70223701560000
69
+ - !ruby/object:Gem::Dependency
70
+ name: gem-release
71
+ requirement: &70223701559180 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *70223701559180
80
+ description: That's about it, really.
81
+ email: us@thunderboltlabs.com
82
+ executables: []
83
+ extensions: []
84
+ extra_rdoc_files: []
85
+ files:
86
+ - lib/deep_struct.rb
87
+ - lib/deep_struct/array.rb
88
+ - lib/deep_struct/file_reader.rb
89
+ - lib/deep_struct/hash.rb
90
+ - lib/deep_struct/version.rb
91
+ homepage: https://github.com/thunderboltlabs/deep_struct
92
+ licenses: []
93
+ post_install_message:
94
+ rdoc_options: []
95
+ require_paths:
96
+ - lib
97
+ required_ruby_version: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ required_rubygems_version: !ruby/object:Gem::Requirement
104
+ none: false
105
+ requirements:
106
+ - - ! '>='
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ requirements: []
110
+ rubyforge_project: ! '[none]'
111
+ rubygems_version: 1.8.11
112
+ signing_key:
113
+ specification_version: 3
114
+ summary: Converts ruby hashes and arrays into objects.
115
+ test_files: []
116
+ has_rdoc: