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.
- data/lib/deep_struct/array.rb +16 -0
- data/lib/deep_struct/file_reader.rb +39 -0
- data/lib/deep_struct/hash.rb +24 -0
- data/lib/deep_struct/version.rb +3 -0
- data/lib/deep_struct.rb +20 -0
- metadata +116 -0
|
@@ -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
|
+
|
data/lib/deep_struct.rb
ADDED
|
@@ -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:
|