hstruct 0.5.0 → 0.6.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.
- data/CHANGELOG.md +9 -1
- data/Gemfile +2 -0
- data/README.md +3 -4
- data/benchmarks/hstruct.rb +13 -1
- data/hstruct.gemspec +3 -3
- data/lib/hstruct.rb +10 -3
- data/test/lib/hstruct_test.rb +36 -9
- metadata +4 -3
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,14 @@
|
|
1
|
+
### v0.6.0
|
2
|
+
|
3
|
+
* Support for hashes with string keys. We came across this problem when
|
4
|
+
persisting a hash with symbol keys and were getting back string keys.
|
5
|
+
Thanks @bestie!
|
6
|
+
|
7
|
+
* removed `to_hash`
|
8
|
+
|
1
9
|
### v0.5.0
|
2
10
|
|
3
|
-
* to_h deprecates to_hash method, should serve as a reminder about Ruby
|
11
|
+
* `to_h` deprecates `to_hash` method, should serve as a reminder about Ruby
|
4
12
|
2.0. Thanks @bestie!
|
5
13
|
|
6
14
|
### v0.4.0
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
[]
|
1
|
+
[](https://travis-ci.org/cambridge-healthcare/hstruct)
|
2
2
|
|
3
3
|
Struct with the convenience of instantiating from a Hash.
|
4
4
|
|
@@ -10,14 +10,13 @@ a `to_h` method by default (no, you don't have to be running Ruby 2.0).
|
|
10
10
|
|
11
11
|
```ruby
|
12
12
|
class ClassWithArgsHash
|
13
|
-
attr_reader :foo, :bar, :baz, :qux
|
13
|
+
attr_reader :foo, :bar, :baz, :qux
|
14
14
|
|
15
15
|
def initialize(args)
|
16
16
|
@foo = args[:foo]
|
17
17
|
@bar = args[:bar]
|
18
18
|
@baz = args[:baz]
|
19
19
|
@qux = args[:qux]
|
20
|
-
@quux = args[:quux]
|
21
20
|
end
|
22
21
|
end
|
23
22
|
|
@@ -26,7 +25,7 @@ end
|
|
26
25
|
And this is the HStruct equivalent:
|
27
26
|
|
28
27
|
```ruby
|
29
|
-
MyHStruct = HStruct.new(:foo, :bar, :baz, :qux
|
28
|
+
MyHStruct = HStruct.new(:foo, :bar, :baz, :qux)
|
30
29
|
```
|
31
30
|
|
32
31
|
If you're thinking about setting the class instance variables
|
data/benchmarks/hstruct.rb
CHANGED
@@ -49,6 +49,12 @@ hash = {
|
|
49
49
|
:qux => 4,
|
50
50
|
}
|
51
51
|
|
52
|
+
#require 'attr_extras'
|
53
|
+
#class AttrExtrasClass
|
54
|
+
#attr_initialize [:foo, :bar, :baz, :qux]
|
55
|
+
#attr_reader :foo, :bar, :baz, :qux
|
56
|
+
#end
|
57
|
+
|
52
58
|
# All benchmarks were run on:
|
53
59
|
# * ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-darwin12.3.0]
|
54
60
|
# * Intel i7 2.2Ghz (MBP 8,2)
|
@@ -81,6 +87,11 @@ Benchmark.ips(runs) do |x|
|
|
81
87
|
}
|
82
88
|
end
|
83
89
|
|
90
|
+
# 200k/s
|
91
|
+
#x.report('Class AttrExtras') do
|
92
|
+
#AttrExtrasClass.new(hash)
|
93
|
+
#end
|
94
|
+
|
84
95
|
# 385k/s
|
85
96
|
x.report('Class Hash Args') do
|
86
97
|
HashArgsClass.new(hash)
|
@@ -104,4 +115,5 @@ end
|
|
104
115
|
# FastOpenStruct => 30k/s
|
105
116
|
# Hashie::Dash => 35k/s
|
106
117
|
# Hashie MI & MA => 100k/s
|
107
|
-
|
118
|
+
# AttrExtras => 200k/s
|
119
|
+
#
|
data/hstruct.gemspec
CHANGED
@@ -4,9 +4,9 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = "hstruct"
|
7
|
-
spec.version = "0.
|
8
|
-
spec.authors = ["Gerhard Lazu"]
|
9
|
-
spec.email = ["gerhard@lazu.co.uk"]
|
7
|
+
spec.version = "0.6.0"
|
8
|
+
spec.authors = ["Gerhard Lazu", "Stephen Best"]
|
9
|
+
spec.email = ["gerhard@lazu.co.uk", "bestie@gmail.com"]
|
10
10
|
spec.description = %q{Struct with the convenience of instantiating from a Hash}
|
11
11
|
spec.summary = %q{When you care about speed and convenience, this is what you've been looking for}
|
12
12
|
spec.homepage = "https://github.com/cambridge-healthcare/hstruct"
|
data/lib/hstruct.rb
CHANGED
@@ -1,10 +1,17 @@
|
|
1
1
|
class HStruct < Struct
|
2
|
-
def initialize(args =
|
3
|
-
|
2
|
+
def initialize(args = {})
|
3
|
+
raise ArgumentError unless args.is_a?(Enumerable)
|
4
|
+
|
5
|
+
unless args.keys.first.is_a?(Symbol)
|
6
|
+
args = args.each_with_object({}) do |(k,v), result|
|
7
|
+
result[k.to_sym] = v
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
super(*members.map { |m| args[m] })
|
4
12
|
end
|
5
13
|
|
6
14
|
def to_h
|
7
15
|
Hash[each_pair.to_a]
|
8
16
|
end
|
9
|
-
alias_method :to_hash, :to_h
|
10
17
|
end
|
data/test/lib/hstruct_test.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require_relative '../test_helper'
|
2
2
|
|
3
3
|
require 'hstruct'
|
4
|
+
require 'pry'
|
4
5
|
|
5
6
|
Person = HStruct.new(:first_name, :last_name)
|
6
7
|
|
@@ -13,25 +14,51 @@ describe "Person defined from an HStruct" do
|
|
13
14
|
Person.new.must_be_instance_of Person
|
14
15
|
end
|
15
16
|
|
17
|
+
it "argument must be enumerable" do
|
18
|
+
not_enumerable = Object.new
|
19
|
+
|
20
|
+
->{ Person.new(not_enumerable) }.must_raise ArgumentError
|
21
|
+
end
|
22
|
+
|
16
23
|
describe "instantiated from a hash" do
|
17
|
-
|
24
|
+
describe "with Symbol keys" do
|
25
|
+
let(:person_hash) { {
|
26
|
+
:first_name => "Jimmy",
|
27
|
+
} }
|
28
|
+
|
29
|
+
let(:person) { Person.new(person_hash) }
|
18
30
|
|
19
|
-
|
20
|
-
|
31
|
+
it "first name" do
|
32
|
+
person.first_name.must_equal "Jimmy"
|
33
|
+
end
|
34
|
+
|
35
|
+
it "last name" do
|
36
|
+
person.last_name.must_equal nil
|
37
|
+
end
|
21
38
|
end
|
22
39
|
|
23
|
-
|
24
|
-
|
40
|
+
describe "with String keys" do
|
41
|
+
let(:person_hash) { {
|
42
|
+
"first_name" => "Alex",
|
43
|
+
} }
|
44
|
+
|
45
|
+
let(:person) { Person.new(person_hash) }
|
46
|
+
|
47
|
+
it "first name" do
|
48
|
+
person.first_name.must_equal "Alex"
|
49
|
+
end
|
50
|
+
|
51
|
+
it "last name" do
|
52
|
+
person.last_name.must_equal nil
|
53
|
+
end
|
25
54
|
end
|
26
55
|
|
27
56
|
describe "when converting back to a hash" do
|
57
|
+
let(:person) { Person.new( :first_name => "Jimmy" ) }
|
58
|
+
|
28
59
|
it "includes empty values" do
|
29
60
|
person.to_h.must_equal Hash[:first_name => "Jimmy", :last_name => nil]
|
30
61
|
end
|
31
|
-
|
32
|
-
it "to_hash alias" do
|
33
|
-
person.to_h.must_equal person.to_hash
|
34
|
-
end
|
35
62
|
end
|
36
63
|
end
|
37
64
|
end
|
metadata
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hstruct
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Gerhard Lazu
|
9
|
+
- Stephen Best
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date: 2013-
|
13
|
+
date: 2013-06-11 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: benchmark-ips
|
@@ -110,6 +111,7 @@ dependencies:
|
|
110
111
|
description: Struct with the convenience of instantiating from a Hash
|
111
112
|
email:
|
112
113
|
- gerhard@lazu.co.uk
|
114
|
+
- bestie@gmail.com
|
113
115
|
executables: []
|
114
116
|
extensions: []
|
115
117
|
extra_rdoc_files: []
|
@@ -155,4 +157,3 @@ summary: When you care about speed and convenience, this is what you've been loo
|
|
155
157
|
test_files:
|
156
158
|
- test/lib/hstruct_test.rb
|
157
159
|
- test/test_helper.rb
|
158
|
-
has_rdoc:
|