remarkable 3.1.8 → 3.1.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,13 +1,13 @@
1
- module Remarkable
2
- module DSL
3
- module Callbacks
4
-
5
- def self.included(base) #:nodoc:
6
- base.extend ClassMethods
7
- end
8
-
9
- module ClassMethods
10
- protected
1
+ module Remarkable
2
+ module DSL
3
+ module Callbacks
4
+
5
+ def self.included(base) #:nodoc:
6
+ base.extend ClassMethods
7
+ end
8
+
9
+ module ClassMethods
10
+ protected
11
11
  # Class method that accepts a block or a symbol which is called after
12
12
  # initialization.
13
13
  #
@@ -18,15 +18,15 @@ module Remarkable
18
18
  # after_initialize do
19
19
  # # code
20
20
  # end
21
- #
22
- def after_initialize(*symbols, &block)
23
- if block_given?
24
- @after_initialize_callbacks << block
25
- else
26
- @after_initialize_callbacks += symbols
27
- end
28
- end
29
-
21
+ #
22
+ def after_initialize(*symbols, &block)
23
+ if block_given?
24
+ @after_initialize_callbacks << block
25
+ else
26
+ @after_initialize_callbacks += symbols
27
+ end
28
+ end
29
+
30
30
  # Class method that accepts a block or a symbol which is called before
31
31
  # running assertions.
32
32
  #
@@ -37,36 +37,36 @@ module Remarkable
37
37
  # before_assert do
38
38
  # # code
39
39
  # end
40
- #
41
- def before_assert(*symbols, &block)
42
- if block_given?
43
- @before_assert_callbacks << block
44
- else
45
- @before_assert_callbacks += symbols
46
- end
47
- end
48
- end
49
-
50
- def run_after_initialize_callbacks #:nodoc:
51
- self.class.after_initialize_callbacks.each do |method|
52
- if method.is_a?(Proc)
53
- instance_eval &method
54
- elsif method.is_a?(Symbol)
55
- send(method)
56
- end
57
- end
58
- end
59
-
60
- def run_before_assert_callbacks #:nodoc:
61
- self.class.before_assert_callbacks.each do |method|
62
- if method.is_a?(Proc)
63
- instance_eval &method
64
- elsif method.is_a?(Symbol)
65
- send(method)
66
- end
67
- end
68
- end
69
-
70
- end
71
- end
72
- end
40
+ #
41
+ def before_assert(*symbols, &block)
42
+ if block_given?
43
+ @before_assert_callbacks << block
44
+ else
45
+ @before_assert_callbacks += symbols
46
+ end
47
+ end
48
+ end
49
+
50
+ def run_after_initialize_callbacks #:nodoc:
51
+ self.class.after_initialize_callbacks.each do |method|
52
+ if method.is_a?(Proc)
53
+ instance_eval &method
54
+ elsif method.is_a?(Symbol)
55
+ send(method)
56
+ end
57
+ end
58
+ end
59
+
60
+ def run_before_assert_callbacks #:nodoc:
61
+ self.class.before_assert_callbacks.each do |method|
62
+ if method.is_a?(Proc)
63
+ instance_eval &method
64
+ elsif method.is_a?(Symbol)
65
+ send(method)
66
+ end
67
+ end
68
+ end
69
+
70
+ end
71
+ end
72
+ end
@@ -1,13 +1,13 @@
1
- module Remarkable
1
+ module Remarkable
2
2
  module DSL
3
3
  # This module is responsable for create optional handlers and providing macro
4
4
  # configration blocks. Consider the matcher below:
5
5
  #
6
- # class AllowValuesForMatcher < Remarkable::ActiveRecord::Base
7
- # arguments :collection => :attributes, :as => :attribute
8
- #
6
+ # class AllowValuesForMatcher < Remarkable::ActiveRecord::Base
7
+ # arguments :collection => :attributes, :as => :attribute
8
+ #
9
9
  # optional :message
10
- # optional :in, :splat => true
10
+ # optional :in, :splat => true
11
11
  # optional :allow_nil, :allow_blank, :default => true
12
12
  # end
13
13
  #
@@ -44,31 +44,31 @@ module Remarkable
44
44
  #
45
45
  # == I18n
46
46
  #
47
- # Optionals will be included in description messages if you assign them
48
- # properly on your locale file. If you have a validate_uniqueness_of
49
- # matcher with the following on your locale file:
50
- #
51
- # description: validate uniqueness of {{attributes}}
52
- # optionals:
53
- # scope:
54
- # positive: scoped to {{inspect}}
55
- # case_sensitive:
56
- # positive: case sensitive
57
- # negative: case insensitive
58
- #
59
- # When invoked like below will generate the following messages:
60
- #
61
- # validate_uniqueness_of :project_id, :scope => :company_id
62
- # #=> "validate uniqueness of project_id scoped to :company_id"
63
- #
64
- # validate_uniqueness_of :project_id, :scope => :company_id, :case_sensitive => true
65
- # #=> "validate uniqueness of project_id scoped to :company_id and case sensitive"
66
- #
67
- # validate_uniqueness_of :project_id, :scope => :company_id, :case_sensitive => false
68
- # #=> "validate uniqueness of project_id scoped to :company_id and case insensitive"
47
+ # Optionals will be included in description messages if you assign them
48
+ # properly on your locale file. If you have a validate_uniqueness_of
49
+ # matcher with the following on your locale file:
50
+ #
51
+ # description: validate uniqueness of {{attributes}}
52
+ # optionals:
53
+ # scope:
54
+ # positive: scoped to {{inspect}}
55
+ # case_sensitive:
56
+ # positive: case sensitive
57
+ # negative: case insensitive
58
+ #
59
+ # When invoked like below will generate the following messages:
60
+ #
61
+ # validate_uniqueness_of :project_id, :scope => :company_id
62
+ # #=> "validate uniqueness of project_id scoped to :company_id"
63
+ #
64
+ # validate_uniqueness_of :project_id, :scope => :company_id, :case_sensitive => true
65
+ # #=> "validate uniqueness of project_id scoped to :company_id and case sensitive"
66
+ #
67
+ # validate_uniqueness_of :project_id, :scope => :company_id, :case_sensitive => false
68
+ # #=> "validate uniqueness of project_id scoped to :company_id and case insensitive"
69
69
  #
70
70
  # == Interpolation options
71
- #
71
+ #
72
72
  # The default interpolation options available are "inspect" and "value". Whenever
73
73
  # you use :splat => true, it also adds a new interpolation option called {{sentence}}.
74
74
  #
@@ -87,50 +87,50 @@ module Remarkable
87
87
  #
88
88
  # positive: scoped to {{value}}
89
89
  # # Outputs: "validate uniqueness of project_id scoped to company_id and project_id"
90
- #
91
- # == Interpolation keys
90
+ #
91
+ # == Interpolation keys
92
92
  #
93
93
  # Three keys are available to be used in I18n files and control how optionals
94
- # are appended to your description:
95
- #
96
- # * <tt>positive</tt> - When the optional is given and it evaluates to true (everything but false and nil).
97
- # * <tt>negative</tt> - When the optional is given and it evaluates to false (false or nil).
98
- # * <tt>not_given</tt> - When the optional is not given.
99
- #
100
- module Optionals
101
-
102
- OPTIONAL_KEYS = [ :positive, :negative, :not_given ]
103
-
104
- def self.included(base) #:nodoc:
105
- base.extend ClassMethods
106
- end
107
-
108
- module ClassMethods
109
-
110
- protected
111
-
112
- # Creates optional handlers for matchers dynamically.
113
- #
114
- # == Options
115
- #
116
- # * <tt>:default</tt> - The default value for this optional
117
- # * <tt>:alias</tt> - An alias for this optional
94
+ # are appended to your description:
95
+ #
96
+ # * <tt>positive</tt> - When the optional is given and it evaluates to true (everything but false and nil).
97
+ # * <tt>negative</tt> - When the optional is given and it evaluates to false (false or nil).
98
+ # * <tt>not_given</tt> - When the optional is not given.
99
+ #
100
+ module Optionals
101
+
102
+ OPTIONAL_KEYS = [ :positive, :negative, :not_given ]
103
+
104
+ def self.included(base) #:nodoc:
105
+ base.extend ClassMethods
106
+ end
107
+
108
+ module ClassMethods
109
+
110
+ protected
111
+
112
+ # Creates optional handlers for matchers dynamically.
113
+ #
114
+ # == Options
115
+ #
116
+ # * <tt>:default</tt> - The default value for this optional
117
+ # * <tt>:alias</tt> - An alias for this optional
118
118
  # * <tt>:splat</tt> - Should be true if you expects multiple arguments
119
- # * <tt>:block</tt> - Tell this optional can also receive blocks
120
- #
121
- # == Examples
122
- #
123
- # class AllowValuesForMatcher < Remarkable::ActiveRecord::Base
124
- # arguments :collection => :attributes, :as => :attribute
125
- #
119
+ # * <tt>:block</tt> - Tell this optional can also receive blocks
120
+ #
121
+ # == Examples
122
+ #
123
+ # class AllowValuesForMatcher < Remarkable::ActiveRecord::Base
124
+ # arguments :collection => :attributes, :as => :attribute
125
+ #
126
126
  # optional :message
127
- # optional :in, :splat => true
127
+ # optional :in, :splat => true
128
128
  # optional :allow_nil, :allow_blank, :default => true
129
129
  # end
130
- #
131
- def optionals(*names)
130
+ #
131
+ def optionals(*names)
132
132
  options = names.extract_options!
133
-
133
+
134
134
  @matcher_optionals += names
135
135
  default = options[:default] ? "=#{options[:default].inspect}" : nil
136
136
 
@@ -140,71 +140,71 @@ module Remarkable
140
140
  ', &block'
141
141
  else
142
142
  nil
143
- end
144
-
143
+ end
144
+
145
145
  splat = if options[:splat]
146
146
  @matcher_optionals_splat += names
147
147
  '*'
148
148
  else
149
149
  nil
150
150
  end
151
-
152
- names.each do |name|
153
- class_eval <<-END, __FILE__, __LINE__
154
- def #{name}(#{splat}value#{default}#{block})
151
+
152
+ names.each do |name|
153
+ class_eval <<-END, __FILE__, __LINE__
154
+ def #{name}(#{splat}value#{default}#{block})
155
155
  @options ||= {}
156
- #{"@options[:#{name}] ||= []" if splat}
157
- @options[:#{name}] #{:+ if splat}= #{"block ||" if block} value
158
- self
156
+ #{"@options[:#{name}] ||= []" if splat}
157
+ @options[:#{name}] #{:+ if splat}= #{"block ||" if block} value
158
+ self
159
159
  end
160
160
  def #{name}=(value)
161
161
  @options ||= {}
162
- @options[:#{name}] = value
162
+ @options[:#{name}] = value
163
163
  self
164
- end
165
- END
164
+ end
165
+ END
166
166
  end
167
-
167
+
168
168
  class_eval %{
169
169
  alias :#{options[:alias]} :#{names.last}
170
170
  alias :#{options[:alias]}= :#{names.last}=
171
- } if options[:alias]
172
-
173
- # Call unique to avoid duplicate optionals.
174
- @matcher_optionals.uniq!
175
- end
176
- alias :optional :optionals
177
-
178
- # Instead of appending, prepend optionals to the beginning of optionals
171
+ } if options[:alias]
172
+
173
+ # Call unique to avoid duplicate optionals.
174
+ @matcher_optionals.uniq!
175
+ end
176
+ alias :optional :optionals
177
+
178
+ # Instead of appending, prepend optionals to the beginning of optionals
179
179
  # array. This is important because the optionals declaration order
180
- # changes how the description message is generated.
181
- #
182
- def prepend_optionals(*names)
183
- current_optionals = @matcher_optionals.dup
184
- @matcher_optionals = []
185
- optional(*names)
186
- @matcher_optionals += current_optionals
187
- @matcher_optionals.uniq!
188
- end
189
- alias :prepend_optional :prepend_optionals
190
-
191
- end
192
-
193
- # Overwrites description to support optionals. Check <tt>optional</tt> for
194
- # more information.
195
- #
196
- def description(options={}) #:nodoc:
197
- message = super(options)
198
- message.strip!
199
-
200
- optionals = self.class.matcher_optionals.map do |optional|
201
- if @options.key?(optional)
180
+ # changes how the description message is generated.
181
+ #
182
+ def prepend_optionals(*names)
183
+ current_optionals = @matcher_optionals.dup
184
+ @matcher_optionals = []
185
+ optional(*names)
186
+ @matcher_optionals += current_optionals
187
+ @matcher_optionals.uniq!
188
+ end
189
+ alias :prepend_optional :prepend_optionals
190
+
191
+ end
192
+
193
+ # Overwrites description to support optionals. Check <tt>optional</tt> for
194
+ # more information.
195
+ #
196
+ def description(options={}) #:nodoc:
197
+ message = super(options)
198
+ message.strip!
199
+
200
+ optionals = self.class.matcher_optionals.map do |optional|
201
+ if @options.key?(optional)
202
202
  value = @options[optional]
203
-
203
+
204
204
  defaults = [ (value ? :positive : :negative) ]
205
- # If optional is a symbol and it's not any to any of the reserved symbols, search for it also
205
+ # If optional is a symbol and it's not any to any of the reserved symbols, search for it also
206
206
  defaults.unshift(value) if value.is_a?(Symbol) && !OPTIONAL_KEYS.include?(value)
207
- defaults << ''
207
+ defaults << ''
208
208
 
209
209
  options = { :default => defaults, :inspect => value.inspect, :value => value.to_s }
210
210
 
@@ -216,12 +216,12 @@ module Remarkable
216
216
  translate_optionals_with_namespace(optional, defaults.shift, options)
217
217
  else
218
218
  translate_optionals_with_namespace(optional, :not_given, :default => '')
219
- end
220
- end.compact
221
-
222
- message << ' ' << array_to_sentence(optionals)
223
- message.strip!
224
- message
219
+ end
220
+ end.compact
221
+
222
+ message << ' ' << array_to_sentence(optionals)
223
+ message.strip!
224
+ message
225
225
  end
226
226
 
227
227
  def translate_optionals_with_namespace(optional, key, options={}) #:nodoc:
@@ -236,8 +236,8 @@ module Remarkable
236
236
  return translation unless translation.empty?
237
237
 
238
238
  nil
239
- end
240
-
241
- end
242
- end
243
- end
239
+ end
240
+
241
+ end
242
+ end
243
+ end
@@ -4,74 +4,74 @@ module Remarkable
4
4
  # Remarkable shouldn't rely on I18n default locale, because it might change
5
5
  # throughout tests. So it's Remarkable responsibility to hold its own locale
6
6
  # and send it to I18n.
7
- #
8
- module I18n
9
-
7
+ #
8
+ module I18n
9
+
10
10
  # Add locale files to I18n and to load path, if it exists.
11
11
  #
12
12
  # == Examples
13
13
  #
14
14
  # Remarkable.add_locale "path/to/locale"
15
- #
16
- def add_locale(*locales)
17
- ::I18n.backend.load_translations *locales
18
- ::I18n.load_path += locales if ::I18n.respond_to?(:load_path)
19
- end
20
-
15
+ #
16
+ def add_locale(*locales)
17
+ ::I18n.backend.load_translations *locales
18
+ ::I18n.load_path += locales if ::I18n.respond_to?(:load_path)
19
+ end
20
+
21
21
  # Set Remarkable own locale.
22
22
  #
23
23
  # == Examples
24
24
  #
25
25
  # Remarkable.locale = :en
26
- #
27
- def locale=(locale)
28
- @@locale = locale
29
- end
30
-
26
+ #
27
+ def locale=(locale)
28
+ @@locale = locale
29
+ end
30
+
31
31
  # Get Remarkable own locale.
32
32
  #
33
33
  # == Examples
34
34
  #
35
35
  # Remarkable.locale = :en
36
36
  # Remarkable.locale #=> :en
37
- #
38
- def locale
39
- @@locale
40
- end
41
-
37
+ #
38
+ def locale
39
+ @@locale
40
+ end
41
+
42
42
  # Wrapper for I18n.translate
43
- #
44
- def translate(string, options = {})
45
- ::I18n.translate string, { :locale => @@locale }.merge(options)
46
- end
47
- alias :t :translate
48
-
43
+ #
44
+ def translate(string, options = {})
45
+ ::I18n.translate string, { :locale => @@locale }.merge(options)
46
+ end
47
+ alias :t :translate
48
+
49
49
  # Wrapper for I18n.localize
50
- #
51
- def localize(object, options = {})
52
- ::I18n.localize object, { :locale => @@locale }.merge(options)
53
- end
54
- alias :l :localize
55
-
56
- end
57
- end
58
-
59
- # Load I18n
60
- RAILS_I18N = Object.const_defined?(:I18n) unless Object.const_defined?(:RAILS_I18N) # Rails >= 2.2
61
-
62
- unless RAILS_I18N
63
- begin
64
- require 'i18n'
65
- rescue LoadError
66
- require 'rubygems'
67
- # TODO Move to i18n gem as soon as it gets updated
68
- gem 'svenfuchs-i18n'
69
- require 'i18n'
70
- end
71
-
72
- # Set default locale
73
- ::I18n.default_locale = :en
74
- end
75
-
76
- Remarkable.extend Remarkable::I18n
77
- Remarkable.locale = :en
50
+ #
51
+ def localize(object, options = {})
52
+ ::I18n.localize object, { :locale => @@locale }.merge(options)
53
+ end
54
+ alias :l :localize
55
+
56
+ end
57
+ end
58
+
59
+ # Load I18n
60
+ RAILS_I18N = Object.const_defined?(:I18n) unless Object.const_defined?(:RAILS_I18N) # Rails >= 2.2
61
+
62
+ unless RAILS_I18N
63
+ begin
64
+ require 'i18n'
65
+ rescue LoadError
66
+ require 'rubygems'
67
+ # TODO Move to i18n gem as soon as it gets updated
68
+ gem 'svenfuchs-i18n'
69
+ require 'i18n'
70
+ end
71
+
72
+ # Set default locale
73
+ ::I18n.default_locale = :en
74
+ end
75
+
76
+ Remarkable.extend Remarkable::I18n
77
+ Remarkable.locale = :en