dynamic_class 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +17 -1
- data/dynamic_class.gemspec +1 -1
- data/lib/dynamic_class.rb +3 -2
- data/lib/dynamic_class/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 09ca157ddd7ac6d979bd7ac95e233a81fb27153a
|
4
|
+
data.tar.gz: 19c7d1ccb052138fd4c75dbbdc107b3c836d7219
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c9acc7471fb928123cddffc577264dbc9820ddebfb4b42d684d83f26f43016aafdce0c6dea392d245c893d3c53c8f51ffb12023d0e8eb025e5f4c2a6a45372df
|
7
|
+
data.tar.gz: 480de50f8d48f532b60962db09064598bf1644651588b41a9039af0ece45b292a32088f3b5a999d3fa84e2afcac79d32cb702d3c11b22dfee116a4c09e631b3e
|
data/README.md
CHANGED
@@ -25,11 +25,20 @@ dog = Animal.new(type: 'dog', sound: 'woof')
|
|
25
25
|
# => #<Animal:0x007fdb2b818ba8 @type="dog", @sound="woof">
|
26
26
|
dog.speak
|
27
27
|
# => The dog makes a woof sound!
|
28
|
+
dog.ears = 'droopy'
|
29
|
+
dog[:nose] = ['cold', 'wet']
|
30
|
+
dog['tail'] = 'waggable'
|
31
|
+
dog
|
32
|
+
# => #<Animal:0x007fc26b1841d0 @type="dog", @sound="woof", @ears="droopy", @nose=["cold", "wet"], @tail="waggable">
|
33
|
+
dog.type
|
34
|
+
# => "dog"
|
35
|
+
dog.tail
|
36
|
+
# => "waggable"
|
28
37
|
|
29
38
|
cat = Animal.new
|
30
39
|
# => #<Animal:0x007fdb2b83b180>
|
31
40
|
cat.to_h
|
32
|
-
# => {:type=>nil, :sound=>nil}
|
41
|
+
# => {:type=>nil, :sound=>nil, :ears=>nil, :nose=>nil, :tail=>nil}
|
33
42
|
# The class has been changed by the dog!
|
34
43
|
```
|
35
44
|
|
@@ -141,6 +150,13 @@ PersistentOpenStruct: 625010.1 i/s - 4.96x slower
|
|
141
150
|
`DynamicClass` is still behind plain old Ruby classes, but it's the best out of
|
142
151
|
the pack when it comes to `OpenStruct` and friends.
|
143
152
|
|
153
|
+
## WARNING!
|
154
|
+
|
155
|
+
This class should only be used to consume trusted APIs, or for similar purposes.
|
156
|
+
It should never be used to take in user input. This will open you up to a memory
|
157
|
+
leak DoS attack, since every new key becomes a new method defined on the class,
|
158
|
+
and is never erased.
|
159
|
+
|
144
160
|
## Installation
|
145
161
|
|
146
162
|
Add this line to your application's Gemfile:
|
data/dynamic_class.gemspec
CHANGED
@@ -25,5 +25,5 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.add_development_dependency "rspec", "~> 3.0"
|
26
26
|
spec.add_development_dependency "ofstruct", "~> 0.2"
|
27
27
|
spec.add_development_dependency "persistent_open_struct", "~> 0.0"
|
28
|
-
spec.add_development_dependency "benchmark-ips", "~> 2.3
|
28
|
+
spec.add_development_dependency "benchmark-ips", "~> 2.3"
|
29
29
|
end
|
data/lib/dynamic_class.rb
CHANGED
@@ -31,7 +31,8 @@ module DynamicClass
|
|
31
31
|
def add_methods!(key)
|
32
32
|
class_exec do
|
33
33
|
mutex.synchronize do
|
34
|
-
|
34
|
+
attr_writer key unless method_defined?("#{key}=")
|
35
|
+
attr_reader key unless method_defined?("#{key}")
|
35
36
|
attributes << key
|
36
37
|
|
37
38
|
# I'm pretty sure this is safe, because attempting to add an attribute
|
@@ -86,7 +87,7 @@ module DynamicClass
|
|
86
87
|
|
87
88
|
def method_missing(mid, *args)
|
88
89
|
len = args.length
|
89
|
-
if mname = mid[/.*(?==\z)/m]
|
90
|
+
if (mname = mid[/.*(?==\z)/m])
|
90
91
|
if len != 1
|
91
92
|
raise ArgumentError, "wrong number of arguments (#{len} for 1)", caller(1)
|
92
93
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dynamic_class
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- amcaplan
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-02-
|
11
|
+
date: 2016-02-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -86,14 +86,14 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 2.3
|
89
|
+
version: '2.3'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 2.3
|
96
|
+
version: '2.3'
|
97
97
|
description: Specifically designed as an OpenStruct-like tool for consuming APIs,
|
98
98
|
dynamic_class lets your classes define their own getters and setters at runtime
|
99
99
|
based on the data instances receive at instantiation.
|
@@ -137,7 +137,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
137
137
|
version: '0'
|
138
138
|
requirements: []
|
139
139
|
rubyforge_project:
|
140
|
-
rubygems_version: 2.
|
140
|
+
rubygems_version: 2.2.2
|
141
141
|
signing_key:
|
142
142
|
specification_version: 4
|
143
143
|
summary: Create classes that define themselves... eventually.
|