structure 0.27.0 → 0.27.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/structure.rb +49 -0
- data/structure_test.rb +53 -0
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 20c2098f812188505392409a1c8b0e17493a5168
|
4
|
+
data.tar.gz: 73f8e68576effb6d797666917539b994acdcff19
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2823dd41bbc096c9eed4c1ef3efc23ea74f230ef65c854929a169def3176b0dc65d250e1840af1e225dc3f5b527475b1457808f57ada095d673d82b4f17ce35f
|
7
|
+
data.tar.gz: 6bf92a74813ac1a1eea066b09aeae15ffc8c58acc32a4638624ab0d4f312aebb0af8679bdca8ea4cbbc0bbc7c4df4e7c7cf64c387e8909967e371daf1c5295c3
|
data/structure.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
module Structure
|
2
|
+
def self.included(base)
|
3
|
+
base
|
4
|
+
.extend(ClassMethods)
|
5
|
+
.instance_variable_set(:@attribute_names, [])
|
6
|
+
end
|
7
|
+
|
8
|
+
def attributes
|
9
|
+
self.class.attribute_names.reduce({}) { |ret, name|
|
10
|
+
ret.update(name => self.send(name))
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
def ==(other)
|
15
|
+
attributes == other.attributes
|
16
|
+
end
|
17
|
+
|
18
|
+
def inspect
|
19
|
+
"#<#{self.class} #{
|
20
|
+
attributes
|
21
|
+
.map { |k, v| "#{k}=#{v.inspect}" }
|
22
|
+
.join(', ')
|
23
|
+
}>"
|
24
|
+
end
|
25
|
+
|
26
|
+
alias_method :to_h, :attributes
|
27
|
+
alias_method :eql?, :==
|
28
|
+
alias_method :to_s, :inspect
|
29
|
+
|
30
|
+
module ClassMethods
|
31
|
+
attr_reader :attribute_names
|
32
|
+
|
33
|
+
def to_struct
|
34
|
+
Struct.new(name, *attribute_names) do
|
35
|
+
def initialize(data = {})
|
36
|
+
data.each { |k, v| self.send("#{k}=", v) }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def inherited(subclass)
|
42
|
+
subclass.instance_variable_set(:@attribute_names, attribute_names.dup)
|
43
|
+
end
|
44
|
+
|
45
|
+
def attribute(name, &blk)
|
46
|
+
@attribute_names << define_method(name, &blk)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/structure_test.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'minitest/pride'
|
3
|
+
require './structure'
|
4
|
+
|
5
|
+
Location = Struct.new(:res) do
|
6
|
+
include Structure
|
7
|
+
[:latitude, :longitude].each { |key| attribute(key) { res.fetch(key) } }
|
8
|
+
end
|
9
|
+
|
10
|
+
class StructureTest < MiniTest::Test
|
11
|
+
def setup
|
12
|
+
@location = Location.new(latitude: 10, longitude: 100)
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_class_returns_attribute_names
|
16
|
+
assert_equal [:latitude, :longitude], Location.attribute_names
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_class_casts_to_struct
|
20
|
+
struct = Location.to_struct
|
21
|
+
assert_equal 'Struct::Location', struct.name
|
22
|
+
assert_equal 1, struct.new(latitude: 1).latitude
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_subclassing_does_not_have_side_effects
|
26
|
+
subclass = Class.new(Location) do
|
27
|
+
attribute(:name) { 'foo' }
|
28
|
+
end
|
29
|
+
obj = subclass.new(latitude: 10, longitude: 100)
|
30
|
+
assert_equal({ latitude: 10, longitude: 100, name: 'foo' }, obj.attributes)
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_attributes
|
34
|
+
assert_equal 10, @location.latitude
|
35
|
+
assert_equal 100, @location.longitude
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_returns_attributes
|
39
|
+
assert_equal({ latitude: 10, longitude: 100 }, @location.attributes)
|
40
|
+
assert_equal @location.to_h, @location.attributes
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_compares
|
44
|
+
@other = Location.new(longitude: 100, latitude: 10)
|
45
|
+
assert @location == @other
|
46
|
+
assert @location.eql?(@other)
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_pretty_inspects
|
50
|
+
assert_equal '#<Location latitude=10, longitude=100>', @location.inspect
|
51
|
+
assert_equal @location.to_s, @location.inspect
|
52
|
+
end
|
53
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: structure
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.27.
|
4
|
+
version: 0.27.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hakan Ensari
|
@@ -46,6 +46,8 @@ extra_rdoc_files: []
|
|
46
46
|
files:
|
47
47
|
- LICENSE
|
48
48
|
- README.md
|
49
|
+
- structure.rb
|
50
|
+
- structure_test.rb
|
49
51
|
homepage:
|
50
52
|
licenses: []
|
51
53
|
metadata: {}
|