ardb 0.27.0 → 0.27.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ data.tar.gz: bd6e2e2855ebc107bc3da24642e8a996da2fa06b
4
+ metadata.gz: fb550afe9e0c76af643938e94fb4fcab9fe1afeb
5
+ SHA512:
6
+ data.tar.gz: bdd10e94e00e33f2800be95666efed91518da00f3109e73e1878e341fa6ad5a384f5a7d78f5ebaa07b7ed136bd6b122fdd29dea43c2242c746986a71d9fb092e
7
+ metadata.gz: 51e6669ff3c303a14bcec3e5eb15c0dbb7442216257a1479421588de0a4e675eb9dc54bd068d9519b9dc1bbbccbf8756cba59d563529fa6dff6ad71d2debccd1
data/lib/ardb.rb CHANGED
@@ -23,6 +23,7 @@ module Ardb
23
23
  end
24
24
 
25
25
  def self.init(establish_connection = true)
26
+ require 'ardb/require_autoloaded_active_record_files'
26
27
  require self.config.db_file
27
28
  validate!
28
29
  Adapter.init
data/lib/ardb/has_slug.rb CHANGED
@@ -13,8 +13,7 @@ module Ardb
13
13
  extend ClassMethods
14
14
  include InstanceMethods
15
15
 
16
- @ardb_has_slug_config = {}
17
-
16
+ @ardb_has_slug_configs = Hash.new{ |h, k| h[k] = {} }
18
17
  end
19
18
 
20
19
  module ClassMethods
@@ -23,8 +22,8 @@ module Ardb
23
22
  options ||= {}
24
23
  raise(ArgumentError, "a source must be provided") unless options[:source]
25
24
 
26
- @ardb_has_slug_config.merge!({
27
- :attribute => options[:attribute] || DEFAULT_ATTRIBUTE,
25
+ attribute = (options[:attribute] || DEFAULT_ATTRIBUTE).to_sym
26
+ @ardb_has_slug_configs[attribute].merge!({
28
27
  :source_proc => options[:source].to_proc,
29
28
  :preprocessor_proc => (options[:preprocessor] || DEFAULT_PREPROCESSOR).to_proc,
30
29
  :separator => options[:separator] || DEFAULT_SEPARATOR,
@@ -33,18 +32,18 @@ module Ardb
33
32
 
34
33
  # since the slug isn't written till an after callback we can't always
35
34
  # validate presence of it
36
- validates_presence_of(self.ardb_has_slug_config[:attribute], :on => :update)
37
- validates_uniqueness_of(self.ardb_has_slug_config[:attribute], {
35
+ validates_presence_of(attribute, :on => :update)
36
+ validates_uniqueness_of(attribute, {
38
37
  :case_sensitive => true,
39
38
  :scope => options[:unique_scope]
40
39
  })
41
40
 
42
- after_create :ardb_has_slug_generate_slug
43
- after_update :ardb_has_slug_generate_slug
41
+ after_create :ardb_has_slug_generate_slugs
42
+ after_update :ardb_has_slug_generate_slugs
44
43
  end
45
44
 
46
- def ardb_has_slug_config
47
- @ardb_has_slug_config
45
+ def ardb_has_slug_configs
46
+ @ardb_has_slug_configs
48
47
  end
49
48
 
50
49
  end
@@ -53,37 +52,37 @@ module Ardb
53
52
 
54
53
  private
55
54
 
56
- def reset_slug
57
- self.send("#{self.class.ardb_has_slug_config[:attribute]}=", nil)
55
+ def reset_slug(attribute = nil)
56
+ attribute ||= DEFAULT_ATTRIBUTE
57
+ self.send("#{attribute}=", nil)
58
58
  end
59
59
 
60
- def ardb_has_slug_generate_slug
61
- attr_name = self.class.ardb_has_slug_config[:attribute]
62
- slug_source = if !self.send(attr_name) || self.send(attr_name).to_s.empty?
63
- self.instance_eval(&self.class.ardb_has_slug_config[:source_proc])
64
- else
65
- self.send(attr_name)
60
+ def ardb_has_slug_generate_slugs
61
+ self.class.ardb_has_slug_configs.each do |attr_name, config|
62
+ slug_source = if !self.send(attr_name) || self.send(attr_name).to_s.empty?
63
+ self.instance_eval(&config[:source_proc])
64
+ else
65
+ self.send(attr_name)
66
+ end
67
+
68
+ generated_slug = Slug.new(slug_source, {
69
+ :preprocessor => config[:preprocessor_proc],
70
+ :separator => config[:separator],
71
+ :allow_underscores => config[:allow_underscores]
72
+ })
73
+ next if self.send(attr_name) == generated_slug
74
+ self.send("#{attr_name}=", generated_slug)
75
+ self.update_column(attr_name, generated_slug)
66
76
  end
67
-
68
- generated_slug = Slug.new(slug_source, {
69
- :preprocessor => self.class.ardb_has_slug_config[:preprocessor_proc],
70
- :separator => self.class.ardb_has_slug_config[:separator],
71
- :allow_underscores => self.class.ardb_has_slug_config[:allow_underscores]
72
- })
73
- return if self.send(attr_name) == generated_slug
74
- self.send("#{attr_name}=", generated_slug)
75
- self.update_column(attr_name, generated_slug)
76
77
  end
77
78
 
78
79
  end
79
80
 
80
81
  module Slug
81
- DEFAULT_PREPROCESSOR = proc{ |slug| slug } # no-op
82
-
83
82
  def self.new(string, options = nil)
84
83
  options ||= {}
85
- preprocessor = options[:preprocessor] || DEFAULT_PREPROCESSOR
86
- separator = options[:separator] || DEFAULT_SEPARATOR
84
+ preprocessor = options[:preprocessor]
85
+ separator = options[:separator]
87
86
  allow_underscores = options[:allow_underscores]
88
87
  regexp_escaped_sep = Regexp.escape(separator)
89
88
 
@@ -0,0 +1,69 @@
1
+ # ActiveRecord makes use of autoload to load some of its components as-needed.
2
+ # This doesn't work well with threaded environments, and causes uninitialized
3
+ # constants. To avoid this, this file manually requires the following files that
4
+ # are not required using `require 'active_record'`. Trying to automatically
5
+ # require every file in ActiveRecord is slow and inefficient. Many of the files
6
+ # fail to require and there are some we don't want to require. Thus, this is a
7
+ # manual list of requires.
8
+
9
+ # To re-build this list of requires, run the following:
10
+ # bundle exec ruby script/determine_autoloaded_active_record_files.rb
11
+
12
+ # For compatibility, we require active record first
13
+ require 'active_record'
14
+
15
+ require 'active_record/aggregations'
16
+ require 'active_record/associations'
17
+ require 'active_record/associations/alias_tracker'
18
+ require 'active_record/associations/association'
19
+ require 'active_record/associations/association_scope'
20
+ require 'active_record/associations/belongs_to_association'
21
+ require 'active_record/associations/belongs_to_polymorphic_association'
22
+ require 'active_record/associations/builder/association'
23
+ require 'active_record/associations/builder/belongs_to'
24
+ require 'active_record/associations/builder/collection_association'
25
+ require 'active_record/associations/builder/has_and_belongs_to_many'
26
+ require 'active_record/associations/builder/has_many'
27
+ require 'active_record/associations/builder/has_one'
28
+ require 'active_record/associations/collection_association'
29
+ require 'active_record/associations/collection_proxy'
30
+ require 'active_record/associations/has_and_belongs_to_many_association'
31
+ require 'active_record/associations/has_many_association'
32
+ require 'active_record/associations/has_many_through_association'
33
+ require 'active_record/associations/has_one_association'
34
+ require 'active_record/associations/has_one_through_association'
35
+ require 'active_record/associations/join_dependency'
36
+ require 'active_record/associations/join_dependency/join_association'
37
+ require 'active_record/associations/join_dependency/join_base'
38
+ require 'active_record/associations/preloader'
39
+ require 'active_record/associations/preloader/association'
40
+ require 'active_record/associations/preloader/belongs_to'
41
+ require 'active_record/associations/preloader/collection_association'
42
+ require 'active_record/associations/preloader/has_and_belongs_to_many'
43
+ require 'active_record/associations/preloader/has_many'
44
+ require 'active_record/associations/preloader/has_many_through'
45
+ require 'active_record/associations/preloader/has_one'
46
+ require 'active_record/associations/preloader/has_one_through'
47
+ require 'active_record/attribute_assignment'
48
+ require 'active_record/attribute_methods/before_type_cast'
49
+ require 'active_record/attribute_methods/deprecated_underscore_read'
50
+ require 'active_record/attribute_methods/dirty'
51
+ require 'active_record/attribute_methods/primary_key'
52
+ require 'active_record/attribute_methods/query'
53
+ require 'active_record/attribute_methods/read'
54
+ require 'active_record/attribute_methods/serialization'
55
+ require 'active_record/attribute_methods/time_zone_conversion'
56
+ require 'active_record/autosave_association'
57
+ require 'active_record/base'
58
+ require 'active_record/dynamic_finder_match'
59
+ require 'active_record/dynamic_scope_match'
60
+ require 'active_record/observer'
61
+ require 'active_record/relation'
62
+ require 'active_record/relation/predicate_builder'
63
+ require 'active_record/result'
64
+
65
+ # There are also issues with requiring ActiveSupport. This doesn't require every
66
+ # ActiveSupport file though, only ones we've seen cause problems.
67
+ require 'active_support'
68
+
69
+ require 'active_support/multibyte/chars'
data/lib/ardb/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Ardb
2
- VERSION = "0.27.0"
2
+ VERSION = "0.27.1"
3
3
  end
@@ -0,0 +1,91 @@
1
+ require 'active_record'
2
+
3
+ # this can be slow, this is one of the reasons this shouldn't be done during
4
+ # the startup of our apps
5
+ gemspec = Gem.loaded_specs['activerecord']
6
+
7
+ puts "Looking at files in: "
8
+ puts " #{gemspec.lib_dirs_glob.inspect}"
9
+
10
+ paths = Dir["#{gemspec.lib_dirs_glob}/**/*.rb"]
11
+
12
+ # these are regexs for files we want to ignore requiring. for example,
13
+ # generators fail when we try to require them. the others are pieces of active
14
+ # record we don't use in a production environment
15
+ ignored_regexes = [
16
+ /rails\/generators/,
17
+ /active_record\/railtie/,
18
+ /active_record\/migration/,
19
+ /active_record\/fixtures/,
20
+ /active_record\/schema/,
21
+ /active_record\/connection_adapters/,
22
+ /active_record\/test_case/,
23
+ /active_record\/coders\/yaml_column/
24
+ ]
25
+
26
+ Result = Struct.new(:file, :state, :reason)
27
+
28
+ already_required = []
29
+ needs_to_be_required = []
30
+ ignored = []
31
+ errored = []
32
+
33
+ paths.sort.each do |full_path|
34
+ relative_path_with_rb = full_path.gsub("#{gemspec.lib_dirs_glob}/", '')
35
+ relative_path = relative_path_with_rb.gsub(/\.rb\z/, '')
36
+
37
+ result = Result.new(relative_path)
38
+
39
+ # see if it's ignored
40
+ ignored_regexes.each do |regex|
41
+ if relative_path =~ regex
42
+ result.state = :ignored
43
+ result.reason = "matched #{regex}"
44
+ break
45
+ end
46
+ end
47
+ if result.state == :ignored
48
+ ignored << result
49
+ next
50
+ end
51
+
52
+ # try requiring the file
53
+ begin
54
+ if result.state = require(relative_path)
55
+ needs_to_be_required << result
56
+ else
57
+ already_required << result
58
+ end
59
+ rescue LoadError, SyntaxError => exception
60
+ result.state = :errored
61
+ result.reason = "#{exception.class}: #{exception.message}"
62
+ errored << result
63
+ end
64
+ end
65
+
66
+ puts "Results\n"
67
+
68
+ puts "Ignored:"
69
+ ignored.each do |result|
70
+ puts " #{result.file}"
71
+ puts " #{result.reason}"
72
+ end
73
+ puts "\n"
74
+
75
+ puts "Errored:"
76
+ errored.each do |result|
77
+ puts " #{result.file}"
78
+ puts " #{result.reason}"
79
+ end
80
+ puts "\n"
81
+
82
+ puts "Already Required:"
83
+ already_required.each do |result|
84
+ puts " #{result.file}"
85
+ end
86
+ puts "\n"
87
+
88
+ puts "Needs To Be Required:\n"
89
+ needs_to_be_required.each do |result|
90
+ puts "require '#{result.file}'"
91
+ end
@@ -13,12 +13,12 @@ module Ardb::HasSlug
13
13
  slug_attribute = @slug_attribute = Factory.string.to_sym
14
14
  @record_class = Ardb::RecordSpy.new do
15
15
  include Ardb::HasSlug
16
- attr_accessor source_attribute, slug_attribute
17
- attr_reader :slug_db_column_name, :slug_db_column_value
16
+ attr_accessor source_attribute, slug_attribute, DEFAULT_ATTRIBUTE
17
+ attr_reader :slug_db_column_updates
18
18
 
19
- def update_column(name, value)
20
- @slug_db_column_name = name
21
- @slug_db_column_value = value
19
+ def update_column(*args)
20
+ @slug_db_column_updates ||= []
21
+ @slug_db_column_updates << args
22
22
  end
23
23
  end
24
24
  end
@@ -28,10 +28,10 @@ module Ardb::HasSlug
28
28
  ('{'..'~').to_a - ['-', '_']).freeze
29
29
 
30
30
  should have_imeths :has_slug
31
- should have_imeths :ardb_has_slug_config
31
+ should have_imeths :ardb_has_slug_configs
32
32
 
33
33
  should "use much-plugin" do
34
- assert_includes MuchPlugin, Ardb::UseDbDefault
34
+ assert_includes MuchPlugin, Ardb::HasSlug
35
35
  end
36
36
 
37
37
  should "know its default attribute, preprocessor and separator" do
@@ -40,8 +40,8 @@ module Ardb::HasSlug
40
40
  assert_equal '-', DEFAULT_SEPARATOR
41
41
  end
42
42
 
43
- should "not have any has-slug config by default" do
44
- assert_equal({}, subject.ardb_has_slug_config)
43
+ should "not have any has-slug configs by default" do
44
+ assert_equal({}, subject.ardb_has_slug_configs)
45
45
  end
46
46
 
47
47
  should "default the has slug config using `has_slug`" do
@@ -49,17 +49,17 @@ module Ardb::HasSlug
49
49
  string = Factory.string
50
50
  record = subject.new.tap{ |r| r.send("#{@source_attribute}=", string) }
51
51
 
52
- assert_equal DEFAULT_ATTRIBUTE, subject.ardb_has_slug_config[:attribute]
53
- assert_equal DEFAULT_SEPARATOR, subject.ardb_has_slug_config[:separator]
54
- assert_false subject.ardb_has_slug_config[:allow_underscores]
52
+ config = subject.ardb_has_slug_configs[DEFAULT_ATTRIBUTE]
53
+ assert_equal DEFAULT_SEPARATOR, config[:separator]
54
+ assert_false config[:allow_underscores]
55
55
 
56
- source_proc = subject.ardb_has_slug_config[:source_proc]
56
+ source_proc = config[:source_proc]
57
57
  assert_instance_of Proc, source_proc
58
58
  exp = record.send(@source_attribute)
59
59
  assert_equal exp, record.instance_eval(&source_proc)
60
60
 
61
61
  upcase_string = string.upcase
62
- preprocessor_proc = subject.ardb_has_slug_config[:preprocessor_proc]
62
+ preprocessor_proc = config[:preprocessor_proc]
63
63
  assert_instance_of Proc, preprocessor_proc
64
64
  exp = upcase_string.send(DEFAULT_PREPROCESSOR)
65
65
  assert_equal exp, preprocessor_proc.call(upcase_string)
@@ -76,27 +76,28 @@ module Ardb::HasSlug
76
76
  :allow_underscores => allow_underscore
77
77
  })
78
78
 
79
- assert_equal @slug_attribute, subject.ardb_has_slug_config[:attribute]
80
- assert_equal separator, subject.ardb_has_slug_config[:separator]
81
- assert_equal allow_underscore, subject.ardb_has_slug_config[:allow_underscores]
79
+ config = subject.ardb_has_slug_configs[@slug_attribute]
80
+ assert_equal separator, config[:separator]
81
+ assert_equal allow_underscore, config[:allow_underscores]
82
82
 
83
83
  value = Factory.string.downcase
84
- preprocessor_proc = subject.ardb_has_slug_config[:preprocessor_proc]
84
+ preprocessor_proc = config[:preprocessor_proc]
85
85
  assert_instance_of Proc, preprocessor_proc
86
86
  assert_equal value.upcase, preprocessor_proc.call(value)
87
87
  end
88
88
 
89
89
  should "add validations using `has_slug`" do
90
90
  subject.has_slug :source => @source_attribute
91
+ exp_attr_name = DEFAULT_ATTRIBUTE
91
92
 
92
93
  validation = subject.validations.find{ |v| v.type == :presence }
93
94
  assert_not_nil validation
94
- assert_equal [subject.ardb_has_slug_config[:attribute]], validation.columns
95
+ assert_equal [exp_attr_name], validation.columns
95
96
  assert_equal :update, validation.options[:on]
96
97
 
97
98
  validation = subject.validations.find{ |v| v.type == :uniqueness }
98
99
  assert_not_nil validation
99
- assert_equal [subject.ardb_has_slug_config[:attribute]], validation.columns
100
+ assert_equal [exp_attr_name], validation.columns
100
101
  assert_equal true, validation.options[:case_sensitive]
101
102
  assert_nil validation.options[:scope]
102
103
  end
@@ -118,11 +119,11 @@ module Ardb::HasSlug
118
119
 
119
120
  callback = subject.callbacks.find{ |v| v.type == :after_create }
120
121
  assert_not_nil callback
121
- assert_equal [:ardb_has_slug_generate_slug], callback.args
122
+ assert_equal [:ardb_has_slug_generate_slugs], callback.args
122
123
 
123
124
  callback = subject.callbacks.find{ |v| v.type == :after_update }
124
125
  assert_not_nil callback
125
- assert_equal [:ardb_has_slug_generate_slug], callback.args
126
+ assert_equal [:ardb_has_slug_generate_slugs], callback.args
126
127
  end
127
128
 
128
129
  should "raise an argument error if `has_slug` isn't passed a source" do
@@ -137,6 +138,8 @@ module Ardb::HasSlug
137
138
  @preprocessor = [:downcase, :upcase, :capitalize].choice
138
139
  @separator = NON_WORD_CHARS.choice
139
140
  @allow_underscores = Factory.boolean
141
+
142
+ @record_class.has_slug(:source => @source_attribute)
140
143
  @record_class.has_slug({
141
144
  :attribute => @slug_attribute,
142
145
  :source => @source_attribute,
@@ -152,112 +155,121 @@ module Ardb::HasSlug
152
155
  # generating a slug
153
156
  @source_value = "#{Factory.string.downcase}_#{Factory.string.upcase}"
154
157
  @record.send("#{@source_attribute}=", @source_value)
158
+
159
+ @exp_default_slug = Slug.new(@source_value, {
160
+ :preprocessor => DEFAULT_PREPROCESSOR.to_proc,
161
+ :separator => DEFAULT_SEPARATOR
162
+ })
163
+ @exp_custom_slug = Slug.new(@source_value, {
164
+ :preprocessor => @preprocessor.to_proc,
165
+ :separator => @separator,
166
+ :allow_underscores => @allow_underscores
167
+ })
155
168
  end
156
169
  subject{ @record }
157
170
 
158
171
  should "reset its slug using `reset_slug`" do
172
+ # reset the default attribute
173
+ subject.send("#{DEFAULT_ATTRIBUTE}=", Factory.slug)
174
+ assert_not_nil subject.send(DEFAULT_ATTRIBUTE)
175
+ subject.instance_eval{ reset_slug }
176
+ assert_nil subject.send(DEFAULT_ATTRIBUTE)
177
+
178
+ # reset a custom attribute
159
179
  subject.send("#{@slug_attribute}=", Factory.slug)
160
180
  assert_not_nil subject.send(@slug_attribute)
161
- subject.instance_eval{ reset_slug }
181
+ sa = @slug_attribute
182
+ subject.instance_eval{ reset_slug(sa) }
162
183
  assert_nil subject.send(@slug_attribute)
163
184
  end
164
185
 
165
- should "default its slug attribute using `ardb_has_slug_generate_slug`" do
166
- subject.instance_eval{ ardb_has_slug_generate_slug }
186
+ should "default its slug attribute" do
187
+ subject.instance_eval{ ardb_has_slug_generate_slugs }
188
+ assert_equal 2, subject.slug_db_column_updates.size
167
189
 
168
- exp = Slug.new(@source_value, {
169
- :preprocessor => @preprocessor.to_proc,
170
- :separator => @separator,
171
- :allow_underscores => @allow_underscores
172
- })
173
- assert_equal exp, subject.send(@slug_attribute)
174
- assert_equal @slug_attribute, subject.slug_db_column_name
175
- assert_equal exp, subject.slug_db_column_value
190
+ exp = @exp_default_slug
191
+ assert_equal exp, subject.send(DEFAULT_ATTRIBUTE)
192
+ assert_includes [DEFAULT_ATTRIBUTE, exp], subject.slug_db_column_updates
193
+
194
+ exp = @exp_custom_slug
195
+ assert_equal exp, subject.send(@slug_attribute)
196
+ assert_includes [@slug_attribute, exp], subject.slug_db_column_updates
197
+ end
198
+
199
+ should "not set its slug if it hasn't changed" do
200
+ @record.send("#{DEFAULT_ATTRIBUTE}=", @exp_default_slug)
201
+ @record.send("#{@slug_attribute}=", @exp_custom_slug)
202
+
203
+ subject.instance_eval{ ardb_has_slug_generate_slugs }
204
+ assert_nil subject.slug_db_column_updates
176
205
  end
177
206
 
178
- should "slug its slug attribute value if set using `ardb_has_slug_generate_slug`" do
207
+ should "slug its slug attribute value if set" do
179
208
  @record.send("#{@slug_attribute}=", @source_value)
180
209
  # change the source attr to some random value, to avoid a false positive
181
210
  @record.send("#{@source_attribute}=", Factory.string)
182
- subject.instance_eval{ ardb_has_slug_generate_slug }
211
+ subject.instance_eval{ ardb_has_slug_generate_slugs }
183
212
 
184
- exp = Slug.new(@source_value, {
185
- :preprocessor => @preprocessor.to_proc,
186
- :separator => @separator,
187
- :allow_underscores => @allow_underscores
188
- })
189
- assert_equal exp, subject.send(@slug_attribute)
190
- assert_equal @slug_attribute, subject.slug_db_column_name
191
- assert_equal exp, subject.slug_db_column_value
213
+ exp = @exp_custom_slug
214
+ assert_equal exp, subject.send(@slug_attribute)
215
+ assert_includes [@slug_attribute, exp], subject.slug_db_column_updates
192
216
  end
193
217
 
194
- should "slug its source even if its already a valid slug using `ardb_has_slug_generate_slug`" do
218
+ should "slug its source even if its already a valid slug" do
195
219
  slug_source = Factory.slug
196
220
  @record.send("#{@source_attribute}=", slug_source)
197
221
  # ensure the preprocessor doesn't change our source
198
222
  Assert.stub(slug_source, @preprocessor){ slug_source }
199
223
 
200
- subject.instance_eval{ ardb_has_slug_generate_slug }
224
+ subject.instance_eval{ ardb_has_slug_generate_slugs }
201
225
 
202
226
  exp = Slug.new(slug_source, {
203
227
  :preprocessor => @preprocessor.to_proc,
204
228
  :separator => @separator,
205
229
  :allow_underscores => @allow_underscores
206
230
  })
207
- assert_equal exp, subject.send(@slug_attribute)
208
- assert_equal @slug_attribute, subject.slug_db_column_name
209
- assert_equal exp, subject.slug_db_column_value
210
- end
211
-
212
- should "not set its slug if it hasn't changed using `ardb_has_slug_generate_slug`" do
213
- generated_slug = Slug.new(@source_value, {
214
- :preprocessor => @preprocessor.to_proc,
215
- :separator => @separator,
216
- :allow_underscores => @allow_underscores
217
- })
218
- @record.send("#{@slug_attribute}=", generated_slug)
219
- subject.instance_eval{ ardb_has_slug_generate_slug }
220
-
221
- assert_nil subject.slug_db_column_name
222
- assert_nil subject.slug_db_column_value
231
+ assert_equal exp, subject.send(@slug_attribute)
232
+ assert_includes [@slug_attribute, exp], subject.slug_db_column_updates
223
233
  end
224
234
 
225
235
  end
226
236
 
227
237
  class SlugTests < UnitTests
228
238
  desc "Slug"
239
+ setup do
240
+ @no_op_pp = proc{ |slug| slug }
241
+ @args = {
242
+ :preprocessor => @no_op_pp,
243
+ :separator => '-'
244
+ }
245
+ end
229
246
  subject{ Slug }
230
247
 
231
248
  should have_imeths :new
232
249
 
233
- should "know its default preprocessor" do
234
- assert_instance_of Proc, Slug::DEFAULT_PREPROCESSOR
235
- string = Factory.string
236
- assert_same string, Slug::DEFAULT_PREPROCESSOR.call(string)
237
- end
238
-
239
250
  should "not change strings that are made up of valid chars" do
240
251
  string = Factory.string
241
- assert_equal string, subject.new(string)
252
+ assert_equal string, subject.new(string, @args)
253
+
242
254
  string = "#{Factory.string}-#{Factory.string.upcase}"
243
- assert_equal string, subject.new(string)
255
+ assert_equal string, subject.new(string, @args)
244
256
  end
245
257
 
246
258
  should "turn invalid chars into a separator" do
247
259
  string = Factory.integer(3).times.map do
248
260
  "#{Factory.string(3)}#{NON_WORD_CHARS.choice}#{Factory.string(3)}"
249
261
  end.join(NON_WORD_CHARS.choice)
250
- assert_equal string.gsub(/[^\w]+/, '-'), subject.new(string)
262
+ assert_equal string.gsub(/[^\w]+/, '-'), subject.new(string, @args)
251
263
  end
252
264
 
253
265
  should "allow passing a custom preprocessor proc" do
254
266
  string = "#{Factory.string}-#{Factory.string.upcase}"
255
- slug = subject.new(string, :preprocessor => :downcase.to_proc)
256
- assert_equal string.downcase, slug
267
+ exp = string.downcase
268
+ assert_equal exp, subject.new(string, @args.merge(:preprocessor => :downcase.to_proc))
257
269
 
258
270
  preprocessor = proc{ |s| s.gsub(/[A-Z]/, 'a') }
259
- slug = subject.new(string, :preprocessor => preprocessor)
260
- assert_equal preprocessor.call(string), slug
271
+ exp = preprocessor.call(string)
272
+ assert_equal exp, subject.new(string, @args.merge(:preprocessor => preprocessor))
261
273
  end
262
274
 
263
275
  should "allow passing a custom separator" do
@@ -265,47 +277,48 @@ module Ardb::HasSlug
265
277
 
266
278
  invalid_char = (NON_WORD_CHARS - [separator]).choice
267
279
  string = "#{Factory.string}#{invalid_char}#{Factory.string}"
268
- slug = subject.new(string, :separator => separator)
269
- assert_equal string.gsub(/[^\w]+/, separator), slug
280
+ exp = string.gsub(/[^\w]+/, separator)
281
+ assert_equal exp, subject.new(string, @args.merge(:separator => separator))
270
282
 
271
283
  # it won't change the separator in the strings
272
284
  string = "#{Factory.string}#{separator}#{Factory.string}"
273
- assert_equal string, subject.new(string, :separator => separator)
285
+ exp = string
286
+ assert_equal string, subject.new(string, @args.merge(:separator => separator))
274
287
 
275
288
  # it will change the default separator now
276
289
  string = "#{Factory.string}-#{Factory.string}"
277
- slug = subject.new(string, :separator => separator)
278
- assert_equal string.gsub('-', separator), slug
290
+ exp = string.gsub('-', separator)
291
+ assert_equal exp, subject.new(string, @args.merge(:separator => separator))
279
292
  end
280
293
 
281
294
  should "change underscores into its separator unless allowed" do
282
295
  string = "#{Factory.string}_#{Factory.string}"
283
- assert_equal string.gsub('_', '-'), subject.new(string)
296
+ assert_equal string.gsub('_', '-'), subject.new(string, @args)
284
297
 
285
- slug = subject.new(string, :allow_underscores => false)
286
- assert_equal string.gsub('_', '-'), slug
298
+ exp = string.gsub('_', '-')
299
+ assert_equal exp, subject.new(string, @args.merge(:allow_underscores => false))
287
300
 
288
- assert_equal string, subject.new(string, :allow_underscores => true)
301
+ assert_equal string, subject.new(string, @args.merge(:allow_underscores => true))
289
302
  end
290
303
 
291
304
  should "not allow multiple separators in a row" do
292
305
  string = "#{Factory.string}--#{Factory.string}"
293
- assert_equal string.gsub(/-{2,}/, '-'), subject.new(string)
306
+ assert_equal string.gsub(/-{2,}/, '-'), subject.new(string, @args)
294
307
 
295
308
  # remove separators that were added from changing invalid chars
296
309
  invalid_chars = (Factory.integer(3) + 1).times.map{ NON_WORD_CHARS.choice }.join
297
310
  string = "#{Factory.string}#{invalid_chars}#{Factory.string}"
298
- assert_equal string.gsub(/[^\w]+/, '-'), subject.new(string)
311
+ assert_equal string.gsub(/[^\w]+/, '-'), subject.new(string, @args)
299
312
  end
300
313
 
301
314
  should "remove leading and trailing separators" do
302
315
  string = "-#{Factory.string}-#{Factory.string}-"
303
- assert_equal string[1..-2], subject.new(string)
316
+ assert_equal string[1..-2], subject.new(string, @args)
304
317
 
305
318
  # remove separators that were added from changing invalid chars
306
319
  invalid_char = NON_WORD_CHARS.choice
307
320
  string = "#{invalid_char}#{Factory.string}-#{Factory.string}#{invalid_char}"
308
- assert_equal string[1..-2], subject.new(string)
321
+ assert_equal string[1..-2], subject.new(string, @args)
309
322
  end
310
323
 
311
324
  end
metadata CHANGED
@@ -1,13 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ardb
3
3
  version: !ruby/object:Gem::Version
4
- hash: 115
5
- prerelease:
6
- segments:
7
- - 0
8
- - 27
9
- - 0
10
- version: 0.27.0
4
+ version: 0.27.1
11
5
  platform: ruby
12
6
  authors:
13
7
  - Kelly Redding
@@ -16,98 +10,67 @@ autorequire:
16
10
  bindir: bin
17
11
  cert_chain: []
18
12
 
19
- date: 2015-12-18 00:00:00 Z
13
+ date: 2016-03-09 00:00:00 Z
20
14
  dependencies:
21
15
  - !ruby/object:Gem::Dependency
16
+ name: assert
17
+ prerelease: false
22
18
  requirement: &id001 !ruby/object:Gem::Requirement
23
- none: false
24
19
  requirements:
25
20
  - - ~>
26
21
  - !ruby/object:Gem::Version
27
- hash: 29
28
- segments:
29
- - 2
30
- - 15
31
22
  version: "2.15"
32
23
  type: :development
33
- name: assert
34
24
  version_requirements: *id001
35
- prerelease: false
36
25
  - !ruby/object:Gem::Dependency
26
+ name: activerecord
27
+ prerelease: false
37
28
  requirement: &id002 !ruby/object:Gem::Requirement
38
- none: false
39
29
  requirements:
40
30
  - - ~>
41
- - !ruby/object:Gem::Version
42
- hash: 3
43
- segments:
44
- - 3
45
- - 2
31
+ - &id003 !ruby/object:Gem::Version
46
32
  version: "3.2"
47
33
  type: :runtime
48
- name: activerecord
49
34
  version_requirements: *id002
50
- prerelease: false
51
35
  - !ruby/object:Gem::Dependency
52
- requirement: &id003 !ruby/object:Gem::Requirement
53
- none: false
54
- requirements:
55
- - - ~>
56
- - !ruby/object:Gem::Version
57
- hash: 3
58
- segments:
59
- - 3
60
- - 2
61
- version: "3.2"
62
- type: :runtime
63
36
  name: activesupport
64
- version_requirements: *id003
65
37
  prerelease: false
66
- - !ruby/object:Gem::Dependency
67
38
  requirement: &id004 !ruby/object:Gem::Requirement
68
- none: false
69
39
  requirements:
70
40
  - - ~>
71
- - !ruby/object:Gem::Version
72
- hash: 9
73
- segments:
74
- - 0
75
- - 1
76
- version: "0.1"
41
+ - *id003
77
42
  type: :runtime
78
- name: much-plugin
79
43
  version_requirements: *id004
80
- prerelease: false
81
44
  - !ruby/object:Gem::Dependency
45
+ name: much-plugin
46
+ prerelease: false
82
47
  requirement: &id005 !ruby/object:Gem::Requirement
83
- none: false
84
48
  requirements:
85
49
  - - ~>
86
50
  - !ruby/object:Gem::Version
87
- hash: 13
88
- segments:
89
- - 1
90
- - 1
91
- version: "1.1"
51
+ version: "0.1"
92
52
  type: :runtime
93
- name: ns-options
94
53
  version_requirements: *id005
95
- prerelease: false
96
54
  - !ruby/object:Gem::Dependency
55
+ name: ns-options
56
+ prerelease: false
97
57
  requirement: &id006 !ruby/object:Gem::Requirement
98
- none: false
99
58
  requirements:
100
59
  - - ~>
101
60
  - !ruby/object:Gem::Version
102
- hash: 7
103
- segments:
104
- - 3
105
- - 0
106
- version: "3.0"
61
+ version: "1.1"
107
62
  type: :runtime
108
- name: scmd
109
63
  version_requirements: *id006
64
+ - !ruby/object:Gem::Dependency
65
+ name: scmd
110
66
  prerelease: false
67
+ requirement: &id007 !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ~>
70
+ - !ruby/object:Gem::Version
71
+ version: "3.0"
72
+ type: :runtime
73
+ version_requirements: *id007
111
74
  description: Activerecord database tools.
112
75
  email:
113
76
  - kelly@kellyredding.com
@@ -140,11 +103,13 @@ files:
140
103
  - lib/ardb/migration_helpers.rb
141
104
  - lib/ardb/record_spy.rb
142
105
  - lib/ardb/relation_spy.rb
106
+ - lib/ardb/require_autoloaded_active_record_files.rb
143
107
  - lib/ardb/root_path.rb
144
108
  - lib/ardb/test_helpers.rb
145
109
  - lib/ardb/use_db_default.rb
146
110
  - lib/ardb/version.rb
147
111
  - log/.gitkeep
112
+ - script/determine_autoloaded_active_record_files.rb
148
113
  - test/helper.rb
149
114
  - test/support/factory.rb
150
115
  - test/unit/adapter/base_tests.rb
@@ -179,35 +144,28 @@ files:
179
144
  homepage: http://github.com/redding/ardb
180
145
  licenses:
181
146
  - MIT
147
+ metadata: {}
148
+
182
149
  post_install_message:
183
150
  rdoc_options: []
184
151
 
185
152
  require_paths:
186
153
  - lib
187
154
  required_ruby_version: !ruby/object:Gem::Requirement
188
- none: false
189
155
  requirements:
190
- - - ">="
156
+ - &id008
157
+ - ">="
191
158
  - !ruby/object:Gem::Version
192
- hash: 3
193
- segments:
194
- - 0
195
159
  version: "0"
196
160
  required_rubygems_version: !ruby/object:Gem::Requirement
197
- none: false
198
161
  requirements:
199
- - - ">="
200
- - !ruby/object:Gem::Version
201
- hash: 3
202
- segments:
203
- - 0
204
- version: "0"
162
+ - *id008
205
163
  requirements: []
206
164
 
207
165
  rubyforge_project:
208
- rubygems_version: 1.8.25
166
+ rubygems_version: 2.5.1
209
167
  signing_key:
210
- specification_version: 3
168
+ specification_version: 4
211
169
  summary: Activerecord database tools.
212
170
  test_files:
213
171
  - test/helper.rb