datastruct 0.0.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.
- checksums.yaml +7 -0
- data/lib/datastruct.rb +248 -0
- metadata +146 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: dc2efcd0a11b90fdfd9e8d1ebfb5496fa2a80888
|
4
|
+
data.tar.gz: ee44790d4e784c8d779f5ebe0517a1d78a39dac5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 69ecf1c5bcd286128f57ed7d251a90432a02a6f0aad0469a36b22d67964f0800ef988e52087c497b5558893ea8d26fd7a8ec4f6795ac7382def5ff8043c7e449
|
7
|
+
data.tar.gz: 12efa716b186c329e22d000c2c0bd0b6fad444bfac269df34749df19612778e4bc172a8f3727ca934b9704ec65c2844d1d843375bc0803e316490baeff13a5e7
|
data/lib/datastruct.rb
ADDED
@@ -0,0 +1,248 @@
|
|
1
|
+
|
2
|
+
##
|
3
|
+
# A factory method for DataStruct subclasses
|
4
|
+
#
|
5
|
+
def DataStruct(*props, &block)
|
6
|
+
Class.new(DataStruct) { |cls|
|
7
|
+
cls.const_set(:PROPERTIES, props)
|
8
|
+
|
9
|
+
class_exec(&block) unless block.nil?
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
class DataStruct
|
14
|
+
VERSION = "0.0.1"
|
15
|
+
|
16
|
+
##
|
17
|
+
# A more ideomatic way of calling +new(*array)+
|
18
|
+
#
|
19
|
+
def self.from_array(array)
|
20
|
+
self.new(*array)
|
21
|
+
end
|
22
|
+
|
23
|
+
##
|
24
|
+
# A more ideomatic way of calling +new(**hash)+
|
25
|
+
#
|
26
|
+
def self.from_hash(hash)
|
27
|
+
self.new(**hash)
|
28
|
+
end
|
29
|
+
|
30
|
+
def initialize(*args, **kwargs)
|
31
|
+
@data ||= {}
|
32
|
+
|
33
|
+
self.update(*args)
|
34
|
+
self.update(**kwargs)
|
35
|
+
end
|
36
|
+
|
37
|
+
##
|
38
|
+
# Delegates to +Hash#each+
|
39
|
+
#
|
40
|
+
# @see http://ruby-doc.org/core-2.0.0/Hash.html#method-i-each Hash#each
|
41
|
+
# @overload each
|
42
|
+
#
|
43
|
+
def each(*args, &block)
|
44
|
+
@data.each(*args, &block)
|
45
|
+
end
|
46
|
+
|
47
|
+
##
|
48
|
+
# Returns a property using its getter method
|
49
|
+
#
|
50
|
+
# @param [String, Symbol] property
|
51
|
+
# @raise [KeyError] on invalid property name
|
52
|
+
#
|
53
|
+
def get(property)
|
54
|
+
property = property.to_sym
|
55
|
+
|
56
|
+
if not valid_property? property
|
57
|
+
fail KeyError, "Property not defined: #{property}"
|
58
|
+
end
|
59
|
+
|
60
|
+
self.send(property)
|
61
|
+
end
|
62
|
+
|
63
|
+
alias_method :[], :get
|
64
|
+
|
65
|
+
##
|
66
|
+
# Produces a text representation of the object
|
67
|
+
#
|
68
|
+
def inspect
|
69
|
+
text = "#<#{self.class.to_s}"
|
70
|
+
|
71
|
+
text << @data.reduce("") { |a, pair|
|
72
|
+
a << " #{pair[0]}=#{pair[1].inspect}"
|
73
|
+
}
|
74
|
+
|
75
|
+
text << ">"
|
76
|
+
|
77
|
+
return text
|
78
|
+
end
|
79
|
+
|
80
|
+
def respond_to?(method_name)
|
81
|
+
if valid_property?(method_name) or valid_property?(getter(method_name))
|
82
|
+
true
|
83
|
+
else
|
84
|
+
super
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
##
|
89
|
+
# Sets the value of a property using its setter method
|
90
|
+
#
|
91
|
+
# @param [String, Symbol] property
|
92
|
+
# @param [Object] value
|
93
|
+
# @raise [KeyError] on invalid property name
|
94
|
+
#
|
95
|
+
def set(property, value)
|
96
|
+
property = property.to_sym
|
97
|
+
|
98
|
+
if not valid_property? property
|
99
|
+
fail KeyError, "Property not defined: #{property}"
|
100
|
+
end
|
101
|
+
|
102
|
+
self.send(setter(property), value)
|
103
|
+
end
|
104
|
+
|
105
|
+
alias_method :[]=, :set
|
106
|
+
|
107
|
+
##
|
108
|
+
# Returns the properties of the object as an array
|
109
|
+
#
|
110
|
+
# @return [Array]
|
111
|
+
#
|
112
|
+
def to_array
|
113
|
+
self.class::PROPERTIES.map { |name| @data[name] }
|
114
|
+
end
|
115
|
+
|
116
|
+
alias_method :to_a, :to_array
|
117
|
+
|
118
|
+
##
|
119
|
+
# Returns the properties of the object as a hash
|
120
|
+
#
|
121
|
+
# @return [Hash]
|
122
|
+
#
|
123
|
+
def to_hash
|
124
|
+
@data.dup
|
125
|
+
end
|
126
|
+
|
127
|
+
alias_method :to_h, :to_hash
|
128
|
+
|
129
|
+
##
|
130
|
+
# Dumps the properties of this object to JSON using Ruby's JSON module
|
131
|
+
#
|
132
|
+
# @note JSON must be loaded for this function to work
|
133
|
+
# @see http://www.ruby-doc.org/stdlib-2.0/libdoc/json/rdoc/JSON.html JSON
|
134
|
+
# @return [String]
|
135
|
+
#
|
136
|
+
def to_json(*args)
|
137
|
+
@data.to_json(*args)
|
138
|
+
end
|
139
|
+
|
140
|
+
##
|
141
|
+
# Dumps the properties of this object to YAML using Ruby's YAML module
|
142
|
+
#
|
143
|
+
# @note YAML must be loaded for this function to work
|
144
|
+
# @see http://ruby-doc.org/stdlib-2.0.0/libdoc/yaml/rdoc/YAML.html YAML
|
145
|
+
# @return [String]
|
146
|
+
#
|
147
|
+
def to_yaml(*args)
|
148
|
+
@data.to_yaml(*args)
|
149
|
+
end
|
150
|
+
|
151
|
+
##
|
152
|
+
# Updates the values of this object's properties
|
153
|
+
#
|
154
|
+
# Both positional arguments and keyword arguments are used to update the
|
155
|
+
# property values of the object. Positional arguments should be passed in the
|
156
|
+
# same order as the defined properties.
|
157
|
+
#
|
158
|
+
# @note Keyword arguments override posisional arguments
|
159
|
+
# @raise [ArgumentError] on invalid property names
|
160
|
+
# @return nil
|
161
|
+
#
|
162
|
+
def update(*args, **kwargs)
|
163
|
+
@data ||= {}
|
164
|
+
|
165
|
+
if args.length > self.class::PROPERTIES.length
|
166
|
+
x = args.length
|
167
|
+
y = self.class::PROPERTIES.length
|
168
|
+
msg = "Too many arguments (you passed #{x} arguments for #{y} properties)"
|
169
|
+
|
170
|
+
fail ArgumentError, msg
|
171
|
+
end
|
172
|
+
|
173
|
+
hash = Hash[self.class::PROPERTIES[0...args.length].zip(args)]
|
174
|
+
hash.update(kwargs)
|
175
|
+
|
176
|
+
hash.each_pair { |key, value|
|
177
|
+
begin
|
178
|
+
self.set(key, value)
|
179
|
+
rescue KeyError => e
|
180
|
+
fail ArgumentError, "Invalid property: #{key}"
|
181
|
+
end
|
182
|
+
}
|
183
|
+
|
184
|
+
nil
|
185
|
+
end
|
186
|
+
|
187
|
+
private
|
188
|
+
|
189
|
+
##
|
190
|
+
# This makes the struct accept the defined properties as instance methods
|
191
|
+
#
|
192
|
+
def method_missing(name, *args, &block)
|
193
|
+
property = name
|
194
|
+
set = false
|
195
|
+
|
196
|
+
if is_setter?(property)
|
197
|
+
property = getter(name)
|
198
|
+
set = true
|
199
|
+
end
|
200
|
+
|
201
|
+
if valid_property? property
|
202
|
+
if set
|
203
|
+
@data[property] = args.first
|
204
|
+
else
|
205
|
+
@data[property]
|
206
|
+
end
|
207
|
+
else
|
208
|
+
super
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
##
|
213
|
+
# Returns true if +prop+ is a valid property
|
214
|
+
#
|
215
|
+
def valid_property?(prop)
|
216
|
+
self.class::PROPERTIES.include? prop
|
217
|
+
end
|
218
|
+
|
219
|
+
##
|
220
|
+
# @example
|
221
|
+
# is_setter?(:foo) # => false
|
222
|
+
# is_setter?(:foo=) # => true
|
223
|
+
#
|
224
|
+
def is_setter?(sym)
|
225
|
+
sym.to_s.end_with?("=")
|
226
|
+
end
|
227
|
+
|
228
|
+
##
|
229
|
+
# @example
|
230
|
+
# setter(:foo) # => :foo=
|
231
|
+
#
|
232
|
+
def setter(sym)
|
233
|
+
(sym.to_s + "=").to_sym
|
234
|
+
end
|
235
|
+
|
236
|
+
##
|
237
|
+
# @example
|
238
|
+
# getter(:foo=) # => :foo
|
239
|
+
# getter(:foo) # => :foo
|
240
|
+
#
|
241
|
+
def getter(sym)
|
242
|
+
if is_setter?(sym)
|
243
|
+
sym.to_s[0..-2].to_sym
|
244
|
+
else
|
245
|
+
sym
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
metadata
ADDED
@@ -0,0 +1,146 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: datastruct
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Tomas Sandven
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-12-05 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: minitest
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '5'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '5'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: mocha
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: byebug
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: yard
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ~>
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: redcarpet
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ~>
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '3'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ~>
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '3'
|
111
|
+
description: |2
|
112
|
+
Datastruct is made to be a more feature rich alternative to Ruby's Struct
|
113
|
+
class. It defines several methods common for data structures, like hash
|
114
|
+
lookup and serialization to JSON and YAML. See the README file for examples.
|
115
|
+
email: tomas191191@gmail.com
|
116
|
+
executables: []
|
117
|
+
extensions: []
|
118
|
+
extra_rdoc_files: []
|
119
|
+
files:
|
120
|
+
- lib/datastruct.rb
|
121
|
+
homepage: https://github.com/Hubro/Datastruct
|
122
|
+
licenses:
|
123
|
+
- GPL
|
124
|
+
metadata: {}
|
125
|
+
post_install_message:
|
126
|
+
rdoc_options: []
|
127
|
+
require_paths:
|
128
|
+
- lib
|
129
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
130
|
+
requirements:
|
131
|
+
- - '>='
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: 2.0.0
|
134
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - '>='
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
requirements: []
|
140
|
+
rubyforge_project:
|
141
|
+
rubygems_version: 2.2.2
|
142
|
+
signing_key:
|
143
|
+
specification_version: 4
|
144
|
+
summary: A great base class for data structures
|
145
|
+
test_files: []
|
146
|
+
has_rdoc:
|