finer_struct 0.0.7 → 0.0.8
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 +4 -4
- data/lib/finer_struct.rb +4 -2
- data/lib/finer_struct/{immutable.rb → anonymous_immutable.rb} +5 -7
- data/lib/finer_struct/{mutable.rb → anonymous_mutable.rb} +5 -8
- data/lib/finer_struct/named.rb +10 -6
- data/lib/finer_struct/named_immutable.rb +8 -0
- data/lib/finer_struct/named_mutable.rb +12 -0
- data/lib/finer_struct/version.rb +1 -1
- data/spec/anonymous_immutable_spec.rb +12 -0
- data/spec/anonymous_mutable_spec.rb +12 -0
- data/spec/named_immutable_spec.rb +15 -0
- data/spec/named_mutable_spec.rb +24 -0
- data/spec/shared_examples/immutable.rb +13 -0
- data/spec/shared_examples/mutable.rb +6 -0
- data/spec/shared_examples/named.rb +16 -0
- data/spec/shared_examples/struct.rb +35 -0
- metadata +22 -10
- data/spec/finer_struct/immutable_spec.rb +0 -36
- data/spec/finer_struct/mutable_spec.rb +0 -29
- data/spec/finer_struct/shared_examples.rb +0 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3e77234d562a38294c85ca067153e4e7fadc076d
|
4
|
+
data.tar.gz: b143677a32cd55a07a1c14d709923f754102c20f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2f5acd6d885fd1f0347277d6653b7365c20bb56dbf87448e15e1e486af76c394fc24001932e9ec9a7e7d1ffae1d81ff740fc51b7a8d61cb52efc7ab91272d2e6
|
7
|
+
data.tar.gz: cd328a7638545efd05cb5f353f14465ba714b8f3c4e9f9a0d089885f6fcb6fd5aae67835e3d9f48c6f951be8b6ba4f1b313f608551097ef440c777638648bf32
|
data/lib/finer_struct.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require "finer_struct/version"
|
2
|
-
require "finer_struct/
|
3
|
-
require "finer_struct/
|
2
|
+
require "finer_struct/anonymous_immutable"
|
3
|
+
require "finer_struct/anonymous_mutable"
|
4
|
+
require "finer_struct/named_immutable"
|
5
|
+
require "finer_struct/named_mutable"
|
4
6
|
|
@@ -1,8 +1,6 @@
|
|
1
|
-
require 'finer_struct/named'
|
2
|
-
|
3
1
|
module FinerStruct
|
4
|
-
|
5
2
|
class Immutable
|
3
|
+
|
6
4
|
def initialize(attributes = {})
|
7
5
|
@attributes = attributes.dup.freeze
|
8
6
|
freeze
|
@@ -23,10 +21,10 @@ module FinerStruct
|
|
23
21
|
def to_hash
|
24
22
|
@attributes
|
25
23
|
end
|
26
|
-
end
|
27
24
|
|
28
|
-
|
29
|
-
|
30
|
-
|
25
|
+
def ==(other)
|
26
|
+
other.class == self.class && other.to_hash == to_hash
|
27
|
+
end
|
31
28
|
|
29
|
+
end
|
32
30
|
end
|
@@ -1,9 +1,6 @@
|
|
1
|
-
require 'finer_struct/immutable'
|
2
|
-
require 'finer_struct/named'
|
3
|
-
|
4
1
|
module FinerStruct
|
5
|
-
|
6
2
|
class Mutable
|
3
|
+
|
7
4
|
def initialize(attributes)
|
8
5
|
@attributes = attributes.dup
|
9
6
|
end
|
@@ -26,6 +23,10 @@ module FinerStruct
|
|
26
23
|
@attributes.dup
|
27
24
|
end
|
28
25
|
|
26
|
+
def ==(other)
|
27
|
+
other.class == self.class && other.to_hash == to_hash
|
28
|
+
end
|
29
|
+
|
29
30
|
private
|
30
31
|
|
31
32
|
def is_assigment?(method)
|
@@ -35,11 +36,7 @@ module FinerStruct
|
|
35
36
|
def key_for_assignment(method)
|
36
37
|
method.to_s[0..-2].to_sym
|
37
38
|
end
|
38
|
-
end
|
39
39
|
|
40
|
-
def self.Mutable(*attribute_names)
|
41
|
-
Named.build_class(Mutable, attribute_names)
|
42
40
|
end
|
43
|
-
|
44
41
|
end
|
45
42
|
|
data/lib/finer_struct/named.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
module FinerStruct
|
2
|
-
|
3
2
|
module Named
|
4
3
|
|
5
4
|
def initialize(attributes = {})
|
@@ -8,17 +7,22 @@ module FinerStruct
|
|
8
7
|
raise(ArgumentError, "unknown attributes: #{unknown_attributes.join(', ')}")
|
9
8
|
end
|
10
9
|
|
11
|
-
|
12
|
-
super(nil_attributes.merge!(attributes))
|
10
|
+
super
|
13
11
|
end
|
14
12
|
|
15
|
-
def self.build_class(superclass, attribute_names)
|
13
|
+
def self.build_class(superclass, attribute_names, &block)
|
16
14
|
Class.new(superclass) do
|
15
|
+
include Named
|
16
|
+
|
17
17
|
define_method(:attribute_names, -> { attribute_names })
|
18
18
|
|
19
|
-
|
19
|
+
attribute_names.each do |name|
|
20
|
+
define_method(name) { @attributes[name] }
|
21
|
+
end
|
22
|
+
|
23
|
+
class_eval(&block) if block_given?
|
20
24
|
end
|
21
25
|
end
|
22
|
-
end
|
23
26
|
|
27
|
+
end
|
24
28
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'finer_struct/anonymous_mutable'
|
2
|
+
require 'finer_struct/named'
|
3
|
+
|
4
|
+
module FinerStruct
|
5
|
+
def self.Mutable(*attribute_names)
|
6
|
+
Named.build_class(Mutable, attribute_names) do
|
7
|
+
attribute_names.each do |name|
|
8
|
+
define_method(:"#{name}=") {|value| @attributes[name] = value }
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/lib/finer_struct/version.rb
CHANGED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'finer_struct'
|
2
|
+
require 'shared_examples/struct'
|
3
|
+
require 'shared_examples/immutable'
|
4
|
+
|
5
|
+
describe "an anonymous immutable struct" do
|
6
|
+
subject { FinerStruct::Immutable.new(a: 1, b: 2) }
|
7
|
+
let(:identical) { FinerStruct::Immutable.new(a: 1, b: 2) }
|
8
|
+
let(:different) { FinerStruct::Immutable.new(a: 3, b: 4) }
|
9
|
+
|
10
|
+
it_behaves_like "a struct"
|
11
|
+
it_behaves_like "an immutable struct"
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'finer_struct'
|
2
|
+
require 'shared_examples/struct'
|
3
|
+
require 'shared_examples/mutable'
|
4
|
+
|
5
|
+
describe "an anonymous mutable struct" do
|
6
|
+
subject { FinerStruct::Mutable.new(a: 1, b: 2) }
|
7
|
+
let(:identical) { FinerStruct::Mutable.new(a: 1, b: 2) }
|
8
|
+
let(:different) { FinerStruct::Mutable.new(a: 3, b: 4) }
|
9
|
+
|
10
|
+
it_behaves_like "a struct"
|
11
|
+
it_behaves_like "a mutable struct"
|
12
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'finer_struct'
|
2
|
+
require 'shared_examples/struct'
|
3
|
+
require 'shared_examples/named'
|
4
|
+
require 'shared_examples/immutable'
|
5
|
+
|
6
|
+
describe "a named immutable struct" do
|
7
|
+
let(:klass) { FinerStruct::Immutable(:a, :b) }
|
8
|
+
subject { klass.new(a: 1, b: 2) }
|
9
|
+
let(:identical) { klass.new(a: 1, b: 2) }
|
10
|
+
let(:different) { klass.new(a: 3, b: 4) }
|
11
|
+
|
12
|
+
it_behaves_like "a struct"
|
13
|
+
it_behaves_like "a named struct"
|
14
|
+
it_behaves_like "an immutable struct"
|
15
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'finer_struct'
|
2
|
+
require 'shared_examples/struct'
|
3
|
+
require 'shared_examples/named'
|
4
|
+
require 'shared_examples/mutable'
|
5
|
+
|
6
|
+
describe "a named mutable struct" do
|
7
|
+
let(:klass) { FinerStruct::Mutable(:a, :b) }
|
8
|
+
subject { klass.new(a: 1, b: 2) }
|
9
|
+
let(:identical) { klass.new(a: 1, b: 2) }
|
10
|
+
let(:different) { klass.new(a: 3, b: 4) }
|
11
|
+
|
12
|
+
it_behaves_like "a struct"
|
13
|
+
it_behaves_like "a named struct"
|
14
|
+
it_behaves_like "a mutable struct"
|
15
|
+
|
16
|
+
it "allows you alias attribute assignments" do
|
17
|
+
subclass = Class.new(klass) do
|
18
|
+
alias_method :c=, :a=
|
19
|
+
end
|
20
|
+
struct = subclass.new(a: 1)
|
21
|
+
struct.c = 3
|
22
|
+
expect(struct.a).to eq(3)
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
shared_examples "an immutable struct" do
|
2
|
+
it "complains if you try to write an attribute" do
|
3
|
+
expect { subject.a = 3 }.to raise_error(NoMethodError)
|
4
|
+
end
|
5
|
+
|
6
|
+
it "is frozen" do
|
7
|
+
expect(subject).to be_frozen
|
8
|
+
end
|
9
|
+
|
10
|
+
it "converts to a frozen hash" do
|
11
|
+
expect(subject.to_hash).to be_frozen
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
shared_examples "a named struct" do
|
2
|
+
it "complains if you set attributes that the struct doesn't have" do
|
3
|
+
expect { klass.new(c: 3, d: 4) }.to raise_error(ArgumentError, "unknown attributes: c, d")
|
4
|
+
end
|
5
|
+
|
6
|
+
it "returns nil for attributes that aren't explicitly set" do
|
7
|
+
expect(klass.new(a: 1).b).to be_nil
|
8
|
+
end
|
9
|
+
|
10
|
+
it "allows you to alias attributes" do
|
11
|
+
subclass = Class.new(klass) do
|
12
|
+
alias_method :c, :a
|
13
|
+
end
|
14
|
+
expect(subclass.new(a: 1).c).to eq(1)
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
shared_examples "a struct" do
|
2
|
+
it "lets you read attributes" do
|
3
|
+
expect(subject.a).to eq(1)
|
4
|
+
expect(subject.b).to eq(2)
|
5
|
+
end
|
6
|
+
|
7
|
+
it "responds to attribute names" do
|
8
|
+
expect(subject).to respond_to(:a)
|
9
|
+
expect(subject).to respond_to(:b)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "doesn't respond to attribute names that the struct doesn't have" do
|
13
|
+
expect(subject).not_to respond_to(:c)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "responds to non-attribute methods" do
|
17
|
+
expect(subject).to respond_to(:class)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "converts to a hash" do
|
21
|
+
expect(subject.to_hash).to eq(a: 1 ,b: 2)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "is equal to an identical struct" do
|
25
|
+
expect(subject).to eq(identical)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "is not equal to a different struct" do
|
29
|
+
expect(subject).to_not eq(different)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "is not equal to an object of a different class" do
|
33
|
+
expect(subject).to_not eq("rhubarb")
|
34
|
+
end
|
35
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: finer_struct
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pete Yandell
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -66,13 +66,20 @@ files:
|
|
66
66
|
- Rakefile
|
67
67
|
- finer_struct.gemspec
|
68
68
|
- lib/finer_struct.rb
|
69
|
-
- lib/finer_struct/
|
70
|
-
- lib/finer_struct/
|
69
|
+
- lib/finer_struct/anonymous_immutable.rb
|
70
|
+
- lib/finer_struct/anonymous_mutable.rb
|
71
71
|
- lib/finer_struct/named.rb
|
72
|
+
- lib/finer_struct/named_immutable.rb
|
73
|
+
- lib/finer_struct/named_mutable.rb
|
72
74
|
- lib/finer_struct/version.rb
|
73
|
-
- spec/
|
74
|
-
- spec/
|
75
|
-
- spec/
|
75
|
+
- spec/anonymous_immutable_spec.rb
|
76
|
+
- spec/anonymous_mutable_spec.rb
|
77
|
+
- spec/named_immutable_spec.rb
|
78
|
+
- spec/named_mutable_spec.rb
|
79
|
+
- spec/shared_examples/immutable.rb
|
80
|
+
- spec/shared_examples/mutable.rb
|
81
|
+
- spec/shared_examples/named.rb
|
82
|
+
- spec/shared_examples/struct.rb
|
76
83
|
homepage: https://github.com/notahat/finer_struct
|
77
84
|
licenses:
|
78
85
|
- MIT
|
@@ -98,6 +105,11 @@ signing_key:
|
|
98
105
|
specification_version: 4
|
99
106
|
summary: A nicer replacement for Ruby's Struct and OpenStruct
|
100
107
|
test_files:
|
101
|
-
- spec/
|
102
|
-
- spec/
|
103
|
-
- spec/
|
108
|
+
- spec/anonymous_immutable_spec.rb
|
109
|
+
- spec/anonymous_mutable_spec.rb
|
110
|
+
- spec/named_immutable_spec.rb
|
111
|
+
- spec/named_mutable_spec.rb
|
112
|
+
- spec/shared_examples/immutable.rb
|
113
|
+
- spec/shared_examples/mutable.rb
|
114
|
+
- spec/shared_examples/named.rb
|
115
|
+
- spec/shared_examples/struct.rb
|
@@ -1,36 +0,0 @@
|
|
1
|
-
require 'finer_struct/immutable'
|
2
|
-
require 'finer_struct/shared_examples'
|
3
|
-
|
4
|
-
shared_examples "an immutable struct" do
|
5
|
-
it_behaves_like "a struct"
|
6
|
-
|
7
|
-
it "complains if you try to write an attribute" do
|
8
|
-
expect { subject.a = 3 }.to raise_error(NoMethodError)
|
9
|
-
end
|
10
|
-
|
11
|
-
it "is frozen" do
|
12
|
-
expect(subject).to be_frozen
|
13
|
-
end
|
14
|
-
|
15
|
-
it "converts to a frozen hash" do
|
16
|
-
expect(subject.to_hash).to be_frozen
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
module FinerStruct
|
21
|
-
|
22
|
-
describe "an anonymous immutable struct" do
|
23
|
-
subject { FinerStruct::Immutable.new(a: 1, b: 2) }
|
24
|
-
|
25
|
-
it_behaves_like "an immutable struct"
|
26
|
-
end
|
27
|
-
|
28
|
-
describe "a named immutable struct" do
|
29
|
-
let(:klass) { Class.new(FinerStruct::Immutable(:a, :b)) }
|
30
|
-
subject { klass.new(a: 1, b: 2) }
|
31
|
-
|
32
|
-
it_behaves_like "an immutable struct"
|
33
|
-
it_behaves_like "a named struct"
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
require 'finer_struct/mutable'
|
2
|
-
require 'finer_struct/shared_examples'
|
3
|
-
|
4
|
-
shared_examples "a mutable struct" do
|
5
|
-
it_behaves_like "a struct"
|
6
|
-
|
7
|
-
it "lets you write attributes" do
|
8
|
-
subject.a = 3
|
9
|
-
expect(subject.a).to eq(3)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
module FinerStruct
|
14
|
-
|
15
|
-
describe "an anonymous mutable struct" do
|
16
|
-
subject { FinerStruct::Mutable.new(a: 1, b: 2) }
|
17
|
-
|
18
|
-
it_behaves_like "a mutable struct"
|
19
|
-
end
|
20
|
-
|
21
|
-
describe "a named mutable struct" do
|
22
|
-
let(:klass) { Class.new(FinerStruct::Mutable(:a, :b)) }
|
23
|
-
subject { klass.new(a: 1, b: 2) }
|
24
|
-
|
25
|
-
it_behaves_like "a mutable struct"
|
26
|
-
it_behaves_like "a named struct"
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
shared_examples "a struct" do
|
2
|
-
it "lets you read attributes" do
|
3
|
-
expect(subject.a).to eq(1)
|
4
|
-
expect(subject.b).to eq(2)
|
5
|
-
end
|
6
|
-
|
7
|
-
it "responds to attribute names" do
|
8
|
-
expect(subject).to respond_to :a
|
9
|
-
expect(subject).to respond_to :b
|
10
|
-
end
|
11
|
-
|
12
|
-
it "responds to :class" do
|
13
|
-
expect(subject).to respond_to :class
|
14
|
-
end
|
15
|
-
|
16
|
-
it "doesn't respond to attribute names that the struct doesn't have" do
|
17
|
-
expect(subject).not_to respond_to :c
|
18
|
-
end
|
19
|
-
|
20
|
-
it "converts to a hash" do
|
21
|
-
expect(subject.to_hash).to eq(a: 1 ,b: 2)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
shared_examples "a named struct" do
|
26
|
-
it "complains if you set attributes that the struct doesn't have" do
|
27
|
-
expect { klass.new(c: 3, d: 4) }.to raise_error(ArgumentError, "unknown attributes: c, d")
|
28
|
-
end
|
29
|
-
|
30
|
-
it "returns nil for attributes that aren't explicitly set" do
|
31
|
-
expect(klass.new(a: 1).b).to be_nil
|
32
|
-
end
|
33
|
-
end
|