ardb 0.27.3 → 0.29.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -7
- data/Gemfile +4 -5
- data/README.md +252 -3
- data/ardb.gemspec +8 -8
- data/bin/ardb +1 -1
- data/lib/ardb.rb +155 -72
- data/lib/ardb/adapter/base.rb +67 -47
- data/lib/ardb/adapter/mysql.rb +3 -19
- data/lib/ardb/adapter/postgresql.rb +33 -37
- data/lib/ardb/adapter/sqlite.rb +7 -16
- data/lib/ardb/adapter_spy.rb +58 -92
- data/lib/ardb/cli.rb +18 -226
- data/lib/ardb/{clirb.rb → cli/clirb.rb} +16 -18
- data/lib/ardb/cli/commands.rb +365 -0
- data/lib/ardb/db_tests.rb +2 -4
- data/lib/ardb/default_order_by.rb +3 -13
- data/lib/ardb/migration.rb +18 -20
- data/lib/ardb/record_spy.rb +7 -26
- data/lib/ardb/relation_spy.rb +0 -6
- data/lib/ardb/require_autoloaded_active_record_files.rb +103 -58
- data/lib/ardb/test_helpers.rb +2 -5
- data/lib/ardb/use_db_default.rb +4 -15
- data/lib/ardb/version.rb +1 -1
- data/script/determine_autoloaded_active_record_files.rb +11 -8
- data/test/helper.rb +9 -6
- data/test/support/factory.rb +17 -2
- data/test/support/fake_schema.rb +5 -0
- data/test/support/postgresql/migrations/.keep +0 -0
- data/test/support/postgresql/schema.rb +2 -0
- data/test/support/postgresql/setup_test_db.rb +51 -0
- data/test/support/relative_require_test_db_file.rb +2 -0
- data/test/support/require_test_db_file.rb +1 -0
- data/test/system/.keep +0 -0
- data/test/unit/adapter/base_tests.rb +163 -75
- data/test/unit/adapter/mysql_tests.rb +4 -20
- data/test/unit/adapter/postgresql_tests.rb +20 -28
- data/test/unit/adapter/sqlite_tests.rb +9 -12
- data/test/unit/adapter_spy_tests.rb +48 -71
- data/test/unit/ardb_tests.rb +338 -38
- data/test/unit/cli_tests.rb +334 -225
- data/test/unit/db_tests_tests.rb +3 -6
- data/test/unit/default_order_by_tests.rb +4 -8
- data/test/unit/migration_tests.rb +20 -17
- data/test/unit/record_spy_tests.rb +18 -23
- data/test/unit/relation_spy_tests.rb +17 -46
- data/test/unit/test_helpers_tests.rb +5 -20
- data/test/unit/use_db_default_tests.rb +9 -13
- metadata +111 -100
- data/lib/ardb/has_slug.rb +0 -107
- data/lib/ardb/migration_helpers.rb +0 -77
- data/lib/ardb/root_path.rb +0 -15
- data/test/unit/config_tests.rb +0 -58
- data/test/unit/has_slug_tests.rb +0 -341
- data/test/unit/migration_helpers_tests.rb +0 -59
@@ -1,10 +1,9 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "assert"
|
2
|
+
require "ardb/test_helpers"
|
3
3
|
|
4
|
-
require
|
4
|
+
require "ardb/adapter_spy"
|
5
5
|
|
6
6
|
module Ardb::TestHelpers
|
7
|
-
|
8
7
|
class UnitTests < Assert::Context
|
9
8
|
desc "Ardb::TestHelpers"
|
10
9
|
subject{ Ardb::TestHelpers }
|
@@ -13,19 +12,13 @@ module Ardb::TestHelpers
|
|
13
12
|
should have_imeths :create_db!, :create_db, :drop_db!, :drop_db
|
14
13
|
should have_imeths :connect_db!, :connect_db, :migrate_db!, :migrate_db
|
15
14
|
should have_imeths :reset_db, :reset_db!
|
16
|
-
|
17
15
|
end
|
18
16
|
|
19
17
|
class UsageTests < UnitTests
|
20
18
|
setup do
|
21
|
-
@
|
22
|
-
@
|
23
|
-
Ardb::Adapter.current = @adapter_spy = @adapter_spy_class.new
|
24
|
-
end
|
25
|
-
teardown do
|
26
|
-
Ardb::Adapter.current = @orig_ardb_adapter
|
19
|
+
@adapter_spy = Ardb::AdapterSpy.new
|
20
|
+
Assert.stub(Ardb, :adapter){ @adapter_spy }
|
27
21
|
end
|
28
|
-
|
29
22
|
end
|
30
23
|
|
31
24
|
class DropTablesTests < UsageTests
|
@@ -36,7 +29,6 @@ module Ardb::TestHelpers
|
|
36
29
|
subject.drop_tables
|
37
30
|
assert_equal 1, @adapter_spy.drop_tables_called_count
|
38
31
|
end
|
39
|
-
|
40
32
|
end
|
41
33
|
|
42
34
|
class LoadSchemaTests < UsageTests
|
@@ -47,7 +39,6 @@ module Ardb::TestHelpers
|
|
47
39
|
subject.load_schema
|
48
40
|
assert_equal 1, @adapter_spy.load_schema_called_count
|
49
41
|
end
|
50
|
-
|
51
42
|
end
|
52
43
|
|
53
44
|
class CreateDbTests < UsageTests
|
@@ -68,7 +59,6 @@ module Ardb::TestHelpers
|
|
68
59
|
subject.create_db!
|
69
60
|
assert_equal 2, @adapter_spy.create_db_called_count
|
70
61
|
end
|
71
|
-
|
72
62
|
end
|
73
63
|
|
74
64
|
class DropDbTests < UsageTests
|
@@ -89,7 +79,6 @@ module Ardb::TestHelpers
|
|
89
79
|
subject.drop_db!
|
90
80
|
assert_equal 2, @adapter_spy.drop_db_called_count
|
91
81
|
end
|
92
|
-
|
93
82
|
end
|
94
83
|
|
95
84
|
class ConnectDbTests < UsageTests
|
@@ -110,7 +99,6 @@ module Ardb::TestHelpers
|
|
110
99
|
subject.connect_db!
|
111
100
|
assert_equal 2, @adapter_spy.connect_db_called_count
|
112
101
|
end
|
113
|
-
|
114
102
|
end
|
115
103
|
|
116
104
|
class MigrateDbTests < UsageTests
|
@@ -131,7 +119,6 @@ module Ardb::TestHelpers
|
|
131
119
|
subject.migrate_db!
|
132
120
|
assert_equal 2, @adapter_spy.migrate_db_called_count
|
133
121
|
end
|
134
|
-
|
135
122
|
end
|
136
123
|
|
137
124
|
class ResetDbTests < UsageTests
|
@@ -172,7 +159,5 @@ module Ardb::TestHelpers
|
|
172
159
|
assert_equal 2, @adapter_spy.create_db_called_count
|
173
160
|
assert_equal 2, @adapter_spy.load_schema_called_count
|
174
161
|
end
|
175
|
-
|
176
162
|
end
|
177
|
-
|
178
163
|
end
|
@@ -1,11 +1,10 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "assert"
|
2
|
+
require "ardb/use_db_default"
|
3
3
|
|
4
|
-
require
|
5
|
-
require
|
4
|
+
require "much-plugin"
|
5
|
+
require "ardb/record_spy"
|
6
6
|
|
7
7
|
module Ardb::UseDbDefault
|
8
|
-
|
9
8
|
class UnitTests < Assert::Context
|
10
9
|
desc "Ardb::UseDbDefault"
|
11
10
|
setup do
|
@@ -27,9 +26,9 @@ module Ardb::UseDbDefault
|
|
27
26
|
end
|
28
27
|
|
29
28
|
should "add use db default attributes using `use_db_default`" do
|
30
|
-
|
31
|
-
subject.use_db_default(
|
32
|
-
assert_includes
|
29
|
+
an_attr_name = Factory.string
|
30
|
+
subject.use_db_default(an_attr_name)
|
31
|
+
assert_includes an_attr_name, subject.ardb_use_db_default_attrs
|
33
32
|
|
34
33
|
attr_names = [Factory.string, Factory.string.to_sym]
|
35
34
|
subject.use_db_default(*attr_names)
|
@@ -58,7 +57,6 @@ module Ardb::UseDbDefault
|
|
58
57
|
exp = [:ardb_allow_db_to_default_attrs]
|
59
58
|
assert_equal exp, callback.args
|
60
59
|
end
|
61
|
-
|
62
60
|
end
|
63
61
|
|
64
62
|
class InitTests < UnitTests
|
@@ -71,13 +69,13 @@ module Ardb::UseDbDefault
|
|
71
69
|
|
72
70
|
# simulate activerecords `@attributes` hash
|
73
71
|
@original_attrs = @attr_names.inject({}) do |h, n|
|
74
|
-
h.merge!(n => [nil, Factory.string, Factory.integer].
|
72
|
+
h.merge!(n => [nil, Factory.string, Factory.integer].sample)
|
75
73
|
end
|
76
74
|
@original_attrs.merge!(Factory.string => Factory.string)
|
77
75
|
@record.attributes = @original_attrs.dup
|
78
76
|
|
79
77
|
# randomly pick a use-db-default attribute to be changed
|
80
|
-
@record.changed_use_db_default_attrs = [@attr_names.
|
78
|
+
@record.changed_use_db_default_attrs = [@attr_names.sample]
|
81
79
|
@unchanged_attr_names = @attr_names - @record.changed_use_db_default_attrs
|
82
80
|
|
83
81
|
# we should always get the record we just inserted back
|
@@ -132,7 +130,6 @@ module Ardb::UseDbDefault
|
|
132
130
|
assert_equal @original_attrs[name], subject.attributes[name]
|
133
131
|
end
|
134
132
|
end
|
135
|
-
|
136
133
|
end
|
137
134
|
|
138
135
|
module UseDbDefaultRecordSpy
|
@@ -156,5 +153,4 @@ module Ardb::UseDbDefault
|
|
156
153
|
end
|
157
154
|
end
|
158
155
|
end
|
159
|
-
|
160
156
|
end
|
metadata
CHANGED
@@ -1,88 +1,108 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: ardb
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.29.0
|
5
5
|
platform: ruby
|
6
|
-
authors:
|
6
|
+
authors:
|
7
7
|
- Kelly Redding
|
8
8
|
- Collin Redding
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2020-12-17 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
16
15
|
name: assert
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
version: 2.15.1
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 2.18.1
|
23
21
|
type: :development
|
24
|
-
version_requirements: *id001
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
|
-
name: activerecord
|
27
22
|
prerelease: false
|
28
|
-
|
29
|
-
requirements:
|
30
|
-
- - ~>
|
31
|
-
-
|
32
|
-
version:
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 2.18.1
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: activerecord
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">"
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '5.0'
|
35
|
+
- - "<"
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '7.0'
|
33
38
|
type: :runtime
|
34
|
-
version_requirements: *id002
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
|
-
name: activesupport
|
37
39
|
prerelease: false
|
38
|
-
|
39
|
-
requirements:
|
40
|
-
- -
|
41
|
-
-
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ">"
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '5.0'
|
45
|
+
- - "<"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '7.0'
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: activesupport
|
50
|
+
requirement: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '5.0'
|
55
|
+
- - "<"
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '7.0'
|
42
58
|
type: :runtime
|
43
|
-
version_requirements: *id004
|
44
|
-
- !ruby/object:Gem::Dependency
|
45
|
-
name: much-plugin
|
46
59
|
prerelease: false
|
47
|
-
|
48
|
-
requirements:
|
49
|
-
- -
|
50
|
-
- !ruby/object:Gem::Version
|
51
|
-
version:
|
60
|
+
version_requirements: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">"
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '5.0'
|
65
|
+
- - "<"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '7.0'
|
68
|
+
- !ruby/object:Gem::Dependency
|
69
|
+
name: much-plugin
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 0.2.1
|
52
75
|
type: :runtime
|
53
|
-
version_requirements: *id005
|
54
|
-
- !ruby/object:Gem::Dependency
|
55
|
-
name: ns-options
|
56
76
|
prerelease: false
|
57
|
-
|
58
|
-
requirements:
|
59
|
-
- - ~>
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version:
|
62
|
-
|
63
|
-
version_requirements: *id006
|
64
|
-
- !ruby/object:Gem::Dependency
|
77
|
+
version_requirements: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: 0.2.1
|
82
|
+
- !ruby/object:Gem::Dependency
|
65
83
|
name: scmd
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
version: 3.0.1
|
84
|
+
requirement: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: 3.0.3
|
72
89
|
type: :runtime
|
73
|
-
|
90
|
+
prerelease: false
|
91
|
+
version_requirements: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: 3.0.3
|
74
96
|
description: Activerecord database tools.
|
75
|
-
email:
|
97
|
+
email:
|
76
98
|
- kelly@kellyredding.com
|
77
99
|
- collin.redding@me.com
|
78
|
-
executables:
|
100
|
+
executables:
|
79
101
|
- ardb
|
80
102
|
extensions: []
|
81
|
-
|
82
103
|
extra_rdoc_files: []
|
83
|
-
|
84
|
-
|
85
|
-
- .gitignore
|
104
|
+
files:
|
105
|
+
- ".gitignore"
|
86
106
|
- Gemfile
|
87
107
|
- LICENSE
|
88
108
|
- README.md
|
@@ -95,16 +115,14 @@ files:
|
|
95
115
|
- lib/ardb/adapter/sqlite.rb
|
96
116
|
- lib/ardb/adapter_spy.rb
|
97
117
|
- lib/ardb/cli.rb
|
98
|
-
- lib/ardb/clirb.rb
|
118
|
+
- lib/ardb/cli/clirb.rb
|
119
|
+
- lib/ardb/cli/commands.rb
|
99
120
|
- lib/ardb/db_tests.rb
|
100
121
|
- lib/ardb/default_order_by.rb
|
101
|
-
- lib/ardb/has_slug.rb
|
102
122
|
- lib/ardb/migration.rb
|
103
|
-
- lib/ardb/migration_helpers.rb
|
104
123
|
- lib/ardb/record_spy.rb
|
105
124
|
- lib/ardb/relation_spy.rb
|
106
125
|
- lib/ardb/require_autoloaded_active_record_files.rb
|
107
|
-
- lib/ardb/root_path.rb
|
108
126
|
- lib/ardb/test_helpers.rb
|
109
127
|
- lib/ardb/use_db_default.rb
|
110
128
|
- lib/ardb/version.rb
|
@@ -112,6 +130,13 @@ files:
|
|
112
130
|
- script/determine_autoloaded_active_record_files.rb
|
113
131
|
- test/helper.rb
|
114
132
|
- test/support/factory.rb
|
133
|
+
- test/support/fake_schema.rb
|
134
|
+
- test/support/postgresql/migrations/.keep
|
135
|
+
- test/support/postgresql/schema.rb
|
136
|
+
- test/support/postgresql/setup_test_db.rb
|
137
|
+
- test/support/relative_require_test_db_file.rb
|
138
|
+
- test/support/require_test_db_file.rb
|
139
|
+
- test/system/.keep
|
115
140
|
- test/unit/adapter/base_tests.rb
|
116
141
|
- test/unit/adapter/mysql_tests.rb
|
117
142
|
- test/unit/adapter/postgresql_tests.rb
|
@@ -119,58 +144,47 @@ files:
|
|
119
144
|
- test/unit/adapter_spy_tests.rb
|
120
145
|
- test/unit/ardb_tests.rb
|
121
146
|
- test/unit/cli_tests.rb
|
122
|
-
- test/unit/config_tests.rb
|
123
147
|
- test/unit/db_tests_tests.rb
|
124
148
|
- test/unit/default_order_by_tests.rb
|
125
|
-
- test/unit/has_slug_tests.rb
|
126
|
-
- test/unit/migration_helpers_tests.rb
|
127
149
|
- test/unit/migration_tests.rb
|
128
150
|
- test/unit/record_spy_tests.rb
|
129
151
|
- test/unit/relation_spy_tests.rb
|
130
152
|
- test/unit/test_helpers_tests.rb
|
131
153
|
- test/unit/use_db_default_tests.rb
|
132
154
|
- tmp/.gitkeep
|
133
|
-
- tmp/mysqltest/.gitkeep
|
134
|
-
- tmp/pgtest/.gitkeep
|
135
|
-
- tmp/pgtest/Gemfile
|
136
|
-
- tmp/pgtest/Gemfile.lock
|
137
|
-
- tmp/pgtest/config/.gitkeep
|
138
|
-
- tmp/sqlitetest/.gitkeep
|
139
|
-
- tmp/sqlitetest/Gemfile
|
140
|
-
- tmp/sqlitetest/Gemfile.lock
|
141
|
-
- tmp/sqlitetest/config/.gitkeep
|
142
|
-
- tmp/testdb/config/.gitkeep
|
143
|
-
- tmp/testdb/config/db.rb
|
144
|
-
- tmp/testdb/fake_schema.rb
|
145
155
|
homepage: http://github.com/redding/ardb
|
146
|
-
licenses:
|
156
|
+
licenses:
|
147
157
|
- MIT
|
148
158
|
metadata: {}
|
149
|
-
|
150
159
|
post_install_message:
|
151
160
|
rdoc_options: []
|
152
|
-
|
153
|
-
require_paths:
|
161
|
+
require_paths:
|
154
162
|
- lib
|
155
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
156
|
-
requirements:
|
157
|
-
-
|
158
|
-
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
163
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
164
|
+
requirements:
|
165
|
+
- - "~>"
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
version: '2.4'
|
168
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
169
|
+
requirements:
|
170
|
+
- - ">="
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: '0'
|
164
173
|
requirements: []
|
165
|
-
|
166
|
-
rubyforge_project:
|
167
|
-
rubygems_version: 2.5.1
|
174
|
+
rubygems_version: 3.1.2
|
168
175
|
signing_key:
|
169
176
|
specification_version: 4
|
170
177
|
summary: Activerecord database tools.
|
171
|
-
test_files:
|
178
|
+
test_files:
|
172
179
|
- test/helper.rb
|
173
180
|
- test/support/factory.rb
|
181
|
+
- test/support/fake_schema.rb
|
182
|
+
- test/support/postgresql/migrations/.keep
|
183
|
+
- test/support/postgresql/schema.rb
|
184
|
+
- test/support/postgresql/setup_test_db.rb
|
185
|
+
- test/support/relative_require_test_db_file.rb
|
186
|
+
- test/support/require_test_db_file.rb
|
187
|
+
- test/system/.keep
|
174
188
|
- test/unit/adapter/base_tests.rb
|
175
189
|
- test/unit/adapter/mysql_tests.rb
|
176
190
|
- test/unit/adapter/postgresql_tests.rb
|
@@ -178,11 +192,8 @@ test_files:
|
|
178
192
|
- test/unit/adapter_spy_tests.rb
|
179
193
|
- test/unit/ardb_tests.rb
|
180
194
|
- test/unit/cli_tests.rb
|
181
|
-
- test/unit/config_tests.rb
|
182
195
|
- test/unit/db_tests_tests.rb
|
183
196
|
- test/unit/default_order_by_tests.rb
|
184
|
-
- test/unit/has_slug_tests.rb
|
185
|
-
- test/unit/migration_helpers_tests.rb
|
186
197
|
- test/unit/migration_tests.rb
|
187
198
|
- test/unit/record_spy_tests.rb
|
188
199
|
- test/unit/relation_spy_tests.rb
|
data/lib/ardb/has_slug.rb
DELETED
@@ -1,107 +0,0 @@
|
|
1
|
-
require 'much-plugin'
|
2
|
-
|
3
|
-
module Ardb
|
4
|
-
|
5
|
-
module HasSlug
|
6
|
-
include MuchPlugin
|
7
|
-
|
8
|
-
DEFAULT_ATTRIBUTE = :slug
|
9
|
-
DEFAULT_PREPROCESSOR = :downcase
|
10
|
-
DEFAULT_SEPARATOR = '-'.freeze
|
11
|
-
|
12
|
-
plugin_included do
|
13
|
-
extend ClassMethods
|
14
|
-
include InstanceMethods
|
15
|
-
|
16
|
-
@ardb_has_slug_configs = Hash.new{ |h, k| h[k] = {} }
|
17
|
-
end
|
18
|
-
|
19
|
-
module ClassMethods
|
20
|
-
|
21
|
-
def has_slug(options = nil)
|
22
|
-
options ||= {}
|
23
|
-
raise(ArgumentError, "a source must be provided") unless options[:source]
|
24
|
-
|
25
|
-
attribute = (options[:attribute] || DEFAULT_ATTRIBUTE).to_sym
|
26
|
-
@ardb_has_slug_configs[attribute].merge!({
|
27
|
-
:source_proc => options[:source].to_proc,
|
28
|
-
:preprocessor_proc => (options[:preprocessor] || DEFAULT_PREPROCESSOR).to_proc,
|
29
|
-
:separator => options[:separator] || DEFAULT_SEPARATOR,
|
30
|
-
:allow_underscores => !!options[:allow_underscores]
|
31
|
-
})
|
32
|
-
|
33
|
-
# since the slug isn't written till an after callback we can't always
|
34
|
-
# validate presence of it
|
35
|
-
validates_presence_of(attribute, :on => :update)
|
36
|
-
|
37
|
-
if options[:skip_unique_validation] != true
|
38
|
-
validates_uniqueness_of(attribute, {
|
39
|
-
:case_sensitive => true,
|
40
|
-
:scope => options[:unique_scope]
|
41
|
-
})
|
42
|
-
end
|
43
|
-
|
44
|
-
after_create :ardb_has_slug_generate_slugs
|
45
|
-
after_update :ardb_has_slug_generate_slugs
|
46
|
-
end
|
47
|
-
|
48
|
-
def ardb_has_slug_configs
|
49
|
-
@ardb_has_slug_configs
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|
53
|
-
|
54
|
-
module InstanceMethods
|
55
|
-
|
56
|
-
private
|
57
|
-
|
58
|
-
def reset_slug(attribute = nil)
|
59
|
-
attribute ||= DEFAULT_ATTRIBUTE
|
60
|
-
self.send("#{attribute}=", nil)
|
61
|
-
end
|
62
|
-
|
63
|
-
def ardb_has_slug_generate_slugs
|
64
|
-
self.class.ardb_has_slug_configs.each do |attr_name, config|
|
65
|
-
slug_source = if !self.send(attr_name) || self.send(attr_name).to_s.empty?
|
66
|
-
self.instance_eval(&config[:source_proc])
|
67
|
-
else
|
68
|
-
self.send(attr_name)
|
69
|
-
end
|
70
|
-
|
71
|
-
generated_slug = Slug.new(slug_source, {
|
72
|
-
:preprocessor => config[:preprocessor_proc],
|
73
|
-
:separator => config[:separator],
|
74
|
-
:allow_underscores => config[:allow_underscores]
|
75
|
-
})
|
76
|
-
next if self.send(attr_name) == generated_slug
|
77
|
-
self.send("#{attr_name}=", generated_slug)
|
78
|
-
self.update_column(attr_name, generated_slug)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
end
|
83
|
-
|
84
|
-
module Slug
|
85
|
-
def self.new(string, options = nil)
|
86
|
-
options ||= {}
|
87
|
-
preprocessor = options[:preprocessor]
|
88
|
-
separator = options[:separator]
|
89
|
-
allow_underscores = options[:allow_underscores]
|
90
|
-
regexp_escaped_sep = Regexp.escape(separator)
|
91
|
-
|
92
|
-
slug = preprocessor.call(string.to_s.dup)
|
93
|
-
# Turn unwanted chars into the separator
|
94
|
-
slug.gsub!(/[^\w#{regexp_escaped_sep}]+/, separator)
|
95
|
-
# Turn underscores into the separator, unless allowing
|
96
|
-
slug.gsub!(/_/, separator) unless allow_underscores
|
97
|
-
# No more than one of the separator in a row.
|
98
|
-
slug.gsub!(/#{regexp_escaped_sep}{2,}/, separator)
|
99
|
-
# Remove leading/trailing separator.
|
100
|
-
slug.gsub!(/\A#{regexp_escaped_sep}|#{regexp_escaped_sep}\z/, '')
|
101
|
-
slug
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
end
|
106
|
-
|
107
|
-
end
|