hstruct 0.6.0 → 0.7.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 ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YjBlZTJhZTFjOGYyZGNjNjI4ODk4MDZkMDE1NWJjODRkODM1NmFjZQ==
5
+ data.tar.gz: !binary |-
6
+ MmEzMTY3ZWExNjk4YTU1OTlmYzE5NjU0Y2YxNzNkODE1ZDIxOWYwMw==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ OTRlNGRjYTg1ZDY1NzM3MmY3NTkzNTcyNjc3NmYzZWFlOThmZjM5MGQ1MDRm
10
+ MDE0ZTkxNzRiOWMxMmFmYmJkMWZiYWU0NTQ0NjA0MTdlYTk4MTQzODZjODhi
11
+ Nzk3NDFhNTNkNTNjOWM0NmU5ZTcxYmQ0ZjcyODkxYWUzODk2NzM=
12
+ data.tar.gz: !binary |-
13
+ ZTkxMjcxOTQ0OTNlODVkYjMxZjdjZmYwMzY2ZjQxYjZkMzNhNjk5ODAxZjNk
14
+ MjUxNGEzYWYyNzI4MGVmMmU5YjM1Zjc0OWQwOTJkYjdjZGI5OGQ1YWY3OGY0
15
+ NWNmZWZmYjFiZjhjZjQzMjQxOTM4NjA5MjQzYThmYWRhMTQ1MWM=
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.0.0-p247
data/Gemfile CHANGED
@@ -2,5 +2,3 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in hstruct.gemspec
4
4
  gemspec
5
-
6
- gem 'attr_extras'
data/README.md CHANGED
@@ -1,16 +1,17 @@
1
1
  [![travis](https://secure.travis-ci.org/cambridge-healthcare/hstruct.png)](https://travis-ci.org/cambridge-healthcare/hstruct)
2
+ [![Code Climate](https://codeclimate.com/github/cambridge-healthcare/hstruct.png)](https://codeclimate.com/github/cambridge-healthcare/hstruct)
3
+ # HStruct
2
4
 
3
- Struct with the convenience of instantiating from a Hash.
5
+ Ruby Structs with the convenience of instantiating from a Hash.
4
6
 
5
- When you care about speed, this is the Ruby structure that you've been
6
- looking for. HStructs are faster than any other gem out there, but still
7
- only half as fast as when compared to a Class with hash arguments.
8
- To make up for it, you will end up writing less code and you will get
9
- a `to_h` method by default (no, you don't have to be running Ruby 2.0).
7
+ It benchmarks about 3x slower than the plain object variant, but it's
8
+ 3.5x faster than OpenStruct, 5x faster than Hashie and 120x faster than
9
+ Virtus. Most importantly, it needs significanlty less setup code than
10
+ all other gems. Here's the plain object version:
10
11
 
11
12
  ```ruby
12
13
  class ClassWithArgsHash
13
- attr_reader :foo, :bar, :baz, :qux
14
+ attr_accessor :foo, :bar, :baz, :qux
14
15
 
15
16
  def initialize(args)
16
17
  @foo = args[:foo]
@@ -18,39 +19,48 @@ class ClassWithArgsHash
18
19
  @baz = args[:baz]
19
20
  @qux = args[:qux]
20
21
  end
21
- end
22
22
 
23
+ def to_h
24
+ {
25
+ :foo => foo,
26
+ :bar => bar,
27
+ :baz => baz,
28
+ :qux => qux
29
+ }
30
+ end
31
+ end
23
32
  ```
24
33
 
25
- And this is the HStruct equivalent:
34
+ And this is the **hstruct** equivalent:
26
35
 
27
36
  ```ruby
28
37
  MyHStruct = HStruct.new(:foo, :bar, :baz, :qux)
29
38
  ```
30
39
 
31
- If you're thinking about setting the class instance variables
32
- dynamically, the performance penalty might surprise you (run the
33
- benchmarks to see what I mean).
34
-
35
- ## Installation
36
-
37
- Add this line to your application's Gemfile:
38
-
39
- gem 'hstruct'
40
-
41
- And then execute:
42
-
43
- $ bundle
44
-
45
- Or install it yourself as:
40
+ The only gem faster than **hstruct** is
41
+ [attr_extras](https://github.com/barsoom/attr_extras). Even though
42
+ attr_extras is 30% quicker, it requires more setup code:
46
43
 
47
- $ gem install hstruct
44
+ ```ruby
45
+ class AttrExtrasClass
46
+ attr_initialize [:foo, :bar, :baz, :qux]
47
+ attr_accessor :foo, :bar, :baz, :qux
48
+
49
+ def to_h
50
+ {
51
+ :foo => foo,
52
+ :bar => bar,
53
+ :baz => baz,
54
+ :qux => qux
55
+ }
56
+ end
57
+ end
58
+ ```
48
59
 
49
60
  ## Usage
50
61
 
51
- This is a surprisingly simple gem, just a few lines of code. Usage is
52
- equally simple and straightforward. Here's an HStruct example with a
53
- default value:
62
+ This is a super simple and straightforward gem. Here's a usage example
63
+ with a default value:
54
64
 
55
65
  ```ruby
56
66
  HeartRate = HStruct.new(:patient_id, :bpm, :timestamp) do
@@ -74,6 +84,41 @@ end
74
84
  => {:patient_id=>1, :bpm=>88, :timestamp=>1368786389}
75
85
  ```
76
86
 
87
+ ## Benchmarks
88
+
89
+ There is a complete suite of benchmarks against the normal plain object
90
+ approach and the more popular gems. Run specific benchmarks eg `ruby
91
+ hstruct.rb`, or run them all: `ruby all.rb`
92
+
93
+ Benchmarks running on **Intel i7 2.2Ghz (MBP 8,2)** and **ruby 2.0.0p247
94
+ (2013-06-27 revision 41674) [x86_64-darwin12.4.0]**:
95
+
96
+ ```
97
+ ClassHashArgs 238075.1 (±9.4%) i/s - 237690 in 1.006158s
98
+ ClassHashArgsFetch 223183.1 (±8.7%) i/s - 235035 in 1.060172s
99
+ AttrExtrasClass 117151.4 (±3.1%) i/s - 124553 in 1.064184s
100
+ ClassArgsSend 105091.4 (±4.2%) i/s - 107544 in 1.025204s
101
+ PlainHStruct 83266.2 (±2.2%) i/s - 86724 in 1.042059s
102
+ HashMissing 71163.5 (±3.7%) i/s - 76536 in 1.077050s
103
+ OpenStruct 24342.6 (±6.1%) i/s - 24310 in 1.003123s
104
+ HashieStruct 15659.2 (±3.7%) i/s - 16698 in 1.067853s
105
+ VirtusStruct 6853.9 (±2.5%) i/s - 7359 in 1.074312s
106
+ ```
107
+
108
+ ## Installation
109
+
110
+ Add this line to your application's Gemfile:
111
+
112
+ gem 'hstruct'
113
+
114
+ And then execute:
115
+
116
+ $ bundle
117
+
118
+ Or install it yourself as:
119
+
120
+ $ gem install hstruct
121
+
77
122
  ## Contributing
78
123
 
79
124
  1. Fork it
data/benchmarks/all.rb ADDED
@@ -0,0 +1,23 @@
1
+ require_relative 'class_hash_args'
2
+ require_relative 'class_hash_args_fetch'
3
+ require_relative 'attr_extras'
4
+ require_relative 'class_args_send'
5
+ require_relative 'hstruct'
6
+ require_relative 'hash_missing'
7
+ require_relative 'open_struct'
8
+ require_relative 'hashie'
9
+ require_relative 'virtus'
10
+
11
+ # All benchmarks were run on:
12
+ # * ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.4.0]
13
+ # * Intel i7 2.2Ghz (MBP 8,2)
14
+ #
15
+ # ClassHashArgs 238075.1 (±9.4%) i/s - 237690 in 1.006158s
16
+ # ClassHashArgsFetch 223183.1 (±8.7%) i/s - 235035 in 1.060172s
17
+ # AttrExtrasClass 117151.4 (±3.1%) i/s - 124553 in 1.064184s
18
+ # ClassArgsSend 105091.4 (±4.2%) i/s - 107544 in 1.025204s
19
+ # PlainHStruct 83266.2 (±2.2%) i/s - 86724 in 1.042059s
20
+ # HashMissing 71163.5 (±3.7%) i/s - 76536 in 1.077050s
21
+ # OpenStruct 24342.6 (±6.1%) i/s - 24310 in 1.003123s
22
+ # HashieStruct 15659.2 (±3.7%) i/s - 16698 in 1.067853s
23
+ # VirtusStruct 6853.9 (±2.5%) i/s - 7359 in 1.074312s
@@ -0,0 +1,23 @@
1
+ begin
2
+ require 'attr_extras'
3
+ class AttrExtrasClass
4
+ attr_initialize [:foo, :bar, :baz, :qux]
5
+ attr_accessor :foo, :bar, :baz, :qux
6
+
7
+ def to_h
8
+ {
9
+ :foo => foo,
10
+ :bar => bar,
11
+ :baz => baz,
12
+ :qux => qux
13
+ }
14
+ end
15
+ end
16
+
17
+ require_relative 'benchmark'
18
+ benchmark.call(
19
+ AttrExtrasClass.method(:new)
20
+ )
21
+ rescue LoadError
22
+ puts "attr_extras gem not installed, cannot run benchmark"
23
+ end
@@ -0,0 +1,43 @@
1
+ require 'benchmark/ips'
2
+ require 'pry'
3
+
4
+ ImplementationError = Class.new(StandardError)
5
+
6
+ def benchmark
7
+ ->(object_builder) {
8
+ Benchmark.ips(ENV.fetch('RUNS', 1).to_i) do |x|
9
+ hash = {
10
+ :foo => 1,
11
+ :bar => 2,
12
+ :baz => 3,
13
+ :qux => 4,
14
+ }
15
+
16
+ hash2 = {
17
+ :foo => "foo",
18
+ :bar => "bar",
19
+ :baz => "baz",
20
+ :qux => "qux",
21
+ }
22
+
23
+ x.report(object_builder.call(hash).class.name) {
24
+ o = object_builder.call(hash)
25
+ o.foo == hash[:foo] || raise(ImplementationError, "#foo")
26
+ o.bar == hash[:bar] || raise(ImplementationError, "#bar")
27
+ o.baz == hash[:baz] || raise(ImplementationError, "#baz")
28
+ o.qux == hash[:qux] || raise(ImplementationError, "#qux")
29
+ o.to_h == hash || raise(ImplementationError, "#to_h")
30
+
31
+ o.foo = hash2[:foo]
32
+ o.foo == hash2[:foo] || raise(ImplementationError, "#foo=")
33
+ o.bar = hash2[:bar]
34
+ o.bar == hash2[:bar] || raise(ImplementationError, "#bar=")
35
+ o.baz = hash2[:baz]
36
+ o.baz == hash2[:baz] || raise(ImplementationError, "#baz=")
37
+ o.qux = hash2[:qux]
38
+ o.qux == hash2[:qux] || raise(ImplementationError, "#qux=")
39
+ o.to_h == hash2 || raise(ImplementationError, "#to_h")
40
+ }
41
+ end
42
+ }
43
+ end
@@ -0,0 +1,23 @@
1
+ require_relative 'benchmark'
2
+
3
+ class ClassArgsSend
4
+ attr_accessor :foo, :bar, :baz, :qux
5
+
6
+ def initialize(args)
7
+ @args = args
8
+ args.each { |k, v| self.send("#{k}=", v) }
9
+ end
10
+
11
+ def to_h
12
+ {
13
+ :foo => foo,
14
+ :bar => bar,
15
+ :baz => baz,
16
+ :qux => qux
17
+ }
18
+ end
19
+ end
20
+
21
+ benchmark.call(
22
+ ClassArgsSend.method(:new)
23
+ )
@@ -0,0 +1,25 @@
1
+ require_relative 'benchmark'
2
+
3
+ class ClassHashArgs
4
+ attr_accessor :foo, :bar, :baz, :qux
5
+
6
+ def initialize(args)
7
+ self.foo = args[:foo]
8
+ self.bar = args[:bar]
9
+ self.baz = args[:baz]
10
+ self.qux = args[:qux]
11
+ end
12
+
13
+ def to_h
14
+ {
15
+ :foo => foo,
16
+ :bar => bar,
17
+ :baz => baz,
18
+ :qux => qux
19
+ }
20
+ end
21
+ end
22
+
23
+ benchmark.call(
24
+ ClassHashArgs.method(:new)
25
+ )
@@ -0,0 +1,25 @@
1
+ require_relative 'benchmark'
2
+
3
+ class ClassHashArgsFetch
4
+ attr_accessor :foo, :bar, :baz, :qux
5
+
6
+ def initialize(args)
7
+ self.foo = args.fetch(:foo)
8
+ self.bar = args.fetch(:bar)
9
+ self.baz = args.fetch(:baz)
10
+ self.qux = args.fetch(:qux)
11
+ end
12
+
13
+ def to_h
14
+ {
15
+ :foo => foo,
16
+ :bar => bar,
17
+ :baz => baz,
18
+ :qux => qux
19
+ }
20
+ end
21
+ end
22
+
23
+ benchmark.call(
24
+ ClassHashArgsFetch.method(:new)
25
+ )
@@ -0,0 +1,15 @@
1
+ require_relative 'benchmark'
2
+
3
+ class HashMissing < Hash
4
+ def method_missing(method, *value)
5
+ if value.any?
6
+ self[method[0..-2].to_sym] = value.first
7
+ else
8
+ self[method] || super
9
+ end
10
+ end
11
+ end
12
+
13
+ benchmark.call(
14
+ HashMissing.method(:[])
15
+ )
@@ -0,0 +1,20 @@
1
+ begin
2
+ require 'hashie'
3
+ class HashieStruct < Hashie::Dash
4
+ property :foo
5
+ property :bar
6
+ property :baz
7
+ property :qux
8
+
9
+ def to_h
10
+ to_hash(:symbolize_keys => true)
11
+ end
12
+ end
13
+
14
+ require_relative 'benchmark'
15
+ benchmark.call(
16
+ HashieStruct.method(:new)
17
+ )
18
+ rescue LoadError
19
+ puts "hashie gem not installed, cannot run benchmark"
20
+ end
@@ -1,119 +1,7 @@
1
- require 'benchmark/ips'
2
- require 'pry'
3
-
4
- # OpenStruct
5
- require 'ostruct'
6
-
7
- # Struct
8
- PlainStruct = Struct.new(:foo, :bar, :baz, :qux)
9
-
10
- # HStruct
11
1
  require_relative '../lib/hstruct'
12
2
  PlainHStruct = HStruct.new(:foo, :bar, :baz, :qux)
13
3
 
14
- # Class
15
- class SimpleClass
16
- attr_reader :foo, :bar, :baz, :qux
17
-
18
- def initialize(foo, bar, baz, qux)
19
- @foo = foo
20
- @bar = bar
21
- @baz = baz
22
- @qux = qux
23
- end
24
- end
25
-
26
- class CleverClass
27
- attr_reader :foo, :bar, :baz, :qux
28
-
29
- def initialize(args)
30
- args.each { |k, v| instance_variable_set("@#{k}", v) }
31
- end
32
- end
33
-
34
- class HashArgsClass
35
- attr_reader :foo, :bar, :baz, :qux
36
-
37
- def initialize(args)
38
- @foo = args[:foo]
39
- @bar = args[:bar]
40
- @baz = args[:baz]
41
- @qux = args[:qux]
42
- end
43
- end
44
-
45
- hash = {
46
- :foo => 1,
47
- :bar => 2,
48
- :baz => 3,
49
- :qux => 4,
50
- }
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
-
58
- # All benchmarks were run on:
59
- # * ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-darwin12.3.0]
60
- # * Intel i7 2.2Ghz (MBP 8,2)
61
-
62
- runs = ENV.fetch('RUNS', 5).to_i
63
-
64
- Benchmark.ips(runs) do |x|
65
- # 14k/s
66
- x.report('OpenStruct') do
67
- OpenStruct.new(hash)
68
- end
69
-
70
- # 80k/s
71
- x.report('Class Clever') do
72
- CleverClass.new(hash)
73
- end
74
-
75
- # 185k/s
76
- x.report('HStruct') do
77
- PlainHStruct.new(hash)
78
- end
79
-
80
- # 380k/s
81
- x.report('Hash') do
82
- hash = {
83
- :foo => 1,
84
- :bar => 2,
85
- :baz => 3,
86
- :qux => 4,
87
- }
88
- end
89
-
90
- # 200k/s
91
- #x.report('Class AttrExtras') do
92
- #AttrExtrasClass.new(hash)
93
- #end
94
-
95
- # 385k/s
96
- x.report('Class Hash Args') do
97
- HashArgsClass.new(hash)
98
- end
99
-
100
- # 470k/s
101
- x.report('Class Plain') do
102
- SimpleClass.new(1, 2, 3, 4)
103
- end
104
-
105
- # 620k/s
106
- x.report('Struct') do
107
- PlainStruct.new(1, 2, 3, 4)
108
- end
109
- end
110
-
111
- ### This is how some of the more popular gems compare to the above:
112
- #
113
- # Virtus => 12k/s (no coercions) & 17k/s (coercions)
114
- # Hashr => 20k/s
115
- # FastOpenStruct => 30k/s
116
- # Hashie::Dash => 35k/s
117
- # Hashie MI & MA => 100k/s
118
- # AttrExtras => 200k/s
119
- #
4
+ require_relative 'benchmark'
5
+ benchmark.call(
6
+ PlainHStruct.method(:new)
7
+ )
@@ -0,0 +1,7 @@
1
+ require_relative 'benchmark'
2
+
3
+ require 'ostruct'
4
+
5
+ benchmark.call(
6
+ OpenStruct.method(:new)
7
+ )
@@ -0,0 +1,20 @@
1
+ begin
2
+ require 'virtus'
3
+ class VirtusStruct
4
+ include Virtus
5
+
6
+ attribute :foo
7
+ attribute :bar
8
+ attribute :baz
9
+ attribute :qux
10
+
11
+ alias_method :to_h, :attributes
12
+ end
13
+
14
+ require_relative 'benchmark'
15
+ benchmark.call(
16
+ VirtusStruct.method(:new)
17
+ )
18
+ rescue LoadError
19
+ puts "virtus gem not installed, cannot run benchmark"
20
+ end
data/hstruct.gemspec CHANGED
@@ -4,7 +4,7 @@ $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.6.0"
7
+ spec.version = "0.7.0"
8
8
  spec.authors = ["Gerhard Lazu", "Stephen Best"]
9
9
  spec.email = ["gerhard@lazu.co.uk", "bestie@gmail.com"]
10
10
  spec.description = %q{Struct with the convenience of instantiating from a Hash}
data/lib/hstruct.rb CHANGED
@@ -1,16 +1,27 @@
1
1
  class HStruct < Struct
2
2
  def initialize(args = {})
3
- raise ArgumentError unless args.is_a?(Enumerable)
3
+ ensure_enumerable(args)
4
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
5
+ args = args.each_with_object({}) do |(k,v), result|
6
+ result[k.to_sym] = v
9
7
  end
10
8
 
11
9
  super(*members.map { |m| args[m] })
12
10
  end
13
11
 
12
+ def update(args={})
13
+ ensure_enumerable(args)
14
+
15
+ args.each do |(k,v)|
16
+ self[k.to_sym] = v
17
+ end
18
+ self
19
+ end
20
+
21
+ def ensure_enumerable(args)
22
+ raise ArgumentError unless args.is_a?(Enumerable)
23
+ end
24
+
14
25
  def to_h
15
26
  Hash[each_pair.to_a]
16
27
  end
@@ -61,5 +61,56 @@ describe "Person defined from an HStruct" do
61
61
  end
62
62
  end
63
63
  end
64
+
65
+ describe "updated from a hash" do
66
+ describe "with Symbol keys" do
67
+ let(:person_hash) { {
68
+ :first_name => "Jimmy",
69
+ } }
70
+ let(:updated_person_hash) { {
71
+ :first_name => "Laura",
72
+ } }
73
+
74
+ let(:person) { Person.new(person_hash) }
75
+ let(:updated_person) { person.update(updated_person_hash) }
76
+
77
+ it "first name" do
78
+ updated_person.first_name.must_equal "Laura"
79
+ end
80
+
81
+ it "last name" do
82
+ updated_person.last_name.must_equal nil
83
+ end
84
+ end
85
+
86
+ describe "with String keys" do
87
+ let(:person_hash) { {
88
+ "first_name" => "Alex",
89
+ } }
90
+ let(:updated_person_hash) { {
91
+ "first_name" => "Elise",
92
+ } }
93
+
94
+ let(:person) { Person.new(person_hash) }
95
+ let(:updated_person) { person.update(updated_person_hash) }
96
+
97
+ it "first name" do
98
+ updated_person.first_name.must_equal "Elise"
99
+ end
100
+
101
+ it "last name" do
102
+ updated_person.last_name.must_equal nil
103
+ end
104
+ end
105
+
106
+ describe "when converting back to a hash" do
107
+ let(:person) { Person.new( :first_name => "Jimmy" ) }
108
+ let(:updated_person) { person.update( :first_name => "Laura" ) }
109
+
110
+ it "includes empty values" do
111
+ updated_person.to_h.must_equal Hash[:first_name => "Laura", :last_name => nil]
112
+ end
113
+ end
114
+ end
64
115
  end
65
116
 
data/test/test_helper.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
-
2
+ $LOAD_PATH << File.join(File.dirname(__FILE__), "..", "lib")
3
3
  require 'minitest/autorun'
4
4
  require "minitest/reporters"
5
5
  MiniTest::Reporters.use! MiniTest::Reporters::SpecReporter.new
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hstruct
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
5
- prerelease:
4
+ version: 0.7.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Gerhard Lazu
@@ -10,12 +9,11 @@ authors:
10
9
  autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2013-06-11 00:00:00.000000000 Z
12
+ date: 2013-11-08 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: benchmark-ips
17
16
  requirement: !ruby/object:Gem::Requirement
18
- none: false
19
17
  requirements:
20
18
  - - ~>
21
19
  - !ruby/object:Gem::Version
@@ -23,7 +21,6 @@ dependencies:
23
21
  type: :development
24
22
  prerelease: false
25
23
  version_requirements: !ruby/object:Gem::Requirement
26
- none: false
27
24
  requirements:
28
25
  - - ~>
29
26
  - !ruby/object:Gem::Version
@@ -31,7 +28,6 @@ dependencies:
31
28
  - !ruby/object:Gem::Dependency
32
29
  name: bundler
33
30
  requirement: !ruby/object:Gem::Requirement
34
- none: false
35
31
  requirements:
36
32
  - - ~>
37
33
  - !ruby/object:Gem::Version
@@ -39,7 +35,6 @@ dependencies:
39
35
  type: :development
40
36
  prerelease: false
41
37
  version_requirements: !ruby/object:Gem::Requirement
42
- none: false
43
38
  requirements:
44
39
  - - ~>
45
40
  - !ruby/object:Gem::Version
@@ -47,7 +42,6 @@ dependencies:
47
42
  - !ruby/object:Gem::Dependency
48
43
  name: minitest
49
44
  requirement: !ruby/object:Gem::Requirement
50
- none: false
51
45
  requirements:
52
46
  - - ~>
53
47
  - !ruby/object:Gem::Version
@@ -55,7 +49,6 @@ dependencies:
55
49
  type: :development
56
50
  prerelease: false
57
51
  version_requirements: !ruby/object:Gem::Requirement
58
- none: false
59
52
  requirements:
60
53
  - - ~>
61
54
  - !ruby/object:Gem::Version
@@ -63,7 +56,6 @@ dependencies:
63
56
  - !ruby/object:Gem::Dependency
64
57
  name: minitest-reporters
65
58
  requirement: !ruby/object:Gem::Requirement
66
- none: false
67
59
  requirements:
68
60
  - - ~>
69
61
  - !ruby/object:Gem::Version
@@ -71,7 +63,6 @@ dependencies:
71
63
  type: :development
72
64
  prerelease: false
73
65
  version_requirements: !ruby/object:Gem::Requirement
74
- none: false
75
66
  requirements:
76
67
  - - ~>
77
68
  - !ruby/object:Gem::Version
@@ -79,7 +70,6 @@ dependencies:
79
70
  - !ruby/object:Gem::Dependency
80
71
  name: pry
81
72
  requirement: !ruby/object:Gem::Requirement
82
- none: false
83
73
  requirements:
84
74
  - - ! '>='
85
75
  - !ruby/object:Gem::Version
@@ -87,7 +77,6 @@ dependencies:
87
77
  type: :development
88
78
  prerelease: false
89
79
  version_requirements: !ruby/object:Gem::Requirement
90
- none: false
91
80
  requirements:
92
81
  - - ! '>='
93
82
  - !ruby/object:Gem::Version
@@ -95,7 +84,6 @@ dependencies:
95
84
  - !ruby/object:Gem::Dependency
96
85
  name: rake
97
86
  requirement: !ruby/object:Gem::Requirement
98
- none: false
99
87
  requirements:
100
88
  - - ~>
101
89
  - !ruby/object:Gem::Version
@@ -103,7 +91,6 @@ dependencies:
103
91
  type: :development
104
92
  prerelease: false
105
93
  version_requirements: !ruby/object:Gem::Requirement
106
- none: false
107
94
  requirements:
108
95
  - - ~>
109
96
  - !ruby/object:Gem::Version
@@ -117,13 +104,24 @@ extensions: []
117
104
  extra_rdoc_files: []
118
105
  files:
119
106
  - .gitignore
107
+ - .ruby-version
120
108
  - .travis.yml
121
109
  - CHANGELOG.md
122
110
  - Gemfile
123
111
  - LICENSE.txt
124
112
  - README.md
125
113
  - Rakefile
114
+ - benchmarks/all.rb
115
+ - benchmarks/attr_extras.rb
116
+ - benchmarks/benchmark.rb
117
+ - benchmarks/class_args_send.rb
118
+ - benchmarks/class_hash_args.rb
119
+ - benchmarks/class_hash_args_fetch.rb
120
+ - benchmarks/hash_missing.rb
121
+ - benchmarks/hashie.rb
126
122
  - benchmarks/hstruct.rb
123
+ - benchmarks/open_struct.rb
124
+ - benchmarks/virtus.rb
127
125
  - hstruct.gemspec
128
126
  - lib/hstruct.rb
129
127
  - test/lib/hstruct_test.rb
@@ -131,27 +129,26 @@ files:
131
129
  homepage: https://github.com/cambridge-healthcare/hstruct
132
130
  licenses:
133
131
  - MIT
132
+ metadata: {}
134
133
  post_install_message:
135
134
  rdoc_options: []
136
135
  require_paths:
137
136
  - lib
138
137
  required_ruby_version: !ruby/object:Gem::Requirement
139
- none: false
140
138
  requirements:
141
139
  - - ! '>='
142
140
  - !ruby/object:Gem::Version
143
141
  version: '0'
144
142
  required_rubygems_version: !ruby/object:Gem::Requirement
145
- none: false
146
143
  requirements:
147
144
  - - ! '>='
148
145
  - !ruby/object:Gem::Version
149
146
  version: '0'
150
147
  requirements: []
151
148
  rubyforge_project:
152
- rubygems_version: 1.8.23
149
+ rubygems_version: 2.1.5
153
150
  signing_key:
154
- specification_version: 3
151
+ specification_version: 4
155
152
  summary: When you care about speed and convenience, this is what you've been looking
156
153
  for
157
154
  test_files: