active_model-better_errors 1.6.3 → 1.6.5

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.
Files changed (71) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +37 -0
  3. data/.rspec +4 -1
  4. data/.ruby-gemset +1 -0
  5. data/.travis.yml +5 -1
  6. data/Gemfile +9 -13
  7. data/Gemfile.devtools +66 -0
  8. data/Guardfile +32 -0
  9. data/LICENSE.txt +2 -0
  10. data/README.md +12 -10
  11. data/Rakefile +20 -49
  12. data/active_model-better_errors.gemspec +27 -107
  13. data/config/devtools.yml +4 -0
  14. data/config/flay.yml +3 -0
  15. data/config/flog.yml +2 -0
  16. data/config/mutant.yml +3 -0
  17. data/config/reek.yml +103 -0
  18. data/config/rubocop.yml +62 -0
  19. data/config/yardstick.yml +2 -0
  20. data/lib/active_model/better_errors.rb +64 -4
  21. data/lib/active_model/better_errors/array_reporter.rb +14 -0
  22. data/lib/active_model/{error_collecting → better_errors}/emulation.rb +15 -8
  23. data/lib/active_model/{error_collecting → better_errors}/error_collection.rb +14 -6
  24. data/lib/active_model/{error_collecting → better_errors}/error_message.rb +16 -5
  25. data/lib/active_model/{error_collecting → better_errors}/error_message_set.rb +7 -2
  26. data/lib/active_model/{error_collecting → better_errors}/errors.rb +10 -3
  27. data/lib/active_model/better_errors/formatter.rb +26 -0
  28. data/lib/active_model/better_errors/hash_reporter.rb +14 -0
  29. data/lib/active_model/{error_collecting → better_errors}/human_array_reporter.rb +6 -1
  30. data/lib/active_model/{error_collecting → better_errors}/human_hash_reporter.rb +8 -3
  31. data/lib/active_model/better_errors/human_message_formatter.rb +66 -0
  32. data/lib/active_model/{error_collecting → better_errors}/human_message_reporter.rb +19 -12
  33. data/lib/active_model/{error_collecting → better_errors}/machine_array_reporter.rb +10 -2
  34. data/lib/active_model/{error_collecting → better_errors}/machine_hash_reporter.rb +10 -3
  35. data/lib/active_model/{error_collecting → better_errors}/message_reporter.rb +10 -5
  36. data/lib/active_model/{error_collecting → better_errors}/reporter.rb +7 -2
  37. data/lib/active_model/better_errors/version.rb +10 -0
  38. data/spec/spec_helper.rb +19 -10
  39. data/spec/support/i18n_deprecation_silence.rb +4 -0
  40. data/spec/support/models.rb +11 -4
  41. data/spec/support/string_ext.rb +14 -0
  42. data/spec/{lib/active_model/error_collecting → unit/lib/active_model/better_errors}/emulation_spec.rb +8 -6
  43. data/spec/{lib/active_model/error_collecting → unit/lib/active_model/better_errors}/error_collection_spec.rb +66 -62
  44. data/spec/{lib/active_model/error_collecting → unit/lib/active_model/better_errors}/error_message_set_spec.rb +27 -25
  45. data/spec/unit/lib/active_model/better_errors/error_message_spec.rb +315 -0
  46. data/spec/unit/lib/active_model/better_errors/errors_spec.rb +98 -0
  47. data/spec/unit/lib/active_model/better_errors/human_array_reporter_spec.rb +39 -0
  48. data/spec/unit/lib/active_model/better_errors/human_hash_reporter_spec.rb +37 -0
  49. data/spec/{lib/active_model/error_collecting → unit/lib/active_model/better_errors}/human_message_formatter_spec.rb +13 -7
  50. data/spec/unit/lib/active_model/better_errors/human_message_reporter_spec.rb +65 -0
  51. data/spec/unit/lib/active_model/better_errors/machine_array_reporter_spec.rb +45 -0
  52. data/spec/unit/lib/active_model/better_errors/machine_hash_reporter_spec.rb +45 -0
  53. data/spec/unit/lib/active_model/better_errors_spec.rb +37 -0
  54. metadata +98 -143
  55. data/.document +0 -5
  56. data/VERSION +0 -1
  57. data/lib/active_model/error_collecting.rb +0 -49
  58. data/lib/active_model/error_collecting/array_reporter.rb +0 -9
  59. data/lib/active_model/error_collecting/core_ext.rb +0 -6
  60. data/lib/active_model/error_collecting/hash_reporter.rb +0 -9
  61. data/lib/active_model/error_collecting/human_message_formatter.rb +0 -58
  62. data/spec/lib/active_model/better_errors_spec.rb +0 -7
  63. data/spec/lib/active_model/error_collecting/error_message_spec.rb +0 -293
  64. data/spec/lib/active_model/error_collecting/errors_spec.rb +0 -95
  65. data/spec/lib/active_model/error_collecting/human_array_reporter_spec.rb +0 -33
  66. data/spec/lib/active_model/error_collecting/human_hash_reporter_spec.rb +0 -32
  67. data/spec/lib/active_model/error_collecting/human_message_reporter_spec.rb +0 -61
  68. data/spec/lib/active_model/error_collecting/machine_array_reporter_spec.rb +0 -40
  69. data/spec/lib/active_model/error_collecting/machine_hash_reporter_spec.rb +0 -40
  70. data/spec/lib/active_model/error_collecting_spec.rb +0 -22
  71. data/test/integration.rb +0 -10
@@ -0,0 +1,4 @@
1
+ ---
2
+ unit_test_timeout: 0.1
3
+ fail_on_branch:
4
+ - "master"
@@ -0,0 +1,3 @@
1
+ ---
2
+ threshold: 8
3
+ total_score: 100
@@ -0,0 +1,2 @@
1
+ ---
2
+ threshold: 0
@@ -0,0 +1,3 @@
1
+ ---
2
+ name: active_model/better_errors
3
+ namespace: ActiveModel::BetterErrors
@@ -0,0 +1,103 @@
1
+ ---
2
+ Attribute:
3
+ enabled: true
4
+ exclude: []
5
+ BooleanParameter:
6
+ enabled: true
7
+ exclude: []
8
+ ClassVariable:
9
+ enabled: true
10
+ exclude: []
11
+ ControlParameter:
12
+ enabled: true
13
+ exclude: []
14
+ DataClump:
15
+ enabled: true
16
+ exclude: []
17
+ max_copies: 2
18
+ min_clump_size: 2
19
+ DuplicateMethodCall:
20
+ enabled: true
21
+ exclude: []
22
+ max_calls: 1
23
+ allow_calls: []
24
+ FeatureEnvy:
25
+ enabled: true
26
+ exclude: []
27
+ IrresponsibleModule:
28
+ enabled: true
29
+ exclude: []
30
+ LongParameterList:
31
+ enabled: true
32
+ exclude: []
33
+ max_params: 2
34
+ overrides:
35
+ initialize:
36
+ max_params: 3
37
+ LongYieldList:
38
+ enabled: true
39
+ exclude: []
40
+ max_params: 2
41
+ NestedIterators:
42
+ enabled: true
43
+ exclude: []
44
+ max_allowed_nesting: 1
45
+ ignore_iterators: []
46
+ NilCheck:
47
+ enabled: true
48
+ exclude: []
49
+ RepeatedConditional:
50
+ enabled: true
51
+ exclude: []
52
+ max_ifs: 1
53
+ TooManyInstanceVariables:
54
+ enabled: true
55
+ exclude: []
56
+ max_instance_variables: 3
57
+ TooManyMethods:
58
+ enabled: true
59
+ exclude: []
60
+ max_methods: 10
61
+ TooManyStatements:
62
+ enabled: true
63
+ exclude:
64
+ - each
65
+ max_statements: 2
66
+ UncommunicativeMethodName:
67
+ enabled: true
68
+ exclude: []
69
+ reject:
70
+ - !ruby/regexp /^[a-z]$/
71
+ - !ruby/regexp /[0-9]$/
72
+ - !ruby/regexp /[A-Z]/
73
+ accept: []
74
+ UncommunicativeModuleName:
75
+ enabled: true
76
+ exclude: []
77
+ reject:
78
+ - !ruby/regexp /^.$/
79
+ - !ruby/regexp /[0-9]$/
80
+ accept: []
81
+ UncommunicativeParameterName:
82
+ enabled: true
83
+ exclude: []
84
+ reject:
85
+ - !ruby/regexp /^.$/
86
+ - !ruby/regexp /[0-9]$/
87
+ - !ruby/regexp /[A-Z]/
88
+ accept: []
89
+ UncommunicativeVariableName:
90
+ enabled: true
91
+ exclude: []
92
+ reject:
93
+ - !ruby/regexp /^.$/
94
+ - !ruby/regexp /[0-9]$/
95
+ - !ruby/regexp /[A-Z]/
96
+ accept: []
97
+ UnusedParameters:
98
+ enabled: true
99
+ exclude: []
100
+ UtilityFunction:
101
+ enabled: true
102
+ exclude: []
103
+ max_helper_calls: 0
@@ -0,0 +1,62 @@
1
+ AllCops:
2
+ Includes:
3
+ - '**/*.rake'
4
+ - 'Gemfile'
5
+ - 'Gemfile.devtools'
6
+ Excludes:
7
+ - '**/vendor/**'
8
+ - '**/benchmarks/**'
9
+
10
+ # Avoid parameter lists longer than five parameters.
11
+ ParameterLists:
12
+ Max: 5
13
+ CountKeywordArgs: true
14
+
15
+ # Avoid more than `Max` levels of nesting.
16
+ BlockNesting:
17
+ Max: 3
18
+
19
+ # Align with the style guide.
20
+ CollectionMethods:
21
+ PreferredMethods:
22
+ collect: 'map'
23
+ inject: 'reduce'
24
+ find: 'detect'
25
+ find_all: 'select'
26
+
27
+ # Do not force public/protected/private keyword to be indented at the same
28
+ # level as the def keyword. My personal preference is to outdent these keywords
29
+ # because I think when scanning code it makes it easier to identify the
30
+ # sections of code and visually separate them. When the keyword is at the same
31
+ # level I think it sort of blends in with the def keywords and makes it harder
32
+ # to scan the code and see where the sections are.
33
+ AccessModifierIndentation:
34
+ Enabled: false
35
+
36
+ # Limit line length
37
+ LineLength:
38
+ Max: 79
39
+
40
+ # Disable documentation checking until a class needs to be documented once
41
+ Documentation:
42
+ Enabled: false
43
+
44
+ # Do not favor modifier if/unless usage when you have a single-line body
45
+ IfUnlessModifier:
46
+ Enabled: false
47
+
48
+ # Allow case equality operator (in limited use within the specs)
49
+ CaseEquality:
50
+ Enabled: false
51
+
52
+ # Constants do not always have to use SCREAMING_SNAKE_CASE
53
+ ConstantName:
54
+ Enabled: false
55
+
56
+ # Not all trivial readers/writers can be defined with attr_* methods
57
+ TrivialAccessors:
58
+ Enabled: false
59
+
60
+ # Allow empty lines around body
61
+ EmptyLinesAroundBody:
62
+ Enabled: false
@@ -0,0 +1,2 @@
1
+ ---
2
+ threshold: 100
@@ -1,15 +1,75 @@
1
+ # encoding: utf-8
2
+
1
3
  require 'forwardable'
4
+ require 'active_support/all'
5
+ require 'active_model'
6
+
7
+ require 'active_model/better_errors/error_message'
8
+ require 'active_model/better_errors/error_message_set'
9
+ require 'active_model/better_errors/error_collection'
10
+
11
+ require 'active_model/better_errors/formatter'
12
+ require 'active_model/better_errors/human_message_formatter'
13
+
14
+ require 'active_model/better_errors/reporter'
15
+ require 'active_model/better_errors/message_reporter'
16
+ require 'active_model/better_errors/hash_reporter'
17
+ require 'active_model/better_errors/array_reporter'
2
18
 
3
- require 'active_support/core_ext/string/inflections'
19
+ require 'active_model/better_errors/human_message_reporter'
20
+ require 'active_model/better_errors/human_hash_reporter'
21
+ require 'active_model/better_errors/human_array_reporter'
4
22
 
5
- require 'active_model/error_collecting'
23
+ require 'active_model/better_errors/machine_hash_reporter'
24
+ require 'active_model/better_errors/machine_array_reporter'
6
25
 
7
- require 'active_model/validations'
26
+ require 'active_model/better_errors/emulation'
27
+ require 'active_model/better_errors/errors'
8
28
 
9
29
  module ActiveModel
30
+ #
31
+ # BetterErrors
32
+ #
33
+ module BetterErrors
34
+ class << self
35
+ attr_accessor :formatter
36
+
37
+ def set_reporter(name, reporter)
38
+ name = name.to_s
39
+ @reporter_maps ||= {}
40
+ return @reporter_maps.delete(name) unless reporter
41
+ @reporter_maps[name] = get_reporter_class(name, reporter)
42
+ end
43
+
44
+ def reporters
45
+ @reporter_maps ||= {}
46
+ @reporter_maps.clone
47
+ end
48
+
49
+ def get_reporter_class(name, reporter)
50
+ return reporter if reporter.is_a? Class
51
+ class_name = "#{reporter}_#{name}_reporter"
52
+ "active_model/better_errors/#{class_name}".classify.constantize
53
+ end
54
+
55
+ def format_message(base, message)
56
+ formatter.new(base, message).format_message
57
+ end
58
+ end
59
+
60
+ set_reporter :message, :human
61
+ set_reporter :array, :human
62
+ set_reporter :hash, :human
63
+
64
+ self.formatter = HumanMessageFormatter
65
+ end
66
+
67
+ #
68
+ # ActiveModel::Validations.errors override
69
+ #
10
70
  module Validations
11
71
  def errors
12
- @errors ||= ErrorCollecting::Errors.new(self)
72
+ @errors ||= BetterErrors::Errors.new(self)
13
73
  end
14
74
  end
15
75
  end
@@ -0,0 +1,14 @@
1
+ # encoding: utf-8
2
+
3
+ module ActiveModel
4
+ module BetterErrors
5
+ #
6
+ # ArrayReporter
7
+ #
8
+ class ArrayReporter < Reporter
9
+ def to_a
10
+ fail 'abstract method'
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,10 +1,16 @@
1
+ # encoding: utf-8
2
+
1
3
  #
2
4
  # Allows included class to emulate ActiveModel::Errors class
3
5
  # by defining a set of methods to delegate to facilities
4
6
  # in this gem.
5
7
  #
6
8
  module ActiveModel
7
- module ErrorCollecting
9
+ module BetterErrors
10
+ #
11
+ # Emulation
12
+ # The ActiveModel Emulation Layer
13
+ #
8
14
  module Emulation
9
15
  MODEL_METHODS = [
10
16
  :clear, :include?, :get, :set, :delete, :[], :[]=,
@@ -44,22 +50,23 @@ module ActiveModel
44
50
  end
45
51
  end
46
52
 
47
- def add(attribute, message=nil, options = {})
53
+ def add(attribute, message = nil, options = {})
48
54
  if options[:strict]
49
55
  error = ErrorMessage.build(attribute, message, options)
50
- message = HumanMessageFormatter.new(@base, error).format_message
51
- raise ActiveModel::StrictValidationFailed, full_message(attribute, message)
56
+ message = ::ActiveModel::BetterErrors.format_message(@base, error)
57
+ full_message = full_message(attribute, message)
58
+ fail ActiveModel::StrictValidationFailed, full_message
52
59
  end
53
60
  error_collection.add attribute, message, options
54
61
  end
55
62
 
56
- def to_xml(options={})
57
- to_a.to_xml options.reverse_merge(:root => "errors", :skip_types => true)
63
+ def to_xml(options = {})
64
+ to_a.to_xml options.reverse_merge(root: 'errors', skip_types: true)
58
65
  end
59
66
 
60
- def as_json(options=nil)
67
+ def as_json(options = nil)
61
68
  to_hash
62
69
  end
63
70
  end
64
71
  end
65
- end
72
+ end
@@ -1,5 +1,10 @@
1
+ # encoding: utf-8
2
+
1
3
  module ActiveModel
2
- module ErrorCollecting
4
+ module BetterErrors
5
+ #
6
+ # ErrorCollection
7
+ #
3
8
  class ErrorCollection
4
9
  include Enumerable
5
10
 
@@ -14,7 +19,7 @@ module ActiveModel
14
19
  end
15
20
 
16
21
  def include?(attribute)
17
- ( v = @collection[attribute] ) && v.any?
22
+ ( v = @collection[attribute]) && v.any?
18
23
  end
19
24
 
20
25
  def get(attribute)
@@ -40,12 +45,14 @@ module ActiveModel
40
45
 
41
46
  def each
42
47
  @collection.each_key do |attribute|
43
- self[attribute].each { |error_message| yield attribute, error_message }
48
+ self[attribute].each do |error_message|
49
+ yield attribute, error_message
50
+ end
44
51
  end
45
52
  end
46
53
 
47
54
  def size
48
- values.inject(0){ |sum, set| sum += set.size }
55
+ values.reduce(0) { |a, e| a + e.size }
49
56
  end
50
57
  alias_method :count, :size
51
58
 
@@ -75,11 +82,12 @@ module ActiveModel
75
82
  end
76
83
 
77
84
  def add(attribute, message, options = {})
78
- self[attribute] << [ message, options ]
85
+ self[attribute] << [message, options]
79
86
  end
80
87
 
81
88
  def added?(attribute, message = nil, options = {})
82
- self[attribute].include? ErrorMessage.build(base, attribute, message, options)
89
+ message = ErrorMessage.build(base, attribute, message, options)
90
+ self[attribute].include? message
83
91
  end
84
92
  end
85
93
  end
@@ -1,8 +1,15 @@
1
+ # encoding: utf-8
2
+
1
3
  module ActiveModel
2
- module ErrorCollecting
4
+ module BetterErrors
5
+ #
6
+ # ErrorMessage
7
+ #
3
8
  class ErrorMessage
4
9
  include Comparable
5
- CALLBACKS_OPTIONS = [:if, :unless, :on, :allow_nil, :allow_blank, :strict]
10
+ CALLBACKS_OPTIONS = [
11
+ :if, :unless, :on, :allow_nil, :allow_blank, :strict
12
+ ]
6
13
 
7
14
  # return the message either as nil, symbol, or string
8
15
  def self.normalize(message)
@@ -35,7 +42,7 @@ module ActiveModel
35
42
  [symbol, string]
36
43
  end
37
44
 
38
- def self.build(base, attribute, message, options=nil)
45
+ def self.build(base, attribute, message, options = nil)
39
46
  options = options ? options : {}
40
47
  options = options.except(*CALLBACKS_OPTIONS)
41
48
 
@@ -54,7 +61,7 @@ module ActiveModel
54
61
  @options = options
55
62
  end
56
63
 
57
- def <=> (other)
64
+ def <=>(other)
58
65
  to_hash <=> other.to_hash
59
66
  end
60
67
 
@@ -67,12 +74,16 @@ module ActiveModel
67
74
  }
68
75
  end
69
76
 
77
+ def as_json(*json_args)
78
+ to_hash
79
+ end
80
+
70
81
  def hash
71
82
  to_hash.hash
72
83
  end
73
84
 
74
85
  def to_s
75
- HumanMessageFormatter.new(base, self).format_message
86
+ ::ActiveModel::BetterErrors.format_message(base, self)
76
87
  end
77
88
 
78
89
  def inspect
@@ -1,7 +1,12 @@
1
+ # encoding: utf-8
2
+
1
3
  module ActiveModel
2
- module ErrorCollecting
4
+ module BetterErrors
5
+ #
6
+ # ErrorMessageSet
7
+ #
3
8
  class ErrorMessageSet < Array
4
- def initialize(base, attribute, errors=[])
9
+ def initialize(base, attribute, errors = [])
5
10
  @base = base
6
11
  @attribute = attribute
7
12
  errors.each do |error|