uuids 4.1.7 → 4.1.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/README.rdoc +1 -1
- data/lib/uuids/base/belongs_to.rb +8 -27
- data/lib/uuids/base.rb +3 -3
- data/lib/uuids/version.rb +1 -1
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/uuids/lib/base/belongs_by_uuid_to_spec.rb +73 -0
- data/spec/uuids/lib/base/has_uuids_spec.rb +65 -0
- data/spec/uuids/lib/base_spec.rb +5 -131
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 13e36a1b5f35a339e4111da9623e53eec0009ebe
|
4
|
+
data.tar.gz: 629d838eb2a302cdb12cc45f247b81105eb5ee07
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e04939b2fc5a1266dfecdd1e9d6cfd7ad07e42c7a0eb8e7e3d594598be53f37ead9424278f9f90cf1c4032a9c5236d26fe5b8e15af4cfc7bc30f0d086c6ae1f0
|
7
|
+
data.tar.gz: 45fc2caa49c7352dac77163c7757310cf56476b08933335575fafb11841ec01c8f21112d3452a089fdd43bf00682fd2832c262776318c1cd2c5b8a1883c35ff2
|
data/README.rdoc
CHANGED
@@ -125,7 +125,7 @@ all object's UUIDs to another record in advance.
|
|
125
125
|
class Street < ActiveRecord::Base
|
126
126
|
include Uuids::Base
|
127
127
|
|
128
|
-
belongs_by_uuid_to :city
|
128
|
+
belongs_by_uuid_to :city
|
129
129
|
end
|
130
130
|
|
131
131
|
This will add both getter and setter for the attribute:
|
@@ -9,7 +9,7 @@ module Uuids
|
|
9
9
|
# city = City.new
|
10
10
|
# city.respond_to? :state # => true
|
11
11
|
# city.respond_to? :state= # => true
|
12
|
-
class BelongsTo < Struct.new(:klass, :name
|
12
|
+
class BelongsTo < Struct.new(:klass, :name)
|
13
13
|
|
14
14
|
# @api hide
|
15
15
|
# @!attribute klass
|
@@ -21,11 +21,6 @@ module Uuids
|
|
21
21
|
# The name of the attribute to be added.
|
22
22
|
# @return [String, Symbol] The name.
|
23
23
|
|
24
|
-
# @api hide
|
25
|
-
# @!attribute model
|
26
|
-
# The model to be referred by uuid.
|
27
|
-
# @return [ActiveRecord::Base] The model class to be referred to.
|
28
|
-
|
29
24
|
# @api hide
|
30
25
|
# @!attribute [r] class_name
|
31
26
|
# The name of the {#klass} constant.
|
@@ -34,14 +29,6 @@ module Uuids
|
|
34
29
|
@class_name ||= klass.name
|
35
30
|
end
|
36
31
|
|
37
|
-
# @api hide
|
38
|
-
# @!attribute [r] model_name
|
39
|
-
# The name of the {#model} constant.
|
40
|
-
# @return [String] The {#model} name.
|
41
|
-
def model_name
|
42
|
-
@model_name ||= model.name
|
43
|
-
end
|
44
|
-
|
45
32
|
# @api hide
|
46
33
|
# @!attribute [r] model_name
|
47
34
|
# The name of the {#klass} db table column to store reference to the
|
@@ -57,11 +44,9 @@ module Uuids
|
|
57
44
|
# @param [ActiveRecord::Base] klass The model to add attribute to.
|
58
45
|
# Should have a corresponding column for reference by uuid.
|
59
46
|
# @param [String, Symbol] name The name of the attribute to be added.
|
60
|
-
# @param [ActiveRecord::Base] model The model to be referred by uuid.
|
61
|
-
# Should include the <tt>Uuids::Base</tt> module.
|
62
47
|
# @raise (see Uuids::Base::BelongsTo#add)
|
63
|
-
def self.add(klass, name
|
64
|
-
new(klass, name
|
48
|
+
def self.add(klass, name)
|
49
|
+
new(klass, name).add
|
65
50
|
end
|
66
51
|
|
67
52
|
# @api hide
|
@@ -71,7 +56,6 @@ module Uuids
|
|
71
56
|
# @raise [NotImplementedError] if the {#klass} doesn't have the
|
72
57
|
# correspondint {#column_name} column.
|
73
58
|
def add
|
74
|
-
check_model
|
75
59
|
check_column
|
76
60
|
add_getter
|
77
61
|
add_setter
|
@@ -79,12 +63,6 @@ module Uuids
|
|
79
63
|
|
80
64
|
private
|
81
65
|
|
82
|
-
def check_model
|
83
|
-
return if model.ancestors.include? Uuids::Base
|
84
|
-
fail TypeError
|
85
|
-
.new "#{ model_name } class doesn't include the Uuids::Base module"
|
86
|
-
end
|
87
|
-
|
88
66
|
def check_column
|
89
67
|
return if klass.attribute_names.include? column_name
|
90
68
|
fail NotImplementedError
|
@@ -99,6 +77,10 @@ module Uuids
|
|
99
77
|
klass.class_eval setter
|
100
78
|
end
|
101
79
|
|
80
|
+
def uuids
|
81
|
+
"Uuids::Models::Uuid"
|
82
|
+
end
|
83
|
+
|
102
84
|
def getter
|
103
85
|
"def #{ name };
|
104
86
|
uuid = read_attribute :#{ column_name };
|
@@ -106,14 +88,13 @@ module Uuids
|
|
106
88
|
if Array(@#{ name }.try(:uuids)).map(&:value).include? uuid;
|
107
89
|
@#{ name };
|
108
90
|
else;
|
109
|
-
@#{ name } = #{
|
91
|
+
@#{ name } = #{ uuids }.where(value: uuid).first.try :record;
|
110
92
|
end;
|
111
93
|
end"
|
112
94
|
end
|
113
95
|
|
114
96
|
def setter
|
115
97
|
"def #{ name }=(value);
|
116
|
-
fail TypeError unless value.nil? || value.is_a?(#{ model_name });
|
117
98
|
write_attribute :#{ column_name }, value.try(:uuid);
|
118
99
|
#{ name };
|
119
100
|
end"
|
data/lib/uuids/base.rb
CHANGED
@@ -74,9 +74,9 @@ module Uuids
|
|
74
74
|
# @param [Hash] options The options for the association.
|
75
75
|
# @option options [Class] :class The model of the attribute.
|
76
76
|
# @option options [String] :class_name The name of the attribute's model.
|
77
|
-
def belongs_by_uuid_to(name,
|
78
|
-
|
79
|
-
BelongsTo.add self, name
|
77
|
+
def belongs_by_uuid_to(name, opts = nil)
|
78
|
+
warn "[DEPRECATION] .belongs_by_uuid_to options are deprecated" if opts
|
79
|
+
BelongsTo.add self, name
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
data/lib/uuids/version.rb
CHANGED
data/spec/dummy/db/test.sqlite3
CHANGED
Binary file
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
module Uuids
|
4
|
+
describe "Base.belongs_by_uuid_to" do
|
5
|
+
|
6
|
+
context "when a corresponding _uuid column is absent" do
|
7
|
+
|
8
|
+
it "raises NotImplementedError" do
|
9
|
+
# The city has no "country_uuid" column
|
10
|
+
expect { City.send :belongs_by_uuid_to, :country }
|
11
|
+
.to raise_error { NotImplementedError }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context ":state" do
|
16
|
+
|
17
|
+
let!(:state) { State.create uuid: SecureRandom.uuid }
|
18
|
+
|
19
|
+
before { City.send :belongs_by_uuid_to, :state }
|
20
|
+
subject { City.new }
|
21
|
+
|
22
|
+
describe "#state" do
|
23
|
+
|
24
|
+
it "is defined" do
|
25
|
+
expect(subject).to respond_to :state
|
26
|
+
expect(subject.method(:state).arity).to eq 0
|
27
|
+
end
|
28
|
+
|
29
|
+
it "corresponds to #state_uuid" do
|
30
|
+
expect { subject.state_uuid = state.uuid }
|
31
|
+
.to change { subject.state }.to state
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "#state=" do
|
36
|
+
|
37
|
+
it "is defined" do
|
38
|
+
expect(subject).to respond_to :state=
|
39
|
+
expect(subject.method(:state=).arity).to eq 1
|
40
|
+
end
|
41
|
+
|
42
|
+
it "sets the #state" do
|
43
|
+
expect { subject.state = state }.to change { subject.state }.to state
|
44
|
+
end
|
45
|
+
|
46
|
+
it "sets the #state_uuid" do
|
47
|
+
expect { subject.state = state }
|
48
|
+
.to change { subject.state_uuid }.to state.uuid
|
49
|
+
end
|
50
|
+
|
51
|
+
it "resets the #state" do
|
52
|
+
subject.state = state
|
53
|
+
expect { subject.state = nil }.to change { subject.state }.to nil
|
54
|
+
end
|
55
|
+
|
56
|
+
it "resets the #state_uuid" do
|
57
|
+
subject.state = state
|
58
|
+
expect { subject.state = nil }.to change { subject.state_uuid }.to nil
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# it "resets the object uuid" do
|
63
|
+
# subject.state = state
|
64
|
+
# expect { subject.state = nil }.to change { subject.state_uuid }.to nil
|
65
|
+
# end
|
66
|
+
|
67
|
+
# it "sets the object by uuid" do
|
68
|
+
# expect { subject.state_uuid = state.uuid }
|
69
|
+
# .to change { subject.state }.to state
|
70
|
+
# end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
module Uuids
|
4
|
+
describe "Base.has_uuids" do
|
5
|
+
|
6
|
+
# Dependencies
|
7
|
+
let(:uuids_class) { Uuids::Models::Uuid }
|
8
|
+
|
9
|
+
# For this specification, the City AR model has been prepared in the
|
10
|
+
# `spec dummy/app/models/city.rb`. The model included Uuids::Base.
|
11
|
+
before { City.send :has_uuids }
|
12
|
+
subject { City.new }
|
13
|
+
|
14
|
+
it "defines the #uuids attribute" do
|
15
|
+
subject.uuids.new value: SecureRandom.uuid
|
16
|
+
subject.save!
|
17
|
+
expect(uuids_class.first.try(:record)).to eq subject
|
18
|
+
expect(subject.uuids.first).to eq uuids_class.first
|
19
|
+
end
|
20
|
+
|
21
|
+
it "defines the #uuid method" do
|
22
|
+
2.times { subject.uuids.new value: SecureRandom.uuid }
|
23
|
+
subject.save!
|
24
|
+
expect(subject.uuid).to eq subject.uuids.map(&:value).sort.first
|
25
|
+
end
|
26
|
+
|
27
|
+
it "defines the #uuid= method" do
|
28
|
+
value = "3ea8fd89-232f-4ed1-90b5-743da173cd7d"
|
29
|
+
subject.uuid = value
|
30
|
+
expect(subject.uuids.map(&:value)).to include(value)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "defines the #uuids= method" do
|
34
|
+
value = "3ea8fd89-232f-4ed1-90b5-743da173cd7d"
|
35
|
+
subject.uuids = [value]
|
36
|
+
expect(subject.uuids.map(&:value)).to include(value)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "defines +by_uuid+ class scope" do
|
40
|
+
subject.save!
|
41
|
+
subject.uuids.create!
|
42
|
+
values = subject.reload.uuids.map(&:value)
|
43
|
+
expect(City.by_uuid(*values).to_a).to eq [subject]
|
44
|
+
expect(City.by_uuid).to eq City.all
|
45
|
+
end
|
46
|
+
|
47
|
+
it "creates the first uuid by default" do
|
48
|
+
expect(subject.uuid).to be_present
|
49
|
+
end
|
50
|
+
|
51
|
+
it "requires the #uuids attribute" do
|
52
|
+
subject.save!
|
53
|
+
subject.uuids.each(&:delete)
|
54
|
+
expect(subject.reload).not_to be_valid
|
55
|
+
end
|
56
|
+
|
57
|
+
it "forbids destruction if uuids present" do
|
58
|
+
subject.save!
|
59
|
+
expect { subject.destroy! }.to raise_error
|
60
|
+
subject.uuids.each(&:delete)
|
61
|
+
subject.reload
|
62
|
+
expect { subject.destroy! }.not_to raise_error
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/spec/uuids/lib/base_spec.rb
CHANGED
@@ -3,149 +3,23 @@ require "spec_helper"
|
|
3
3
|
module Uuids
|
4
4
|
describe Base do
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
subject { Uuids::Base }
|
7
|
+
before { class Test; end }
|
8
|
+
after { begin; Uuids.send :remove_constant, :Test; rescue; end }
|
9
9
|
|
10
10
|
describe ".included" do
|
11
11
|
|
12
12
|
context "from non AR class" do
|
13
13
|
|
14
|
-
before { class Test; end }
|
15
|
-
after do
|
16
|
-
begin; described_module.send :remove_constant, :Test; rescue; end
|
17
|
-
end
|
18
|
-
|
19
14
|
it "fails" do
|
20
|
-
expect { Test.include
|
15
|
+
expect { Test.include subject }.to raise_error
|
21
16
|
end
|
22
17
|
end
|
23
18
|
|
24
19
|
context "from AR model" do
|
25
20
|
|
26
21
|
it "doesn't fail" do
|
27
|
-
expect { City.include
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
describe ".has_uuids" do
|
33
|
-
|
34
|
-
# For this specification, the City AR model has been prepared in the
|
35
|
-
# `spec dummy/app/models/city.rb`. The model included Uuids::Base.
|
36
|
-
before { City.send :has_uuids }
|
37
|
-
subject { City.new }
|
38
|
-
|
39
|
-
it "defines the #uuids attribute" do
|
40
|
-
subject.uuids.new value: SecureRandom.uuid
|
41
|
-
subject.save!
|
42
|
-
expect(uuids_class.first.try(:record)).to eq subject
|
43
|
-
expect(subject.uuids.first).to eq uuids_class.first
|
44
|
-
end
|
45
|
-
|
46
|
-
it "defines the #uuid method" do
|
47
|
-
2.times { subject.uuids.new value: SecureRandom.uuid }
|
48
|
-
subject.save!
|
49
|
-
expect(subject.uuid).to eq subject.uuids.map(&:value).sort.first
|
50
|
-
end
|
51
|
-
|
52
|
-
it "defines the #uuid= method" do
|
53
|
-
value = "3ea8fd89-232f-4ed1-90b5-743da173cd7d"
|
54
|
-
subject.uuid = value
|
55
|
-
expect(subject.uuids.map(&:value)).to include(value)
|
56
|
-
end
|
57
|
-
|
58
|
-
it "defines the #uuids= method" do
|
59
|
-
value = "3ea8fd89-232f-4ed1-90b5-743da173cd7d"
|
60
|
-
subject.uuids = [value]
|
61
|
-
expect(subject.uuids.map(&:value)).to include(value)
|
62
|
-
end
|
63
|
-
|
64
|
-
it "defines +by_uuid+ class scope" do
|
65
|
-
subject.save!
|
66
|
-
subject.uuids.create!
|
67
|
-
values = subject.reload.uuids.map(&:value)
|
68
|
-
expect(City.by_uuid(*values).to_a).to eq [subject]
|
69
|
-
expect(City.by_uuid).to eq City.all
|
70
|
-
end
|
71
|
-
|
72
|
-
it "creates the first uuid by default" do
|
73
|
-
expect(subject.uuid).to be_present
|
74
|
-
end
|
75
|
-
|
76
|
-
it "requires the #uuids attribute" do
|
77
|
-
subject.save!
|
78
|
-
subject.uuids.each(&:delete)
|
79
|
-
expect(subject.reload).not_to be_valid
|
80
|
-
end
|
81
|
-
|
82
|
-
it "forbids destruction if uuids present" do
|
83
|
-
subject.save!
|
84
|
-
expect { subject.destroy! }.to raise_error
|
85
|
-
subject.uuids.each(&:delete)
|
86
|
-
subject.reload
|
87
|
-
expect { subject.destroy! }.not_to raise_error
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
describe ".belongs_by_uuid_to" do
|
92
|
-
|
93
|
-
context "when a model doesn't include Uuids::Base" do
|
94
|
-
|
95
|
-
it "raises TypeError" do
|
96
|
-
expect { City.send :belongs_by_uuid_to, :state, class: Record }
|
97
|
-
.to raise_error { TypeError }
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
context "when a class doesn't have column for uuids" do
|
102
|
-
|
103
|
-
it "raises NotImplementedError" do
|
104
|
-
expect { City.send :belongs_by_uuid_to, :country, class: State }
|
105
|
-
.to raise_error { NotImplementedError }
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
context "with valid arguments" do
|
110
|
-
|
111
|
-
before { City.send :belongs_by_uuid_to, :state, class: State }
|
112
|
-
subject { City.new }
|
113
|
-
|
114
|
-
let!(:uuid) { "01234567-89ab-cdef-0123-456789abcdef" }
|
115
|
-
let!(:state) { State.create uuid: uuid }
|
116
|
-
|
117
|
-
it "defines the getter" do
|
118
|
-
expect(subject).to respond_to :state
|
119
|
-
expect(subject.method(:state).arity).to eq 0
|
120
|
-
end
|
121
|
-
|
122
|
-
it "defines the setter" do
|
123
|
-
expect(subject).to respond_to :state=
|
124
|
-
expect(subject.method(:state=).arity).to eq 1
|
125
|
-
end
|
126
|
-
|
127
|
-
it "sets the object" do
|
128
|
-
expect { subject.state = state }.to change { subject.state }.to state
|
129
|
-
end
|
130
|
-
|
131
|
-
it "sets the object uuid" do
|
132
|
-
expect { subject.state = state }
|
133
|
-
.to change { subject.state_uuid }.to state.uuid
|
134
|
-
end
|
135
|
-
|
136
|
-
it "resets the object" do
|
137
|
-
subject.state = state
|
138
|
-
expect { subject.state = nil }.to change { subject.state }.to nil
|
139
|
-
end
|
140
|
-
|
141
|
-
it "resets the object uuid" do
|
142
|
-
subject.state = state
|
143
|
-
expect { subject.state = nil }.to change { subject.state_uuid }.to nil
|
144
|
-
end
|
145
|
-
|
146
|
-
it "sets the object by uuid" do
|
147
|
-
expect { subject.state_uuid = state.uuid }
|
148
|
-
.to change { subject.state }.to state
|
22
|
+
expect { City.include subject }.not_to raise_error
|
149
23
|
end
|
150
24
|
end
|
151
25
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: uuids
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.1.
|
4
|
+
version: 4.1.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kozin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hexx-active_record
|
@@ -256,6 +256,8 @@ files:
|
|
256
256
|
- spec/support/runtime/config/factory_girl.rb
|
257
257
|
- spec/support/runtime/config/i18n.rb
|
258
258
|
- spec/uuids/bin/uuids_spec.rb
|
259
|
+
- spec/uuids/lib/base/belongs_by_uuid_to_spec.rb
|
260
|
+
- spec/uuids/lib/base/has_uuids_spec.rb
|
259
261
|
- spec/uuids/lib/base_spec.rb
|
260
262
|
- spec/uuids/models/uuid_spec.rb
|
261
263
|
- spec/uuids/services/add_spec.rb
|
@@ -285,6 +287,8 @@ specification_version: 4
|
|
285
287
|
summary: UUIDs AR model.
|
286
288
|
test_files:
|
287
289
|
- spec/uuids/models/uuid_spec.rb
|
290
|
+
- spec/uuids/lib/base/belongs_by_uuid_to_spec.rb
|
291
|
+
- spec/uuids/lib/base/has_uuids_spec.rb
|
288
292
|
- spec/uuids/lib/base_spec.rb
|
289
293
|
- spec/uuids/services/add_spec.rb
|
290
294
|
- spec/uuids/bin/uuids_spec.rb
|