roart 0.1.5.1 → 0.1.6
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.
- data/History.txt +8 -0
- data/lib/roart.rb +1 -1
- data/lib/roart/connection.rb +1 -1
- data/lib/roart/core/array.rb +4 -4
- data/lib/roart/core/hash.rb +11 -4
- data/lib/roart/core/hash/indifferent_access.rb +133 -0
- data/lib/roart/roart.rb +11 -12
- data/lib/roart/ticket.rb +55 -18
- data/lib/roart/ticket_page.rb +14 -5
- data/lib/roart/validations.rb +48 -49
- data/roart.gemspec +9 -10
- data/spec/roart/callbacks_spec.rb +2 -2
- data/spec/roart/ticket_page_spec.rb +18 -2
- data/spec/roart/ticket_spec.rb +14 -7
- data/spec/spec_helper.rb +1 -1
- data/spec/test_data/search_ticket.txt +13 -0
- metadata +5 -15
- data/tasks/ann.rake +0 -80
- data/tasks/bones.rake +0 -20
- data/tasks/gem.rake +0 -201
- data/tasks/git.rake +0 -40
- data/tasks/notes.rake +0 -27
- data/tasks/post_load.rake +0 -34
- data/tasks/rdoc.rake +0 -51
- data/tasks/rubyforge.rake +0 -55
- data/tasks/setup.rb +0 -292
- data/tasks/spec.rake +0 -54
- data/tasks/svn.rake +0 -47
- data/tasks/test.rake +0 -40
- data/tasks/zentest.rake +0 -36
data/History.txt
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
==0.1.6 / 2010-03-09
|
2
|
+
Updated the search feature to pull all the ticket information at the same time, instead of only loading the id and subject.
|
3
|
+
Fixed tests that were failing because of out-of-order strings.
|
4
|
+
Returned to a sane version numbering scheme, sorry about that.
|
5
|
+
|
6
|
+
==0.1.5.2 / 2010-01-20
|
7
|
+
New ticket objects now come with a default attribute :text that specifies the initial log of the ticket.
|
8
|
+
|
1
9
|
==0.1.5.1 / 2010-01-20
|
2
10
|
Fixed a bug that caused custom fields not to show up in the ticket attributes
|
3
11
|
|
data/lib/roart.rb
CHANGED
data/lib/roart/connection.rb
CHANGED
@@ -17,7 +17,7 @@ module Roart
|
|
17
17
|
def initialize(conf)
|
18
18
|
if conf.is_a?(String)
|
19
19
|
raise "Loading Config File not yet implemented"
|
20
|
-
elsif conf.is_a?(Hash)
|
20
|
+
elsif conf.class.name == Hash.name #TODO: Figure out why conf.is_a?(Hash) doesn't work
|
21
21
|
@conf = conf
|
22
22
|
end
|
23
23
|
if Roart::check_keys(conf, Roart::Connections::RequiredConfig)
|
data/lib/roart/core/array.rb
CHANGED
data/lib/roart/core/hash.rb
CHANGED
@@ -1,15 +1,22 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/hash/indifferent_access.rb"
|
1
2
|
class Hash
|
2
3
|
def to_content_format
|
3
|
-
fields = self.map do |key,value|
|
4
|
+
fields = self.map do |key,value|
|
4
5
|
unless value.nil?
|
5
6
|
if key.to_s.match(/^cf_.+/)
|
6
|
-
"CF-#{key.to_s[3..key.to_s.length].camelize.humanize}: #{value}"
|
7
|
+
"CF-#{key.to_s[3..key.to_s.length].gsub(/_/, " ").camelize.humanize}: #{value}"
|
7
8
|
else
|
8
9
|
"#{key.to_s.camelize}: #{value}"
|
9
10
|
end
|
10
11
|
end
|
11
12
|
end
|
12
|
-
content = fields.compact.join("\n")
|
13
|
+
content = fields.compact.sort.join("\n")
|
13
14
|
end
|
14
|
-
|
15
|
+
|
16
|
+
def with_indifferent_access
|
17
|
+
hash = HashWithIndifferentAccess.new(self)
|
18
|
+
hash.default = self.default
|
19
|
+
hash
|
20
|
+
end
|
21
|
+
|
15
22
|
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
# used from ActiveSupport
|
2
|
+
# Copyright (c) 2005-2009 David Heinemeier Hansson
|
3
|
+
|
4
|
+
# This class has dubious semantics and we only have it so that
|
5
|
+
# people can write params[:key] instead of params['key']
|
6
|
+
# and they get the same value for both keys.
|
7
|
+
|
8
|
+
class HashWithIndifferentAccess < Hash
|
9
|
+
def initialize(constructor = {})
|
10
|
+
if constructor.is_a?(Hash)
|
11
|
+
super()
|
12
|
+
update(constructor)
|
13
|
+
else
|
14
|
+
super(constructor)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def default(key = nil)
|
19
|
+
if key.is_a?(Symbol) && include?(key = key.to_s)
|
20
|
+
self[key]
|
21
|
+
else
|
22
|
+
super
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
alias_method :regular_writer, :[]= unless method_defined?(:regular_writer)
|
27
|
+
alias_method :regular_update, :update unless method_defined?(:regular_update)
|
28
|
+
|
29
|
+
# Assigns a new value to the hash:
|
30
|
+
#
|
31
|
+
# hash = HashWithIndifferentAccess.new
|
32
|
+
# hash[:key] = "value"
|
33
|
+
#
|
34
|
+
def []=(key, value)
|
35
|
+
regular_writer(convert_key(key), convert_value(value))
|
36
|
+
end
|
37
|
+
|
38
|
+
# Updates the instantized hash with values from the second:
|
39
|
+
#
|
40
|
+
# hash_1 = HashWithIndifferentAccess.new
|
41
|
+
# hash_1[:key] = "value"
|
42
|
+
#
|
43
|
+
# hash_2 = HashWithIndifferentAccess.new
|
44
|
+
# hash_2[:key] = "New Value!"
|
45
|
+
#
|
46
|
+
# hash_1.update(hash_2) # => {"key"=>"New Value!"}
|
47
|
+
#
|
48
|
+
def update(other_hash)
|
49
|
+
other_hash.each_pair { |key, value| regular_writer(convert_key(key), convert_value(value)) }
|
50
|
+
self
|
51
|
+
end
|
52
|
+
|
53
|
+
alias_method :merge!, :update
|
54
|
+
|
55
|
+
# Checks the hash for a key matching the argument passed in:
|
56
|
+
#
|
57
|
+
# hash = HashWithIndifferentAccess.new
|
58
|
+
# hash["key"] = "value"
|
59
|
+
# hash.key? :key # => true
|
60
|
+
# hash.key? "key" # => true
|
61
|
+
#
|
62
|
+
def key?(key)
|
63
|
+
super(convert_key(key))
|
64
|
+
end
|
65
|
+
|
66
|
+
alias_method :include?, :key?
|
67
|
+
alias_method :has_key?, :key?
|
68
|
+
alias_method :member?, :key?
|
69
|
+
|
70
|
+
# Fetches the value for the specified key, same as doing hash[key]
|
71
|
+
def fetch(key, *extras)
|
72
|
+
super(convert_key(key), *extras)
|
73
|
+
end
|
74
|
+
|
75
|
+
# Returns an array of the values at the specified indices:
|
76
|
+
#
|
77
|
+
# hash = HashWithIndifferentAccess.new
|
78
|
+
# hash[:a] = "x"
|
79
|
+
# hash[:b] = "y"
|
80
|
+
# hash.values_at("a", "b") # => ["x", "y"]
|
81
|
+
#
|
82
|
+
def values_at(*indices)
|
83
|
+
indices.collect {|key| self[convert_key(key)]}
|
84
|
+
end
|
85
|
+
|
86
|
+
# Returns an exact copy of the hash.
|
87
|
+
def dup
|
88
|
+
HashWithIndifferentAccess.new(self)
|
89
|
+
end
|
90
|
+
|
91
|
+
# Merges the instantized and the specified hashes together, giving precedence to the values from the second hash
|
92
|
+
# Does not overwrite the existing hash.
|
93
|
+
def merge(hash)
|
94
|
+
self.dup.update(hash)
|
95
|
+
end
|
96
|
+
|
97
|
+
# Performs the opposite of merge, with the keys and values from the first hash taking precedence over the second.
|
98
|
+
# This overloaded definition prevents returning a regular hash, if reverse_merge is called on a HashWithDifferentAccess.
|
99
|
+
def reverse_merge(other_hash)
|
100
|
+
super other_hash.with_indifferent_access
|
101
|
+
end
|
102
|
+
|
103
|
+
# Removes a specified key from the hash.
|
104
|
+
def delete(key)
|
105
|
+
super(convert_key(key))
|
106
|
+
end
|
107
|
+
|
108
|
+
def stringify_keys!; self end
|
109
|
+
def symbolize_keys!; self end
|
110
|
+
def to_options!; self end
|
111
|
+
|
112
|
+
# Convert to a Hash with String keys.
|
113
|
+
def to_hash
|
114
|
+
Hash.new(default).merge(self)
|
115
|
+
end
|
116
|
+
|
117
|
+
protected
|
118
|
+
def convert_key(key)
|
119
|
+
key.kind_of?(Symbol) ? key.to_s : key
|
120
|
+
end
|
121
|
+
|
122
|
+
def convert_value(value)
|
123
|
+
case value
|
124
|
+
when Hash
|
125
|
+
value.with_indifferent_access
|
126
|
+
when Array
|
127
|
+
value.collect { |e| e.is_a?(Hash) ? e.with_indifferent_access : e }
|
128
|
+
else
|
129
|
+
value
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
data/lib/roart/roart.rb
CHANGED
@@ -1,25 +1,24 @@
|
|
1
1
|
module Roart
|
2
|
-
|
2
|
+
|
3
3
|
def self.check_keys!(hash, required)
|
4
|
-
|
5
|
-
|
6
|
-
inc ? hash.keys.include?(attr.to_sym) : nil
|
4
|
+
unless required.inject(true) do |inc, attr|
|
5
|
+
inc ? hash.keys.include?(attr) : nil
|
7
6
|
end
|
8
|
-
raise ArgumentError, "Not all required fields entered"
|
7
|
+
raise ArgumentError, "Not all required fields entered"
|
9
8
|
end
|
10
9
|
end
|
11
|
-
|
10
|
+
|
12
11
|
def self.check_keys(hash, required)
|
13
|
-
unless required.inject(true) do |inc, attr|
|
12
|
+
unless required.inject(true) do |inc, attr|
|
14
13
|
inc ? hash.keys.include?(attr.to_sym) : nil
|
15
14
|
end
|
16
15
|
return false
|
17
16
|
end
|
18
17
|
return true
|
19
18
|
end
|
20
|
-
|
19
|
+
|
21
20
|
module MethodFunctions
|
22
|
-
|
21
|
+
|
23
22
|
def add_methods!
|
24
23
|
@attributes.each do |key, value|
|
25
24
|
(class << self; self; end).send :define_method, key do
|
@@ -28,9 +27,9 @@ module Roart
|
|
28
27
|
(class << self; self; end).send :define_method, "#{key}=" do |new_val|
|
29
28
|
@attributes[key] = new_val
|
30
29
|
end
|
31
|
-
end
|
30
|
+
end
|
32
31
|
end
|
33
|
-
|
32
|
+
|
34
33
|
end
|
35
|
-
|
34
|
+
|
36
35
|
end
|
data/lib/roart/ticket.rb
CHANGED
@@ -2,7 +2,7 @@ module Roart
|
|
2
2
|
|
3
3
|
module Tickets
|
4
4
|
|
5
|
-
DefaultAttributes = %w(queue owner creator subject status priority initial_priority final_priority requestors cc admin_cc created starts started due resolved told last_updated time_estimated time_worked time_left)
|
5
|
+
DefaultAttributes = %w(queue owner creator subject status priority initial_priority final_priority requestors cc admin_cc created starts started due resolved told last_updated time_estimated time_worked time_left text)
|
6
6
|
RequiredAttributes = %w(queue subject)
|
7
7
|
|
8
8
|
end
|
@@ -62,17 +62,25 @@ module Roart
|
|
62
62
|
self.before_update
|
63
63
|
uri = "#{self.class.connection.server}/REST/1.0/ticket/#{self.id}/edit"
|
64
64
|
payload = @attributes.clone
|
65
|
-
payload.delete(
|
65
|
+
payload.delete("text")
|
66
|
+
payload.delete("id") # Can't have text in an update, only create, use comment for updateing
|
66
67
|
payload = payload.to_content_format
|
68
|
+
puts payload
|
67
69
|
resp = self.class.connection.post(uri, :content => payload)
|
70
|
+
puts resp
|
68
71
|
resp = resp.split("\n")
|
69
72
|
raise "Ticket Update Failed" unless resp.first.include?("200")
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
73
|
+
resp.each do |line|
|
74
|
+
puts "line"
|
75
|
+
if line.match(/^# Ticket (\d+) updated./)
|
76
|
+
self.after_update
|
77
|
+
puts "FOUND"
|
78
|
+
return true
|
79
|
+
else
|
80
|
+
#TODO: Add warnign to ticket
|
81
|
+
end
|
75
82
|
end
|
83
|
+
return false
|
76
84
|
end
|
77
85
|
end
|
78
86
|
|
@@ -111,14 +119,17 @@ module Roart
|
|
111
119
|
resp = self.class.connection.post(uri, :content => payload)
|
112
120
|
resp = resp.split("\n")
|
113
121
|
raise "Ticket Create Failed" unless resp.first.include?("200")
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
122
|
+
resp.each do |line|
|
123
|
+
if tid = line.match(/^# Ticket (\d+) created./)
|
124
|
+
@attributes[:id] = tid[1].to_i
|
125
|
+
self.after_create
|
126
|
+
@new_record = false
|
127
|
+
return true
|
128
|
+
else
|
129
|
+
#TODO: Add Warnings To Ticket
|
130
|
+
end
|
121
131
|
end
|
132
|
+
return false
|
122
133
|
end
|
123
134
|
|
124
135
|
def create! #:nodoc:
|
@@ -241,7 +252,7 @@ module Roart
|
|
241
252
|
array << object
|
242
253
|
end
|
243
254
|
return array
|
244
|
-
elsif attrs.is_a?(Hash)
|
255
|
+
elsif attrs.is_a?(Hash) || attrs.is_a?(HashWithIndifferentAccess)
|
245
256
|
object = self.allocate
|
246
257
|
object.instance_variable_set("@attributes", attrs)
|
247
258
|
object.send("add_methods!")
|
@@ -279,11 +290,37 @@ module Roart
|
|
279
290
|
end
|
280
291
|
end
|
281
292
|
|
293
|
+
def page_list_array(uri) #:nodoc:
|
294
|
+
page = self.connection.get(uri)
|
295
|
+
raise TicketSystemError, "Can't get ticket." unless page
|
296
|
+
page = page.split("\n")
|
297
|
+
status = page.delete_at(0)
|
298
|
+
if status.include?("200")
|
299
|
+
page = page.join("\n")
|
300
|
+
chunks = page.split(/^--$/)
|
301
|
+
page = []
|
302
|
+
for chunk in chunks
|
303
|
+
chunk = chunk.split("\n")
|
304
|
+
chunk.delete_if{|x| !x.include?(":")}
|
305
|
+
page << chunk
|
306
|
+
end
|
307
|
+
page
|
308
|
+
else
|
309
|
+
raise TicketSystemInterfaceError, "Error Getting Ticket: #{status}"
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
282
313
|
def get_tickets_from_search_uri(uri) #:nodoc:
|
283
|
-
page =
|
314
|
+
page = page_list_array(uri + "&format=l")
|
284
315
|
page.extend(Roart::TicketPage)
|
285
|
-
page = page.
|
286
|
-
|
316
|
+
page = page.to_search_list_array
|
317
|
+
array = Array.new
|
318
|
+
for ticket in page
|
319
|
+
ticket = self.instantiate(ticket)
|
320
|
+
ticket.instance_variable_set("@full", true)
|
321
|
+
array << ticket
|
322
|
+
end
|
323
|
+
array
|
287
324
|
end
|
288
325
|
|
289
326
|
def get_ticket_from_uri(uri) #:nodoc:
|
data/lib/roart/ticket_page.rb
CHANGED
@@ -5,7 +5,7 @@ module Roart
|
|
5
5
|
IntKeys = %w[id]
|
6
6
|
|
7
7
|
def to_hash
|
8
|
-
hash =
|
8
|
+
hash = HashWithIndifferentAccess.new
|
9
9
|
self.delete_if{|x| !x.include?(":")}
|
10
10
|
self.each do |ln|
|
11
11
|
ln = ln.split(":")
|
@@ -17,12 +17,21 @@ module Roart
|
|
17
17
|
key = ln.delete_at(0).strip.underscore
|
18
18
|
end
|
19
19
|
value = ln.join(":").strip
|
20
|
-
hash[key
|
20
|
+
hash[key] = value if key
|
21
21
|
end
|
22
|
-
hash[
|
22
|
+
hash["id"] = hash["id"].split("/").last.to_i
|
23
23
|
hash
|
24
24
|
end
|
25
25
|
|
26
|
+
def to_search_list_array
|
27
|
+
array = Array.new
|
28
|
+
self.each do |ticket|
|
29
|
+
ticket.extend(Roart::TicketPage)
|
30
|
+
array << ticket.to_hash
|
31
|
+
end
|
32
|
+
array
|
33
|
+
end
|
34
|
+
|
26
35
|
def to_search_array
|
27
36
|
array = Array.new
|
28
37
|
self.delete_if{|x| !x.include?(":")}
|
@@ -42,7 +51,7 @@ module Roart
|
|
42
51
|
|
43
52
|
# TODO: Don't throw away attachments (/^ {13})
|
44
53
|
def to_history_hash
|
45
|
-
hash =
|
54
|
+
hash = HashWithIndifferentAccess.new
|
46
55
|
self.delete_if{|x| !x.include?(":") && !x.match(/^ {9}/) && !x.match(/^ {13}/)}
|
47
56
|
self.each do |ln|
|
48
57
|
if ln.match(/^ {9}/) && !ln.match(/^ {13}/)
|
@@ -54,7 +63,7 @@ module Roart
|
|
54
63
|
unless ln.size == 1 || ln.first == 'Ticket' # we don't want to override the ticket method.
|
55
64
|
key = ln.delete_at(0).strip.underscore
|
56
65
|
value = ln.join(":").strip
|
57
|
-
hash[key
|
66
|
+
hash[key] = IntKeys.include?(key) ? value.to_i : value
|
58
67
|
end
|
59
68
|
end
|
60
69
|
end
|
data/lib/roart/validations.rb
CHANGED
@@ -1,37 +1,37 @@
|
|
1
1
|
module Roart
|
2
|
-
|
2
|
+
|
3
3
|
class Errors
|
4
4
|
include Enumerable
|
5
|
-
|
5
|
+
|
6
6
|
def initialize(obj)
|
7
7
|
@base, @errors = obj, {}
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
def add_to_base(msg)
|
11
11
|
add(:base, msg)
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
def add(field, message)
|
15
15
|
@errors[field.to_sym] ||= []
|
16
16
|
@errors[field.to_sym] << message
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
def on_base
|
20
20
|
on(:base)
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
def on(field)
|
24
24
|
errors = @errors[field.to_sym]
|
25
25
|
return nil if errors.nil?
|
26
26
|
errors
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
alias :[] :on
|
30
|
-
|
30
|
+
|
31
31
|
def each
|
32
32
|
@errors.each_key { |attr| @errors[attr].each { |msg| yield attr, msg } }
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
# Returns true if no errors have been added.
|
36
36
|
def empty?
|
37
37
|
@errors.empty?
|
@@ -41,42 +41,42 @@ module Roart
|
|
41
41
|
def clear
|
42
42
|
@errors = {}
|
43
43
|
end
|
44
|
-
|
45
|
-
# Returns the total number of errors added. Two errors added to the same attribute will be counted as such.
|
44
|
+
|
45
|
+
# Returns the total number of errors added. Two errors added to the same attribute will be counted as such.
|
46
46
|
def size
|
47
47
|
@errors.values.inject(0) { |error_count, attribute| error_count + attribute.size }
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
alias_method :count, :size
|
51
51
|
alias_method :length, :size
|
52
|
-
|
52
|
+
|
53
53
|
end
|
54
|
-
|
54
|
+
|
55
55
|
module Validations
|
56
|
-
|
56
|
+
|
57
57
|
def self.included(model)
|
58
58
|
model.extend ClassMethods
|
59
59
|
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
class Validators
|
63
|
-
|
63
|
+
|
64
64
|
def initialize
|
65
65
|
@validators = []
|
66
66
|
end
|
67
|
-
|
67
|
+
|
68
68
|
def add(validator)
|
69
69
|
@validators << validator
|
70
70
|
end
|
71
|
-
|
71
|
+
|
72
72
|
def validate(obj)
|
73
73
|
@validators.each{|validator| validator.call(obj)}
|
74
74
|
end
|
75
|
-
|
75
|
+
|
76
76
|
end
|
77
|
-
|
77
|
+
|
78
78
|
module ClassMethods
|
79
|
-
|
79
|
+
|
80
80
|
ALL_RANGE_OPTIONS = [ :is, :within, :in, :minimum, :min, :maximum, :max ].freeze
|
81
81
|
ALL_NUMERICALITY_CHECKS = { :greater_than => '>', :greater_than_or_equal_to => '>=',
|
82
82
|
:equal_to => '==', :less_than => '<', :less_than_or_equal_to => '<=',
|
@@ -85,23 +85,23 @@ module Roart
|
|
85
85
|
def validator
|
86
86
|
@validator ||= Validators.new
|
87
87
|
end
|
88
|
-
|
88
|
+
|
89
89
|
def validates_presence_of(*args)
|
90
|
-
|
90
|
+
|
91
91
|
end
|
92
|
-
|
92
|
+
|
93
93
|
def validates_format_of(*args)
|
94
94
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
95
95
|
args.each do |field|
|
96
96
|
validator_proc = lambda do |obj|
|
97
97
|
unless obj.send(field.to_sym).match(options[:format])
|
98
|
-
obj.errors.add(field.to_sym, "Wrong Format")
|
98
|
+
obj.errors.add(field.to_sym, "Wrong Format")
|
99
99
|
end
|
100
100
|
end
|
101
101
|
self.validator.add(validator_proc)
|
102
102
|
end
|
103
103
|
end
|
104
|
-
|
104
|
+
|
105
105
|
def validates_length_of(*args)
|
106
106
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
107
107
|
# Ensure that one and only one range option is specified.
|
@@ -114,19 +114,19 @@ module Roart
|
|
114
114
|
else
|
115
115
|
raise ArgumentError, 'Too many range options specified. Choose only one.'
|
116
116
|
end
|
117
|
-
|
117
|
+
|
118
118
|
option = range_options.first
|
119
119
|
option_value = options[range_options.first]
|
120
120
|
key = {:is => :wrong_length, :minimum => :too_short, :maximum => :too_long}[option]
|
121
121
|
custom_message = options[:message] || options[key]
|
122
|
-
|
122
|
+
|
123
123
|
args.each do |field|
|
124
124
|
case option
|
125
125
|
when :within, :in
|
126
|
-
raise ArgumentError, ":#{option} must be a Range" unless option_value.is_a?(Range)
|
126
|
+
raise ArgumentError, ":#{option} must be a Range" unless option_value.is_a?(Range)
|
127
127
|
validator_proc = lambda do |obj|
|
128
128
|
if obj.send(field.to_sym).length < option_value.begin
|
129
|
-
obj.errors.add(field.to_sym, "Must be more than #{option_value.begin} characters.")
|
129
|
+
obj.errors.add(field.to_sym, "Must be more than #{option_value.begin} characters.")
|
130
130
|
end
|
131
131
|
if obj.send(field.to_sym).length > option_value.end
|
132
132
|
obj.errors.add(field.to_sym, "Must be less than #{option_value.end} characters")
|
@@ -137,7 +137,7 @@ module Roart
|
|
137
137
|
raise ArgumentError, ":#{option} must be an Integer" unless option_value.is_a?(Integer)
|
138
138
|
validator_proc = lambda do |obj|
|
139
139
|
if obj.send(field.to_sym).length < option_value
|
140
|
-
obj.errors.add(field.to_sym, "Must be more than #{option_value} characters.")
|
140
|
+
obj.errors.add(field.to_sym, "Must be more than #{option_value} characters.")
|
141
141
|
end
|
142
142
|
end
|
143
143
|
self.validator.add(validator_proc)
|
@@ -145,29 +145,28 @@ module Roart
|
|
145
145
|
raise ArgumentError, ":#{option} must be an Integer" unless option_value.is_a?(Integer)
|
146
146
|
validator_proc = lambda do |obj|
|
147
147
|
if obj.send(field.to_sym).length > option_value
|
148
|
-
obj.errors.add(field.to_sym, "Must be less than #{option_value} characters.")
|
148
|
+
obj.errors.add(field.to_sym, "Must be less than #{option_value} characters.")
|
149
149
|
end
|
150
150
|
end
|
151
151
|
self.validator.add(validator_proc)
|
152
152
|
when :is
|
153
153
|
raise ArgumentError, ":#{option} must be an Integer" unless option_value.is_a?(Integer)
|
154
154
|
validator_proc = lambda do |obj|
|
155
|
-
puts "#{field} is #{option_value}"
|
156
155
|
unless obj.send(field.to_sym).length == option_value
|
157
|
-
obj.errors.add(field.to_sym, "Must be #{option_value} characters.")
|
156
|
+
obj.errors.add(field.to_sym, "Must be #{option_value} characters.")
|
158
157
|
end
|
159
158
|
end
|
160
159
|
self.validator.add(validator_proc)
|
161
160
|
end
|
162
161
|
end
|
163
162
|
end
|
164
|
-
|
163
|
+
|
165
164
|
alias_method :validates_size_of, :validates_length_of
|
166
|
-
|
165
|
+
|
167
166
|
def validates_numericality_of(*args)
|
168
167
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
169
168
|
numericality_options = ALL_NUMERICALITY_CHECKS & options.keys
|
170
|
-
|
169
|
+
|
171
170
|
case numericality_options
|
172
171
|
when 0
|
173
172
|
raise ArgumentError, "Options Unspecified. Specify an option to use."
|
@@ -176,46 +175,46 @@ module Roart
|
|
176
175
|
else
|
177
176
|
raise ArgumentError, "Too many options specified"
|
178
177
|
end
|
179
|
-
|
178
|
+
|
180
179
|
option = numericality_options.first
|
181
180
|
option_value = options[numericality_options.first]
|
182
181
|
key = {:is => :wrong_length, :minimum => :too_short, :maximum => :too_long}[option]
|
183
182
|
custom_message = options[:message] || options[key]
|
184
|
-
|
183
|
+
|
185
184
|
args.each do |field|
|
186
185
|
numericality_options.each do |option|
|
187
186
|
case option
|
188
187
|
when :odd, :even
|
189
188
|
unless raw_value.to_i.method(ALL_NUMERICALITY_CHECKS[option])[]
|
190
|
-
record.errors.add(attr_name, option, :value => raw_value, :default => configuration[:message])
|
189
|
+
record.errors.add(attr_name, option, :value => raw_value, :default => configuration[:message])
|
191
190
|
end
|
192
191
|
else
|
193
192
|
record.errors.add(attr_name, option, :default => configuration[:message], :value => raw_value, :count => configuration[option]) unless raw_value.method(ALL_NUMERICALITY_CHECKS[option])[configuration[option]]
|
194
193
|
end
|
195
194
|
end
|
196
195
|
end
|
197
|
-
|
196
|
+
|
198
197
|
end
|
199
|
-
|
198
|
+
|
200
199
|
end
|
201
|
-
|
200
|
+
|
202
201
|
def validator
|
203
202
|
self.class.validator
|
204
203
|
end
|
205
|
-
|
204
|
+
|
206
205
|
def valid?
|
207
206
|
validator.validate self
|
208
207
|
self.errors.size == 0
|
209
208
|
end
|
210
|
-
|
209
|
+
|
211
210
|
def invalid?
|
212
211
|
!valid?
|
213
212
|
end
|
214
|
-
|
213
|
+
|
215
214
|
def errors
|
216
215
|
@errors ||= Errors.new(self)
|
217
216
|
end
|
218
|
-
|
217
|
+
|
219
218
|
end
|
220
|
-
|
219
|
+
|
221
220
|
end
|