find_or_create_on_scopes 1.4.1 → 1.5.1
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 +5 -5
- data/README.md +4 -0
- data/find_or_create_on_scopes.gemspec +53 -43
- data/lib/find_or_create_on_scopes.rb +29 -23
- metadata +17 -12
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 5903bce9f66535b6bb3d2c1184fd342c70c369104b24c2748de807bc0e604d26
|
|
4
|
+
data.tar.gz: 5c6dd59fbf555f3c2042f3791e02465cc2e773b5e08cb704b4fc043e14f5a116
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 50979875ff4c6d1498a39b0ff1fa2faad75dc79272ec1b187a77aa169dc7b4a456350f0073e57c5da3d5f514da993efcabbc19639bd667ae70dd6a08e46ecb5a
|
|
7
|
+
data.tar.gz: 26e4919ab5b35f393f15dfb181e16d14126136f1126357325083a30bfcb0f97607c332cc7924ca9e714810b3a15e33e01f0556df0e2247fd54ccbef68cdd96a7
|
data/README.md
CHANGED
|
@@ -1,59 +1,69 @@
|
|
|
1
|
-
# Generated by
|
|
1
|
+
# Generated by juwelier
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
3
|
-
# Instead, edit
|
|
3
|
+
# Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
|
5
|
-
|
|
5
|
+
|
|
6
|
+
# stub: find_or_create_on_scopes 1.5.1 ruby lib
|
|
6
7
|
|
|
7
8
|
Gem::Specification.new do |s|
|
|
8
|
-
s.name = "find_or_create_on_scopes"
|
|
9
|
-
s.version = "1.
|
|
10
|
-
|
|
11
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
12
|
-
s.require_paths = ["lib"]
|
|
13
|
-
s.authors = ["Tim Morgan"]
|
|
14
|
-
s.
|
|
15
|
-
s.
|
|
16
|
-
s.email = "git@timothymorgan.info"
|
|
9
|
+
s.name = "find_or_create_on_scopes".freeze
|
|
10
|
+
s.version = "1.5.1"
|
|
11
|
+
|
|
12
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
|
13
|
+
s.require_paths = ["lib".freeze]
|
|
14
|
+
s.authors = ["Tim Morgan".freeze]
|
|
15
|
+
s.description = "Adds methods to ActiveRecord for conditionally finding, creating, or updating records.".freeze
|
|
16
|
+
s.email = "git@timothymorgan.info".freeze
|
|
17
17
|
s.extra_rdoc_files = [
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
"LICENSE",
|
|
19
|
+
"README.md"
|
|
20
20
|
]
|
|
21
21
|
s.files = [
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
"LICENSE",
|
|
23
|
+
"README.md",
|
|
24
|
+
"find_or_create_on_scopes.gemspec",
|
|
25
|
+
"lib/find_or_create_on_scopes.rb"
|
|
26
26
|
]
|
|
27
|
-
s.homepage = "http://github.com/riscfuture/find_or_create_on_scopes"
|
|
28
|
-
s.required_ruby_version = Gem::Requirement.new(">= 1.9")
|
|
29
|
-
s.rubygems_version = "2.
|
|
30
|
-
s.summary = "find_or_create-type methods on ActiveRecord scopes"
|
|
27
|
+
s.homepage = "http://github.com/riscfuture/find_or_create_on_scopes".freeze
|
|
28
|
+
s.required_ruby_version = Gem::Requirement.new(">= 1.9".freeze)
|
|
29
|
+
s.rubygems_version = "2.6.3".freeze
|
|
30
|
+
s.summary = "[DEPRECATED] find_or_create-type methods on ActiveRecord scopes".freeze
|
|
31
|
+
s.post_install_message = <<~MSG
|
|
32
|
+
|
|
33
|
+
⚠️ DEPRECATED: find_or_create_on_scopes is no longer maintained.
|
|
34
|
+
|
|
35
|
+
No longer maintained. ActiveRecord's `find_or_create_by` plus relation scoping covers similar use cases on modern Rails.
|
|
31
36
|
|
|
32
|
-
|
|
37
|
+
This is the final release. No further updates are planned.
|
|
38
|
+
|
|
39
|
+
MSG
|
|
40
|
+
|
|
41
|
+
if s.respond_to? :specification_version
|
|
33
42
|
s.specification_version = 4
|
|
34
43
|
|
|
35
|
-
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0')
|
|
36
|
-
s.add_runtime_dependency(
|
|
37
|
-
s.add_development_dependency(
|
|
38
|
-
s.add_development_dependency(
|
|
39
|
-
s.add_development_dependency(
|
|
40
|
-
s.add_development_dependency(
|
|
41
|
-
s.add_development_dependency(
|
|
44
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0')
|
|
45
|
+
s.add_runtime_dependency('activerecord'.freeze, [">= 3.1"])
|
|
46
|
+
s.add_development_dependency('activerecord-jdbcsqlite3-adapter'.freeze, [">= 0"])
|
|
47
|
+
s.add_development_dependency('juwelier'.freeze, [">= 0"])
|
|
48
|
+
s.add_development_dependency('redcarpet'.freeze, [">= 0"])
|
|
49
|
+
s.add_development_dependency('rspec'.freeze, [">= 0"])
|
|
50
|
+
s.add_development_dependency('sqlite3'.freeze, [">= 0"])
|
|
42
51
|
else
|
|
43
|
-
s.add_dependency(
|
|
44
|
-
s.add_dependency(
|
|
45
|
-
s.add_dependency(
|
|
46
|
-
s.add_dependency(
|
|
47
|
-
s.add_dependency(
|
|
48
|
-
s.add_dependency(
|
|
52
|
+
s.add_dependency('activerecord'.freeze, [">= 3.1"])
|
|
53
|
+
s.add_dependency('activerecord-jdbcsqlite3-adapter'.freeze, [">= 0"])
|
|
54
|
+
s.add_dependency('sqlite3'.freeze, [">= 0"])
|
|
55
|
+
s.add_dependency('sqlite3'.freeze, [">= 0"])
|
|
56
|
+
s.add_dependency('sqlite3'.freeze, [">= 0"])
|
|
57
|
+
s.add_dependency('sqlite3'.freeze, [">= 0"])
|
|
58
|
+
s.add_dependency('yard'.freeze, [">= 0"])
|
|
49
59
|
end
|
|
50
60
|
else
|
|
51
|
-
s.add_dependency(
|
|
52
|
-
s.add_dependency(
|
|
53
|
-
s.add_dependency(
|
|
54
|
-
s.add_dependency(
|
|
55
|
-
s.add_dependency(
|
|
56
|
-
s.add_dependency(
|
|
61
|
+
s.add_dependency('juwelier'.freeze, [">= 0"])
|
|
62
|
+
s.add_dependency('juwelier'.freeze, [">= 0"])
|
|
63
|
+
s.add_dependency('redcarpet'.freeze, [">= 0"])
|
|
64
|
+
s.add_dependency('rspec'.freeze, [">= 0"])
|
|
65
|
+
s.add_dependency('yard'.freeze, [">= 0"])
|
|
66
|
+
s.add_dependency('yard'.freeze, [">= 0"])
|
|
67
|
+
s.add_development_dependency('yard'.freeze, [">= 0"])
|
|
57
68
|
end
|
|
58
69
|
end
|
|
59
|
-
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
module FindOrCreateOnScopes
|
|
4
4
|
|
|
5
|
+
# Return this in a block from `find_or_create` or `create_or_update` to abort
|
|
6
|
+
# the creation/updating of a record.
|
|
7
|
+
ABORT_SAVE = Object.new
|
|
8
|
+
|
|
5
9
|
# Locates a record according to the current scope. Returns the record if
|
|
6
10
|
# found. If not found, creates a new record with the attributes of the current
|
|
7
11
|
# scope and the provided attributes.
|
|
@@ -10,6 +14,7 @@ module FindOrCreateOnScopes
|
|
|
10
14
|
# @yield [record] Yields the record before it is saved.
|
|
11
15
|
# @yieldparam [ActiveRecord::Base] record The found or created record before
|
|
12
16
|
# it is saved.
|
|
17
|
+
# @yieldreturn [ABORT_SAVE, nil] If `ABORT_SAVE` the record is not saved.
|
|
13
18
|
# @return [ActiveRecord::Base] The found or created record.
|
|
14
19
|
|
|
15
20
|
def find_or_create(*args, &block)
|
|
@@ -42,6 +47,7 @@ module FindOrCreateOnScopes
|
|
|
42
47
|
# @yield [record] Yields the record before it is saved.
|
|
43
48
|
# @yieldparam [ActiveRecord::Base] record The found or created record before
|
|
44
49
|
# it is saved.
|
|
50
|
+
# @yieldreturn [ABORT_SAVE, nil] If `ABORT_SAVE` the record is not saved.
|
|
45
51
|
# @return [ActiveRecord::Base] The found or created record.
|
|
46
52
|
|
|
47
53
|
def create_or_update(*args, &block)
|
|
@@ -74,19 +80,19 @@ module FindOrCreateOnScopes
|
|
|
74
80
|
transaction do
|
|
75
81
|
record = first || new(*args)
|
|
76
82
|
if record.new_record?
|
|
77
|
-
yield
|
|
78
|
-
record.send(meth) if meth
|
|
83
|
+
result = block_given? ? yield(record) : nil
|
|
84
|
+
record.send(meth) if meth && result != ABORT_SAVE
|
|
79
85
|
end
|
|
80
86
|
end
|
|
81
87
|
return record
|
|
82
|
-
rescue =>
|
|
83
|
-
if (defined?(Mysql2::Error) &&
|
|
84
|
-
(defined?(PG::Error) &&
|
|
85
|
-
(defined?(ActiveRecord::JDBCError) &&
|
|
86
|
-
|
|
87
|
-
if
|
|
88
|
-
|
|
89
|
-
|
|
88
|
+
rescue StandardError => e
|
|
89
|
+
if (defined?(Mysql2::Error) && e.kind_of?(Mysql2::Error)) ||
|
|
90
|
+
(defined?(PG::Error) && e.kind_of?(PG::Error)) ||
|
|
91
|
+
(defined?(ActiveRecord::JDBCError) && e.kind_of?(ActiveRecord::JDBCError)) ||
|
|
92
|
+
e.kind_of?(ActiveRecord::ActiveRecordError)
|
|
93
|
+
if e.to_s.include?('duplicate key value violates unique constraint') ||
|
|
94
|
+
e.to_s.start_with?('Duplicate entry') ||
|
|
95
|
+
e.kind_of?(ActiveRecord::RecordNotUnique)
|
|
90
96
|
retry
|
|
91
97
|
else
|
|
92
98
|
raise
|
|
@@ -101,18 +107,18 @@ module FindOrCreateOnScopes
|
|
|
101
107
|
transaction do
|
|
102
108
|
record = first || new
|
|
103
109
|
record.assign_attributes(*args) unless args.empty?
|
|
104
|
-
yield
|
|
105
|
-
record.send(meth) if meth
|
|
110
|
+
result = block_given? ? yield(record) : nil
|
|
111
|
+
record.send(meth) if meth && result != ABORT_SAVE
|
|
106
112
|
end
|
|
107
113
|
return record
|
|
108
|
-
rescue =>
|
|
109
|
-
if (defined?(Mysql2::Error) &&
|
|
110
|
-
(defined?(PG::Error) &&
|
|
111
|
-
(defined?(ActiveRecord::JDBCError) &&
|
|
112
|
-
|
|
113
|
-
if
|
|
114
|
-
|
|
115
|
-
|
|
114
|
+
rescue StandardError => e
|
|
115
|
+
if (defined?(Mysql2::Error) && e.kind_of?(Mysql2::Error)) ||
|
|
116
|
+
(defined?(PG::Error) && e.kind_of?(PG::Error)) ||
|
|
117
|
+
(defined?(ActiveRecord::JDBCError) && e.kind_of?(ActiveRecord::JDBCError)) ||
|
|
118
|
+
e.kind_of?(ActiveRecord::ActiveRecordError)
|
|
119
|
+
if e.to_s.include?('duplicate key value violates unique constraint') ||
|
|
120
|
+
e.to_s.start_with?('Duplicate entry') ||
|
|
121
|
+
e.kind_of?(ActiveRecord::RecordNotUnique)
|
|
116
122
|
|
|
117
123
|
# sadly there's no way to tell which keys are the duplicate ones from a
|
|
118
124
|
# SQL error, so we just retry 3 times and then give up :/
|
|
@@ -128,12 +134,12 @@ module FindOrCreateOnScopes
|
|
|
128
134
|
retry
|
|
129
135
|
end
|
|
130
136
|
else
|
|
131
|
-
raise
|
|
137
|
+
raise e
|
|
132
138
|
end
|
|
133
139
|
else
|
|
134
|
-
raise
|
|
140
|
+
raise e
|
|
135
141
|
end
|
|
136
142
|
end
|
|
137
143
|
end
|
|
138
144
|
|
|
139
|
-
ActiveRecord::Relation.
|
|
145
|
+
ActiveRecord::Relation.include FindOrCreateOnScopes
|
metadata
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: find_or_create_on_scopes
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.5.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Tim Morgan
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
13
|
name: activerecord
|
|
@@ -25,7 +24,7 @@ dependencies:
|
|
|
25
24
|
- !ruby/object:Gem::Version
|
|
26
25
|
version: '3.1'
|
|
27
26
|
- !ruby/object:Gem::Dependency
|
|
28
|
-
name:
|
|
27
|
+
name: activerecord-jdbcsqlite3-adapter
|
|
29
28
|
requirement: !ruby/object:Gem::Requirement
|
|
30
29
|
requirements:
|
|
31
30
|
- - ">="
|
|
@@ -39,7 +38,7 @@ dependencies:
|
|
|
39
38
|
- !ruby/object:Gem::Version
|
|
40
39
|
version: '0'
|
|
41
40
|
- !ruby/object:Gem::Dependency
|
|
42
|
-
name:
|
|
41
|
+
name: juwelier
|
|
43
42
|
requirement: !ruby/object:Gem::Requirement
|
|
44
43
|
requirements:
|
|
45
44
|
- - ">="
|
|
@@ -67,7 +66,7 @@ dependencies:
|
|
|
67
66
|
- !ruby/object:Gem::Version
|
|
68
67
|
version: '0'
|
|
69
68
|
- !ruby/object:Gem::Dependency
|
|
70
|
-
name:
|
|
69
|
+
name: rspec
|
|
71
70
|
requirement: !ruby/object:Gem::Requirement
|
|
72
71
|
requirements:
|
|
73
72
|
- - ">="
|
|
@@ -81,7 +80,7 @@ dependencies:
|
|
|
81
80
|
- !ruby/object:Gem::Version
|
|
82
81
|
version: '0'
|
|
83
82
|
- !ruby/object:Gem::Dependency
|
|
84
|
-
name:
|
|
83
|
+
name: sqlite3
|
|
85
84
|
requirement: !ruby/object:Gem::Requirement
|
|
86
85
|
requirements:
|
|
87
86
|
- - ">="
|
|
@@ -110,7 +109,14 @@ files:
|
|
|
110
109
|
homepage: http://github.com/riscfuture/find_or_create_on_scopes
|
|
111
110
|
licenses: []
|
|
112
111
|
metadata: {}
|
|
113
|
-
post_install_message:
|
|
112
|
+
post_install_message: |2+
|
|
113
|
+
|
|
114
|
+
⚠️ DEPRECATED: find_or_create_on_scopes is no longer maintained.
|
|
115
|
+
|
|
116
|
+
No longer maintained. ActiveRecord's `find_or_create_by` plus relation scoping covers similar use cases on modern Rails.
|
|
117
|
+
|
|
118
|
+
This is the final release. No further updates are planned.
|
|
119
|
+
|
|
114
120
|
rdoc_options: []
|
|
115
121
|
require_paths:
|
|
116
122
|
- lib
|
|
@@ -125,9 +131,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
125
131
|
- !ruby/object:Gem::Version
|
|
126
132
|
version: '0'
|
|
127
133
|
requirements: []
|
|
128
|
-
|
|
129
|
-
rubygems_version: 2.5.1
|
|
130
|
-
signing_key:
|
|
134
|
+
rubygems_version: 4.0.11
|
|
131
135
|
specification_version: 4
|
|
132
|
-
summary: find_or_create-type methods on ActiveRecord scopes
|
|
136
|
+
summary: "[DEPRECATED] find_or_create-type methods on ActiveRecord scopes"
|
|
133
137
|
test_files: []
|
|
138
|
+
...
|