hamsterdam 1.0.2 → 1.0.5
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 +5 -0
- data/lib/hamsterdam.rb +14 -7
- data/lib/hamsterdam/version.rb +3 -0
- data/spec/hamsterdam_spec.rb +6 -0
- metadata +4 -8
- data/Gemfile +0 -4
- data/Rakefile +0 -12
- data/TODO.txt +0 -4
- data/hamsterdam.gemspec +0 -24
- data/rake_tasks/rspec.rake +0 -25
data/CHANGELOG
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
Hamsterdam v1.0.5
|
2
|
+
* Setters return the same instance of the object if the value being set is unchanged
|
3
|
+
* Optimized creation of a new struct caused by a setter modification by skipping validation
|
4
|
+
* (v1.0.3 and 1.0.4 skipped because of github repo tagging conflict)
|
5
|
+
|
1
6
|
Hamsterdam v1.0.2
|
2
7
|
* Field name defs, constructor keys and merge keys are now stringified internally to prevent string/symbol mismatching
|
3
8
|
* Added syntax helper for this kind of thing: class Castle < Hamsterdam::Struct(:gate, :walls)
|
data/lib/hamsterdam.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'hamster'
|
2
2
|
|
3
3
|
module Hamsterdam
|
4
|
-
VERSION = "1.0.2"
|
5
4
|
|
6
5
|
def self.Struct(*field_names)
|
7
6
|
Hamsterdam::Struct.define(*field_names)
|
@@ -13,11 +12,15 @@ module Hamsterdam
|
|
13
12
|
field_names = field_names.map &:to_sym
|
14
13
|
field_names.each do |fname|
|
15
14
|
define_method fname do
|
16
|
-
|
15
|
+
@data[fname]
|
17
16
|
end
|
18
17
|
|
19
18
|
define_method "set_#{fname}" do |value|
|
20
|
-
|
19
|
+
if @data[fname] == value
|
20
|
+
self
|
21
|
+
else
|
22
|
+
self.class.new(@data.put(fname, value), false)
|
23
|
+
end
|
21
24
|
end
|
22
25
|
end
|
23
26
|
|
@@ -44,9 +47,13 @@ module Hamsterdam
|
|
44
47
|
struct_class
|
45
48
|
end
|
46
49
|
|
47
|
-
def initialize(values=Hamster.hash)
|
48
|
-
|
49
|
-
|
50
|
+
def initialize(values=Hamster.hash, validate=true)
|
51
|
+
if validate
|
52
|
+
@data = flesh_out(ensure_hamster_hash(values))
|
53
|
+
validate_keys(@data)
|
54
|
+
else
|
55
|
+
@data = values
|
56
|
+
end
|
50
57
|
end
|
51
58
|
|
52
59
|
def merge(values)
|
@@ -74,7 +81,7 @@ module Hamsterdam
|
|
74
81
|
end
|
75
82
|
|
76
83
|
def to_s
|
77
|
-
name = self.class.name.split(/::/).last
|
84
|
+
name = self.class.name ? self.class.name.split(/::/).last : self.class.to_s
|
78
85
|
data = to_hamster_hash
|
79
86
|
fields = self.class.field_names_list.map { |fname| "#{fname}: #{data[fname].inspect}" }
|
80
87
|
"<#{([name]+fields).join(" ")}>"
|
data/spec/hamsterdam_spec.rb
CHANGED
@@ -121,6 +121,11 @@ describe "Hamsterdam structures" do
|
|
121
121
|
struct.bottom.should == 1
|
122
122
|
end
|
123
123
|
|
124
|
+
it "returns the same struct if a set does not change the value" do
|
125
|
+
struct = struct_class.new(top: 25, bottom: 2)
|
126
|
+
struct.set_top(25).set_bottom(2).should equal(struct)
|
127
|
+
end
|
128
|
+
|
124
129
|
it "provides a merge function" do
|
125
130
|
struct = struct_class.new(top: 10, bottom: 1)
|
126
131
|
|
@@ -146,6 +151,7 @@ describe "Hamsterdam structures" do
|
|
146
151
|
struct.top.should == 10
|
147
152
|
struct.bottom.should == 1
|
148
153
|
end
|
154
|
+
|
149
155
|
end
|
150
156
|
|
151
157
|
describe "inspect and to_s" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hamsterdam
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-02-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: hamster
|
@@ -98,14 +98,10 @@ executables: []
|
|
98
98
|
extensions: []
|
99
99
|
extra_rdoc_files: []
|
100
100
|
files:
|
101
|
-
- CHANGELOG
|
102
|
-
- Gemfile
|
103
101
|
- README.md
|
104
|
-
-
|
105
|
-
-
|
106
|
-
- hamsterdam.gemspec
|
102
|
+
- CHANGELOG
|
103
|
+
- lib/hamsterdam/version.rb
|
107
104
|
- lib/hamsterdam.rb
|
108
|
-
- rake_tasks/rspec.rake
|
109
105
|
- spec/hamsterdam_spec.rb
|
110
106
|
- spec/spec_helper.rb
|
111
107
|
- spec/support/hamsterdam_helpers.rb
|
data/Gemfile
DELETED
data/Rakefile
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
#!/usr/bin/env rake
|
2
|
-
require "bundler/gem_tasks"
|
3
|
-
HERE = File.dirname(__FILE__)
|
4
|
-
|
5
|
-
Dir[File.expand_path(HERE) + "/rake_tasks/*.rake"].each do |rake_file|
|
6
|
-
import rake_file
|
7
|
-
end
|
8
|
-
|
9
|
-
# desc 'Default: run specs and cucumber features'
|
10
|
-
# task :default => [ "spec", "cuc:features" ]
|
11
|
-
|
12
|
-
task :default => [ "spec" ]
|
data/TODO.txt
DELETED
@@ -1,4 +0,0 @@
|
|
1
|
-
- Add commas in to_s
|
2
|
-
- .set_defaults({}) to provide default values for constructors
|
3
|
-
- Want to use fun "Status < Hamsterdam::Struct(:one, :two)" but something is wrong with inheritance of field_names that blows up the flesh_out func.
|
4
|
-
- FIXED: Symbol/string insensitivity (use symbols internally and when listing field names, but accept :foo and 'foo' when constructing and merging
|
data/hamsterdam.gemspec
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
|
-
$LOAD_PATH << File.expand_path(File.dirname(__FILE__) + "/lib")
|
3
|
-
require File.expand_path('../lib/hamsterdam', __FILE__)
|
4
|
-
|
5
|
-
Gem::Specification.new do |gem|
|
6
|
-
gem.authors = ["David Crosby"]
|
7
|
-
gem.email = ["david.crosby@atomicobject.com"]
|
8
|
-
gem.description = %q{Immutable Struct-like record structures based on Hamster.}
|
9
|
-
gem.summary = %q{Immutable Struct-like record structures based on Hamster.}
|
10
|
-
gem.homepage = "https://github.com/atomicobject/hamsterdam"
|
11
|
-
|
12
|
-
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
13
|
-
gem.files = `git ls-files`.split("\n") - [".gitignore", ".rspec", ".rvmrc", "NOTES.txt", "TODO"]
|
14
|
-
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
15
|
-
gem.name = "hamsterdam"
|
16
|
-
gem.require_paths = ["lib"]
|
17
|
-
gem.version = Hamsterdam::VERSION
|
18
|
-
|
19
|
-
gem.add_dependency "hamster"
|
20
|
-
gem.add_development_dependency "rake"
|
21
|
-
gem.add_development_dependency "rspec"
|
22
|
-
gem.add_development_dependency "simplecov"
|
23
|
-
gem.add_development_dependency "pry"
|
24
|
-
end
|
data/rake_tasks/rspec.rake
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
begin
|
2
|
-
require 'rspec/core/rake_task'
|
3
|
-
rescue Exception => e
|
4
|
-
"RSpec is not available. 'spec' task will not be defined."
|
5
|
-
end
|
6
|
-
|
7
|
-
begin # protect from missing rspec
|
8
|
-
desc "Run specs"
|
9
|
-
RSpec::Core::RakeTask.new do |t|
|
10
|
-
if ENV["file"]
|
11
|
-
t.pattern = ENV["file"]
|
12
|
-
end
|
13
|
-
t.rspec_opts = "--color --format documentation" # --tty
|
14
|
-
end
|
15
|
-
|
16
|
-
desc "Run individual spec"
|
17
|
-
task "spec:just" do
|
18
|
-
RSpec::Core::RakeTask.new("_tmp_rspec") do |t|
|
19
|
-
t.pattern = ENV["file"] || raise("Please supply 'file' argument")
|
20
|
-
t.rspec_opts = "--color"
|
21
|
-
end
|
22
|
-
Rake::Task["_tmp_rspec"].invoke
|
23
|
-
end
|
24
|
-
rescue Exception => e
|
25
|
-
end
|