uuids 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.rdoc +2 -2
- data/Rakefile +10 -8
- data/lib/tasks/uuids/install.rake +9 -0
- data/lib/uuids/base/has_uuids.rb +100 -0
- data/lib/uuids/base.rb +10 -47
- data/lib/uuids/version.rb +1 -1
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +0 -0
- data/spec/dummy/log/test.log +1563 -0
- data/spec/lib/uuids/base_spec.rb +9 -0
- metadata +6 -3
- data/lib/tasks/uuids_tasks.rake +0 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ab2fee573db51b09e456f46051b38e4a4bb191a9
|
4
|
+
data.tar.gz: 86a0819f977fb1866d60c286bffda28d090285c5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 360f89779357fc89de36f625aac37ea2f8d16516e981f3428f92fe49574c43b11b2982769a02403630e9a18e1abf2f501d8c10e6d87330d819006a698757b2cc
|
7
|
+
data.tar.gz: d88f464eeb0923ea24a0405f4aa4a45b4630beaea14ab14afdbff61817d29aaa53a80dd703418ee091c632e366ca7db10a52e43693dc77bc2d2e390ee7a06b1e
|
data/README.rdoc
CHANGED
@@ -98,8 +98,8 @@ This will add methods:
|
|
98
98
|
|
99
99
|
+#uuids+:: List of <tt>Uuids::Uuid</tt> objects referred to the record.
|
100
100
|
+#uuid+:: main UUID for the record - a value of the first +uuids+ (ordered by value).
|
101
|
-
|
102
|
-
<tt>.by_uuid</tt>:: A scope for unique records by UUID
|
101
|
+
<tt>#uuid=(value)</tt>:: assigns the UUID (an alias for <tt>#uuids.new value: value</tt>).
|
102
|
+
<tt>.by_uuid(*values)</tt>:: A scope for selecting unique records by UUID.
|
103
103
|
|
104
104
|
The first uuid is added by default. It can also be set manually:
|
105
105
|
|
data/Rakefile
CHANGED
@@ -29,14 +29,16 @@ require "bundler/gem_tasks"
|
|
29
29
|
require "rspec/core/rake_task"
|
30
30
|
|
31
31
|
RSpec::Core::RakeTask.new :spec
|
32
|
-
|
33
|
-
|
32
|
+
|
33
|
+
task :default do
|
34
|
+
system "rake db:migrate RAILS_ENV=test"
|
35
|
+
system "bundle exec rspec spec"
|
34
36
|
end
|
35
37
|
|
36
|
-
task :
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
38
|
+
task :check do
|
39
|
+
system "coveralls report"
|
40
|
+
system "rubocop"
|
41
|
+
system "metric_fu"
|
42
|
+
system "inch --pedantic"
|
43
|
+
system "rails_best_practices"
|
42
44
|
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
namespace :uuids do
|
2
|
+
|
3
|
+
desc "Installs the uuids gem inside a Rails application or Rails engine."
|
4
|
+
task install: :environment do
|
5
|
+
app = Rake::Task.task_defined?("railties:install:migrations") ? "" : "app:"
|
6
|
+
Rake::Task["#{ app }railties:install:migrations"].reenable
|
7
|
+
system "rake #{ app }uuids:install:migrations"
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
module Uuids
|
2
|
+
module Base
|
3
|
+
|
4
|
+
# Defines custom methods to be defined by `has_uuids` method.
|
5
|
+
module HasUuids
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
# Model scopes.
|
9
|
+
module ClassMethods
|
10
|
+
|
11
|
+
# Selects distinct records by uuids (relation scope).
|
12
|
+
#
|
13
|
+
# @example
|
14
|
+
#
|
15
|
+
# class MyRecord < ActiveRecord::Base
|
16
|
+
# include Uuids::Base
|
17
|
+
# has_uuids
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# MyRecord.by_uuid(
|
21
|
+
# "23423fe3-28d8-a1e5-bde3-2e08074aa92d",
|
22
|
+
# "9223238d-a7e3-2d36-a93d-1e50fea02de2"
|
23
|
+
# )
|
24
|
+
# # => #<ActiveRecord::Relation ...>
|
25
|
+
#
|
26
|
+
# Params:
|
27
|
+
# <tt>values</tt>:: a list of string uuids values to select records by.
|
28
|
+
#
|
29
|
+
# Returns the <tt>ActiveRecord::Relation</tt> object.
|
30
|
+
#
|
31
|
+
def by_uuid(*values)
|
32
|
+
first_value = values.first
|
33
|
+
list = first_value.is_a?(Array) ? first_value : values
|
34
|
+
joins(:uuids).where(uuids_uuids: { value: list }).uniq
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Returns the first UUID (sorted as a string) for the record.
|
39
|
+
#
|
40
|
+
# @example
|
41
|
+
# record.uuids.new value: "23423fe3-28d8-a1e5-bde3-2e08074aa92d"
|
42
|
+
# record.uuids.new value: "9223238d-a7e3-2d36-a93d-1e50fea02de2"
|
43
|
+
# record.uuid # => "23423fe3-28d8-a1e5-bde3-2e08074aa92d"
|
44
|
+
#
|
45
|
+
def uuid
|
46
|
+
uuids.map(&:value).sort.first
|
47
|
+
end
|
48
|
+
|
49
|
+
# Assigns a new uuid to the record.
|
50
|
+
#
|
51
|
+
# @example
|
52
|
+
# record.uuid = "23423fe3-28d8-a1e5-bde3-2e08074aa92d"
|
53
|
+
# record.uuid # => "23423fe3-28d8-a1e5-bde3-2e08074aa92d"
|
54
|
+
#
|
55
|
+
# Params:
|
56
|
+
# <tt>value</tt>:: a string value of uuid to assign.
|
57
|
+
#
|
58
|
+
def uuid=(value)
|
59
|
+
uuids.new value: value
|
60
|
+
end
|
61
|
+
|
62
|
+
# Assigns a list of new uuids to the record.
|
63
|
+
#
|
64
|
+
# @example
|
65
|
+
# record.uuids = [
|
66
|
+
# "23423fe3-28d8-a1e5-bde3-2e08074aa92d",
|
67
|
+
# "9223238d-a7e3-2d36-a93d-1e50fea02de2"
|
68
|
+
# ]
|
69
|
+
# record.uuids.map(&:value)
|
70
|
+
# # => [
|
71
|
+
# "23423fe3-28d8-a1e5-bde3-2e08074aa92d",
|
72
|
+
# "9223238d-a7e3-2d36-a93d-1e50fea02de2"
|
73
|
+
# ]
|
74
|
+
#
|
75
|
+
# Params:
|
76
|
+
# <tt>values</tt>:: an array of uuids string values to assign.
|
77
|
+
#
|
78
|
+
def uuids=(*values)
|
79
|
+
first_value = values.first
|
80
|
+
list = first_value.is_a?(Array) ? first_value : values
|
81
|
+
list.each { |value| self.uuid = value }
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
|
86
|
+
# Creates the uuids by default preventing a record from being ureferrable.
|
87
|
+
def add_default_uuid
|
88
|
+
uuids.present? || uuids.new
|
89
|
+
end
|
90
|
+
|
91
|
+
# Prevents destruction of a record before its uuids reassigned to
|
92
|
+
# other records.
|
93
|
+
def prevent_destruction
|
94
|
+
return true if uuids.blank?
|
95
|
+
errors.add :base, :uuids_present
|
96
|
+
false
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
data/lib/uuids/base.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require_relative "base/has_uuids"
|
2
|
+
|
1
3
|
module Uuids
|
2
4
|
|
3
5
|
# Creates required `#uuids` attribute of the ActiveRecord model.
|
@@ -13,8 +15,8 @@ module Uuids
|
|
13
15
|
#
|
14
16
|
# +uuids+:: association attribute.
|
15
17
|
# +uuid+:: method (string).
|
16
|
-
# <tt>uuid=</tt>:: new uuid
|
17
|
-
#
|
18
|
+
# <tt>uuid=</tt>:: new uuid value assignment.
|
19
|
+
# <tt>uuids=</tt>:: a list of uuids values assignment.
|
18
20
|
# <tt>uuid</tt>:: relation scope.
|
19
21
|
#
|
20
22
|
# @example
|
@@ -32,48 +34,21 @@ module Uuids
|
|
32
34
|
#
|
33
35
|
# city.uuid = "51f50391-fcd2-4f69-aab7-6ef31b29c379"
|
34
36
|
#
|
37
|
+
# city.uuids = [
|
38
|
+
# "51f50391-fcd2-4f69-aab7-6ef31b29c379",
|
39
|
+
# "3ea8fd89-232f-4ed1-90b5-743da173cd7d"
|
40
|
+
# ]
|
41
|
+
#
|
35
42
|
# City.by_uuid("51f50391-fcd2-4f69-aab7-6ef31b29c379").to_a == [city]
|
36
43
|
# # => true
|
37
44
|
#
|
38
45
|
def has_uuids
|
39
|
-
define_uuids
|
40
|
-
define_uuid_getter
|
41
|
-
define_uuid_setter
|
42
|
-
define_scope
|
43
|
-
end
|
44
|
-
|
45
|
-
# Defines the +uuids+ association attribute;
|
46
|
-
def define_uuids
|
47
46
|
has_many :uuids, class_name: "Uuids::Uuid", as: :record, validate: false
|
47
|
+
include Uuids::Base::HasUuids
|
48
48
|
before_create :add_default_uuid
|
49
49
|
before_destroy :prevent_destruction
|
50
50
|
validates :uuids, presence: true, on: :update
|
51
51
|
end
|
52
|
-
|
53
|
-
# Defines the +uuid+ method
|
54
|
-
def define_uuid_getter
|
55
|
-
class_eval "def uuid; uuids.map(&:value).sort.first; end"
|
56
|
-
end
|
57
|
-
|
58
|
-
# Defines the <tt>uuid=</tt> method
|
59
|
-
def define_uuid_setter
|
60
|
-
class_eval "def uuid=(value); uuids.new value: value; end"
|
61
|
-
end
|
62
|
-
|
63
|
-
# Defines the <tt>uuid</tt> relation scope.
|
64
|
-
def define_scope
|
65
|
-
scope(
|
66
|
-
:by_uuid,
|
67
|
-
->(*list) {
|
68
|
-
if list.first.is_a? Array
|
69
|
-
warn "[DEPRECATION] use a list of values, not an array" \
|
70
|
-
" in .by_uuid(*values) method."
|
71
|
-
list = list.first
|
72
|
-
end
|
73
|
-
joins(:uuids).where(uuids_uuids: { value: list }).uniq
|
74
|
-
}
|
75
|
-
)
|
76
|
-
end
|
77
52
|
end
|
78
53
|
|
79
54
|
private
|
@@ -84,17 +59,5 @@ module Uuids
|
|
84
59
|
fail TypeError.new("#{ klass.name } isn't an ActiveRecord model.")
|
85
60
|
end
|
86
61
|
end
|
87
|
-
|
88
|
-
# Creates the uuids by default preventing a record from being ureferrable
|
89
|
-
def add_default_uuid
|
90
|
-
uuids.present? || uuids.new
|
91
|
-
end
|
92
|
-
|
93
|
-
# Prevents destruction of a record before its uuids assigned to another one
|
94
|
-
def prevent_destruction
|
95
|
-
return true if uuids.blank?
|
96
|
-
errors.add :base, :uuids_present
|
97
|
-
false
|
98
|
-
end
|
99
62
|
end
|
100
63
|
end
|
data/lib/uuids/version.rb
CHANGED
data/spec/dummy/db/test.sqlite3
CHANGED
Binary file
|
File without changes
|