deep_struct 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: