ccls-common_lib 1.4.0
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 +7 -0
- data/README.rdoc +116 -0
- data/lib/ccls-common_lib.rb +1 -0
- data/lib/common_lib.rb +37 -0
- data/lib/common_lib/action_controller_extension.rb +8 -0
- data/lib/common_lib/action_controller_extension/accessible_via_protocol.rb +405 -0
- data/lib/common_lib/action_controller_extension/accessible_via_user.rb +605 -0
- data/lib/common_lib/action_controller_extension/routing.rb +20 -0
- data/lib/common_lib/action_controller_extension/test_case.rb +22 -0
- data/lib/common_lib/action_view_extension.rb +3 -0
- data/lib/common_lib/action_view_extension/base.rb +310 -0
- data/lib/common_lib/action_view_extension/form_builder.rb +197 -0
- data/lib/common_lib/active_model.rb +4 -0
- data/lib/common_lib/active_model/errors.rb +16 -0
- data/lib/common_lib/active_model/validations/absence.rb +78 -0
- data/lib/common_lib/active_model/validations/complete_date.rb +138 -0
- data/lib/common_lib/active_model/validations/past_date.rb +121 -0
- data/lib/common_lib/active_record.rb +1 -0
- data/lib/common_lib/active_record/base.rb +129 -0
- data/lib/common_lib/active_support_extension.rb +12 -0
- data/lib/common_lib/active_support_extension/assertions.rb +108 -0
- data/lib/common_lib/active_support_extension/associations.rb +154 -0
- data/lib/common_lib/active_support_extension/attributes.rb +296 -0
- data/lib/common_lib/active_support_extension/pending.rb +115 -0
- data/lib/common_lib/active_support_extension/test_case.rb +203 -0
- data/lib/common_lib/railtie.rb +48 -0
- data/lib/common_lib/ruby.rb +8 -0
- data/lib/common_lib/ruby/array.rb +128 -0
- data/lib/common_lib/ruby/fixnum.rb +5 -0
- data/lib/common_lib/ruby/hash.rb +51 -0
- data/lib/common_lib/ruby/integer.rb +11 -0
- data/lib/common_lib/ruby/nil_class.rb +13 -0
- data/lib/common_lib/ruby/numeric.rb +0 -0
- data/lib/common_lib/ruby/object.rb +53 -0
- data/lib/common_lib/ruby/string.rb +20 -0
- data/lib/common_lib/translation_table.rb +129 -0
- data/lib/tasks/common_lib.rake +10 -0
- data/lib/tasks/csv.rake +0 -0
- data/lib/tasks/database.rake +229 -0
- data/lib/tasks/rcov.rake +52 -0
- data/vendor/assets/javascripts/common_lib.js +77 -0
- data/vendor/assets/stylesheets/common_lib.css +71 -0
- metadata +84 -0
@@ -0,0 +1,115 @@
|
|
1
|
+
# Some code from jeremymcanally's "pending"
|
2
|
+
# https://github.com/jeremymcanally/pending/tree/master
|
3
|
+
|
4
|
+
module ActiveSupport
|
5
|
+
module Testing
|
6
|
+
module Pending
|
7
|
+
|
8
|
+
unless defined?(Spec)
|
9
|
+
|
10
|
+
@@pending_cases = []
|
11
|
+
@@at_exit = false
|
12
|
+
|
13
|
+
def pending(description = "No description given", &block)
|
14
|
+
# just because its defined doesn't mean that the skip method exists
|
15
|
+
# this should be is_a?(MiniTest::Unit::TestCase)
|
16
|
+
# if defined?(::MiniTest)
|
17
|
+
# if defined?(::MiniTest) and self.is_a?(::MiniTest::Unit::TestCase)
|
18
|
+
# skip(description.blank? ? nil : description)
|
19
|
+
# else
|
20
|
+
if description.is_a?(Symbol)
|
21
|
+
is_pending = $tags[description]
|
22
|
+
return block.call unless is_pending
|
23
|
+
end
|
24
|
+
|
25
|
+
if block_given?
|
26
|
+
failed = false
|
27
|
+
|
28
|
+
begin
|
29
|
+
block.call
|
30
|
+
rescue Exception
|
31
|
+
failed = true
|
32
|
+
end
|
33
|
+
|
34
|
+
flunk("<#{description}> did not fail.") unless failed
|
35
|
+
end
|
36
|
+
|
37
|
+
# The original
|
38
|
+
# caller[0] =~ (/(.*):(.*):in `(.*)'/)
|
39
|
+
# @@pending_cases << "#{$3} at #{$1}, line #{$2}"
|
40
|
+
#
|
41
|
+
|
42
|
+
# Old notes
|
43
|
+
# caller[0] =~ (/(.*):(.*):in `(.*)'/)
|
44
|
+
# @@pending_cases << "#{$3} at #{$1}, line #{$2}"
|
45
|
+
#
|
46
|
+
## caller[0] will be like ...
|
47
|
+
## "/Users/jakewendt/github_repo/ccls/odms/test/unit/sample_test.rb:95:in `block in <class:SampleTest>'"
|
48
|
+
# # looks like we lose the name of the 'method' in 1.9.1
|
49
|
+
#
|
50
|
+
# # Gotta remember these as the next Regex will overwrite them.
|
51
|
+
# filename = $1
|
52
|
+
# linenumber = $2
|
53
|
+
#
|
54
|
+
### ruby 1.8.7
|
55
|
+
### Hx/Addresses Controller should NOT create new address with employee login and invalid address:
|
56
|
+
### ruby 1.9.1
|
57
|
+
###Hx/Addresses Controller block (2 levels) in <class:AddressesControllerTest>:
|
58
|
+
#
|
59
|
+
## testmethod = $3
|
60
|
+
## model = self.class.to_s.gsub(/Test$/,'').titleize
|
61
|
+
## method = testmethod.gsub(/_/,' ').gsub(/^test /,'')
|
62
|
+
### @@pending_cases << "#{model} #{method}:\n.\t#{filename} line #{linenumber}"
|
63
|
+
# @@pending_cases << "#{filename} line #{linenumber}"
|
64
|
+
### @@pending_cases << "#{testmethod} at #{filename}, line #{linenumber}"
|
65
|
+
#
|
66
|
+
|
67
|
+
# "/Users/jakewendt/github_repo/ccls/odms/test/unit/sample_test.rb:95:in `block in <class:SampleTest>'"
|
68
|
+
caller[0] =~ (/(.*):(.*):in `(.*)'/)
|
69
|
+
|
70
|
+
# self.to_s => test_should_be_pending(RoleTest)
|
71
|
+
|
72
|
+
# @@pending_cases << "#{$3} at #{$1}, line #{$2}"
|
73
|
+
# @@pending_cases << ["#{self.to_s} [#{$1}:#{$2}]",description]
|
74
|
+
@@pending_cases << [self.to_s,"[#{$1}:#{$2}]",description]
|
75
|
+
|
76
|
+
# 1) Skipped:
|
77
|
+
#test_should_not_update_attribute_if_new_data_is_blank(BcInfoTest) [/opt/local/lib/ruby1.9/gems/1.9.1/gems/activesupport-3.2.13/lib/active_support/testing/pending.rb:15]:
|
78
|
+
#Skipped, no message given
|
79
|
+
#
|
80
|
+
# 2) Skipped:
|
81
|
+
#test_should_send_save_failed_notification_if_subject_changed_and_save_failed(BcInfoTest) [/opt/local/lib/ruby1.9/gems/1.9.1/gems/activesupport-3.2.13/lib/active_support/testing/pending.rb:15]:
|
82
|
+
#Skipped, no message given
|
83
|
+
|
84
|
+
|
85
|
+
# making the output look more similar to "skip"
|
86
|
+
# probably should reincorporate this into CommonLib
|
87
|
+
|
88
|
+
print "P"
|
89
|
+
|
90
|
+
@@at_exit ||= begin
|
91
|
+
at_exit do
|
92
|
+
puts "\nPending Cases:"
|
93
|
+
# @@pending_cases.each do |test_case|
|
94
|
+
@@pending_cases.each_with_index do |test_case,i|
|
95
|
+
# puts " #{i+1}) Pending:"
|
96
|
+
printf "%4d) Pending:\n", i+1
|
97
|
+
puts test_case
|
98
|
+
# if i just puts the array it will append carriage returns after each element
|
99
|
+
# puts test_case[0]
|
100
|
+
# puts test_case[1]
|
101
|
+
puts
|
102
|
+
end
|
103
|
+
puts
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
# end # if defined?(::MiniTest)
|
108
|
+
|
109
|
+
end # def pending(description = "", &block)
|
110
|
+
|
111
|
+
end # unless defined?(Spec)
|
112
|
+
|
113
|
+
end # module Pending
|
114
|
+
end # module Testing
|
115
|
+
end # module ActiveSupport
|
@@ -0,0 +1,203 @@
|
|
1
|
+
module CommonLib::ActiveSupportExtension::TestCase
|
2
|
+
|
3
|
+
def self.included(base)
|
4
|
+
# basically to include the model_name method to the CLASS
|
5
|
+
base.extend ActiveModel::Naming
|
6
|
+
base.extend(ClassMethods)
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
#
|
11
|
+
# this used to be called st_model_name, which I think
|
12
|
+
# was short for simply_testable_model_name. Of course,
|
13
|
+
# I left no description
|
14
|
+
#
|
15
|
+
def model_name_without_test
|
16
|
+
self.name.demodulize.sub(/Test$/,'')
|
17
|
+
end
|
18
|
+
|
19
|
+
def assert_should_act_as_list(*args)
|
20
|
+
options = args.extract_options!
|
21
|
+
scope = options[:scope]
|
22
|
+
|
23
|
+
test "#{brand}should act as list" do
|
24
|
+
object = create_object
|
25
|
+
first_position = object.position
|
26
|
+
assert first_position > 0
|
27
|
+
attrs = {}
|
28
|
+
Array(scope).each do |attr|
|
29
|
+
attrs[attr.to_sym] = object.send(attr)
|
30
|
+
end if scope
|
31
|
+
object = create_object(attrs)
|
32
|
+
assert_equal ( first_position + 1 ), object.position
|
33
|
+
object = create_object(attrs)
|
34
|
+
assert_equal ( first_position + 2 ), object.position
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
#
|
40
|
+
#
|
41
|
+
# What? No assert_requires_absence method???
|
42
|
+
# Its usually conditional so would be pretty pointless
|
43
|
+
#
|
44
|
+
|
45
|
+
def assert_requires_past_date(*attr_names)
|
46
|
+
options = { :allow_today => true }
|
47
|
+
options.update(attr_names.extract_options!)
|
48
|
+
model = options[:model] || model_name_without_test
|
49
|
+
|
50
|
+
attr_names.each do |attr_name|
|
51
|
+
if options[:allow_today]
|
52
|
+
test "#{brand}should allow #{attr_name} to be today" do
|
53
|
+
object = model.constantize.new
|
54
|
+
object.send("#{attr_name}=", Date.current)
|
55
|
+
object.valid? # could be, but probably isn't
|
56
|
+
assert !object.errors.matching?(attr_name,
|
57
|
+
'is in the future and must be in the past'),
|
58
|
+
"Expected #{attr_name}:is NOT not a past date, but only got " <<
|
59
|
+
object.errors.full_messages.to_sentence
|
60
|
+
end
|
61
|
+
else
|
62
|
+
test "#{brand}should NOT allow #{attr_name} to be today" do
|
63
|
+
object = model.constantize.new
|
64
|
+
object.send("#{attr_name}=", Date.current)
|
65
|
+
assert !object.valid?
|
66
|
+
assert object.errors.matching?(attr_name,
|
67
|
+
'is in the future and must be in the past'),
|
68
|
+
"Expected #{attr_name}:is not a past date, but only got " <<
|
69
|
+
object.errors.full_messages.to_sentence
|
70
|
+
end
|
71
|
+
end
|
72
|
+
test "#{brand}should require Date #{attr_name} be in the past" do
|
73
|
+
object = model.constantize.new
|
74
|
+
object.send("#{attr_name}=", Date.yesterday)
|
75
|
+
object.valid? # could be, but probably isn't
|
76
|
+
assert !object.errors.matching?(attr_name,
|
77
|
+
'is in the future and must be in the past'),
|
78
|
+
"Expected #{attr_name}:is NOT not a past date, but only got " <<
|
79
|
+
object.errors.full_messages.to_sentence
|
80
|
+
|
81
|
+
object = model.constantize.new
|
82
|
+
object.send("#{attr_name}=", Date.tomorrow)
|
83
|
+
assert !object.valid?
|
84
|
+
assert object.errors.matching?(attr_name,
|
85
|
+
'is in the future and must be in the past'),
|
86
|
+
"Expected #{attr_name}:is not a past date, but only got " <<
|
87
|
+
object.errors.full_messages.to_sentence
|
88
|
+
end
|
89
|
+
# doesn't seem to actually compare as a DateTime
|
90
|
+
test "#{brand}should require DateTime #{attr_name} be in the past" do
|
91
|
+
object = model.constantize.new
|
92
|
+
object.send("#{attr_name}=", (DateTime.current - 1.day))
|
93
|
+
object.valid? # could be, but probably isn't
|
94
|
+
assert !object.errors.matching?(attr_name,
|
95
|
+
'is in the future and must be in the past'),
|
96
|
+
"Expected #{attr_name}:is NOT not a past date, but only got " <<
|
97
|
+
object.errors.full_messages.to_sentence
|
98
|
+
|
99
|
+
object = model.constantize.new
|
100
|
+
object.send("#{attr_name}=", (DateTime.current + 1.day))
|
101
|
+
assert !object.valid?
|
102
|
+
assert object.errors.matching?(attr_name,
|
103
|
+
'is in the future and must be in the past'),
|
104
|
+
"Expected #{attr_name}:is not a past date, but only got " <<
|
105
|
+
object.errors.full_messages.to_sentence
|
106
|
+
end
|
107
|
+
test "#{brand}should require ActiveSupport::TimeWithZone #{attr_name} be in the past" do
|
108
|
+
object = model.constantize.new
|
109
|
+
object.send("#{attr_name}=", (Time.zone.now - 1.day))
|
110
|
+
object.valid? # could be, but probably isn't
|
111
|
+
assert !object.errors.matching?(attr_name,
|
112
|
+
'is in the future and must be in the past'),
|
113
|
+
"Expected #{attr_name}:is NOT not a past date, but only got " <<
|
114
|
+
object.errors.full_messages.to_sentence
|
115
|
+
|
116
|
+
object = model.constantize.new
|
117
|
+
object.send("#{attr_name}=", (Time.zone.now + 1.day))
|
118
|
+
assert !object.valid?
|
119
|
+
assert object.errors.matching?(attr_name,
|
120
|
+
'is in the future and must be in the past'),
|
121
|
+
"Expected #{attr_name}:is not a past date, but only got " <<
|
122
|
+
object.errors.full_messages.to_sentence
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
|
128
|
+
def assert_requires_complete_date(*attr_names)
|
129
|
+
options = attr_names.extract_options!
|
130
|
+
model = options[:model] || model_name_without_test
|
131
|
+
|
132
|
+
attr_names.each do |attr_name|
|
133
|
+
test "#{brand}should require a complete date for #{attr_name}" do
|
134
|
+
object = model.constantize.new
|
135
|
+
object.send("#{attr_name}=", "Sept 11, 2001")
|
136
|
+
object.valid? # could be, but probably isn't
|
137
|
+
assert !object.errors.matching?(attr_name,'is not a complete date'),
|
138
|
+
"Expected #{attr_name}:is NOT not a complete date, but only got " <<
|
139
|
+
object.errors.full_messages.to_sentence
|
140
|
+
|
141
|
+
object = model.constantize.new
|
142
|
+
object.send("#{attr_name}=", "Sept 2001")
|
143
|
+
assert !object.valid?
|
144
|
+
assert object.errors.matching?(attr_name,'is not a complete date'),
|
145
|
+
"Expected #{attr_name}:is not a complete date, but only got " <<
|
146
|
+
object.errors.full_messages.to_sentence
|
147
|
+
|
148
|
+
object = model.constantize.new
|
149
|
+
object.send("#{attr_name}=", "9/2001")
|
150
|
+
assert !object.valid?
|
151
|
+
assert object.errors.matching?(attr_name,'is not a complete date')
|
152
|
+
"Expected #{attr_name}:is not a complete date, but only got " <<
|
153
|
+
object.errors.full_messages.to_sentence
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
end
|
159
|
+
|
160
|
+
|
161
|
+
at_exit {
|
162
|
+
puts Dir.pwd()
|
163
|
+
puts Time.now
|
164
|
+
}
|
165
|
+
|
166
|
+
# basically a copy of assert_difference, but
|
167
|
+
# without any explicit comparison as it is
|
168
|
+
# simply stating that something will change
|
169
|
+
# (designed for updated_at)
|
170
|
+
def assert_changes(expression, message = nil, &block)
|
171
|
+
b = block.send(:binding)
|
172
|
+
exps = Array.wrap(expression)
|
173
|
+
before = exps.map { |e| eval(e, b) }
|
174
|
+
yield
|
175
|
+
exps.each_with_index do |e, i|
|
176
|
+
error = "#{e.inspect} didn't change"
|
177
|
+
error = "#{message}.\n#{error}" if message
|
178
|
+
assert_not_equal(before[i], eval(e, b), error)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
# Just a negation of assert_changes
|
183
|
+
def deny_changes(expression, message = nil, &block)
|
184
|
+
b = block.send(:binding)
|
185
|
+
exps = Array.wrap(expression)
|
186
|
+
before = exps.map { |e| eval(e, b) }
|
187
|
+
yield
|
188
|
+
exps.each_with_index do |e, i|
|
189
|
+
error = "#{e.inspect} changed"
|
190
|
+
error = "#{message}.\n#{error}" if message
|
191
|
+
assert_equal(before[i], eval(e, b), error)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
def turn_off_paperclip_logging
|
196
|
+
# Is there I way to silence the paperclip output? Yes...
|
197
|
+
Paperclip.options[:log] = false
|
198
|
+
# Is there I way to capture the paperclip output for comparison? Don't know.
|
199
|
+
end
|
200
|
+
|
201
|
+
end # ActiveSupportExtension::TestCase
|
202
|
+
ActiveSupport::TestCase.send(:include, CommonLib::ActiveSupportExtension::TestCase)
|
203
|
+
__END__
|
@@ -0,0 +1,48 @@
|
|
1
|
+
#
|
2
|
+
# copied from Paperclip
|
3
|
+
# I'm not real sure what most of this is for
|
4
|
+
# All I want is to share my rake tasks.
|
5
|
+
# I would be nice to share my locales as well
|
6
|
+
#
|
7
|
+
module CommonLib
|
8
|
+
require 'rails'
|
9
|
+
|
10
|
+
class Railtie < Rails::Railtie
|
11
|
+
# initializer 'paperclip.insert_into_active_record' do |app|
|
12
|
+
# ActiveSupport.on_load :active_record do
|
13
|
+
# Paperclip::Railtie.insert
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# if app.config.respond_to?(:paperclip_defaults)
|
17
|
+
# Paperclip::Attachment.default_options.merge!(app.config.paperclip_defaults)
|
18
|
+
# end
|
19
|
+
# end
|
20
|
+
|
21
|
+
rake_tasks {
|
22
|
+
#
|
23
|
+
# Use caution. This would load the files in the app's lib/tasks/
|
24
|
+
# Not sure if that was in addition to the gem, or instead of, but
|
25
|
+
# it loaded them twice so they ran twice.
|
26
|
+
#
|
27
|
+
# load "tasks/common_lib.rake"
|
28
|
+
# load "tasks/csv.rake"
|
29
|
+
# load "tasks/database.rake"
|
30
|
+
|
31
|
+
|
32
|
+
Dir["#{File.dirname(__FILE__)}/../tasks/**/*.rake"].sort.each { |ext| load ext }
|
33
|
+
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
# class Railtie
|
38
|
+
# def self.insert
|
39
|
+
# Paperclip.options[:logger] = Rails.logger
|
40
|
+
#
|
41
|
+
# if defined?(ActiveRecord)
|
42
|
+
# Paperclip.options[:logger] = ActiveRecord::Base.logger
|
43
|
+
# ActiveRecord::Base.send(:include, Paperclip::Glue)
|
44
|
+
# end
|
45
|
+
# end
|
46
|
+
# end
|
47
|
+
end
|
48
|
+
|
@@ -0,0 +1,8 @@
|
|
1
|
+
require "common_lib/ruby/array"
|
2
|
+
require "common_lib/ruby/fixnum"
|
3
|
+
require "common_lib/ruby/hash"
|
4
|
+
require "common_lib/ruby/integer"
|
5
|
+
require "common_lib/ruby/nil_class"
|
6
|
+
require "common_lib/ruby/numeric"
|
7
|
+
require "common_lib/ruby/object"
|
8
|
+
require "common_lib/ruby/string"
|
@@ -0,0 +1,128 @@
|
|
1
|
+
module CommonLib::Array# :nodoc:
|
2
|
+
|
3
|
+
# ['a','b','c'].arrange([2,0,1]) => ['c','a','b']
|
4
|
+
def arrange(new_array_index=[])
|
5
|
+
new_array = self.dup
|
6
|
+
new_array_index.each_with_index do |index,new_index|
|
7
|
+
new_array[new_index] = self[index]
|
8
|
+
end
|
9
|
+
new_array
|
10
|
+
end
|
11
|
+
|
12
|
+
# Remove all "blank?" items for the array
|
13
|
+
def drop_blanks!
|
14
|
+
delete_if{|a|a.blank?}
|
15
|
+
end
|
16
|
+
|
17
|
+
# Return capitlized versions of each item in the array
|
18
|
+
def capitalize
|
19
|
+
collect(&:capitalize)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Capitalize each item in the array and return it
|
23
|
+
def capitalize!
|
24
|
+
each_with_index do |element,index|
|
25
|
+
self[index] = element.capitalize
|
26
|
+
end
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
# Return downcased versions of each item in the array
|
31
|
+
def downcase
|
32
|
+
collect(&:downcase)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Return the average digitized value of the array
|
36
|
+
def average
|
37
|
+
if self.length > 0
|
38
|
+
# sum defined in activesupport/lib/active_support/core_ext/enumerable.rb
|
39
|
+
self.digitize.sum.to_f / self.length
|
40
|
+
else
|
41
|
+
nil
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# Return the median digitized value of the array
|
46
|
+
def median
|
47
|
+
if self.length > 0
|
48
|
+
sorted_values = self.digitize.sort
|
49
|
+
length = sorted_values.length
|
50
|
+
if length.odd?
|
51
|
+
sorted_values[length/2]
|
52
|
+
else
|
53
|
+
( sorted_values[length/2] + sorted_values[-1+length/2] ).to_f / 2
|
54
|
+
end
|
55
|
+
else
|
56
|
+
nil
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# Return a copy of the array with values at the
|
61
|
+
# given indexes swapped.
|
62
|
+
def swap_indexes(i,j)
|
63
|
+
new_array = self.dup
|
64
|
+
new_array[i],new_array[j] = self[j],self[i]
|
65
|
+
new_array
|
66
|
+
end
|
67
|
+
|
68
|
+
# Swap the values of an array at the given indexes
|
69
|
+
# and return it
|
70
|
+
def swap_indexes!(i,j)
|
71
|
+
self[i],self[j] = self[j],self[i]
|
72
|
+
self
|
73
|
+
end
|
74
|
+
|
75
|
+
# Convert all items in the array to_f
|
76
|
+
def numericize
|
77
|
+
collect(&:to_f)
|
78
|
+
end
|
79
|
+
alias_method :digitize, :numericize
|
80
|
+
|
81
|
+
# def first_index(value = nil) # either way works
|
82
|
+
|
83
|
+
# return the first index of the array
|
84
|
+
# with a value matching that given
|
85
|
+
def first_index(value = nil, &block)
|
86
|
+
using_block = block_given?
|
87
|
+
each_with_index do |element,index|
|
88
|
+
return index if (using_block && yield(element)) || (value == element)
|
89
|
+
end
|
90
|
+
return nil
|
91
|
+
end
|
92
|
+
|
93
|
+
def to_boolean
|
94
|
+
!empty? && all?{|v| v.to_boolean }
|
95
|
+
end
|
96
|
+
# alias_method :true?, :to_boolean
|
97
|
+
alias_method :to_b, :to_boolean
|
98
|
+
|
99
|
+
# [].true?
|
100
|
+
# => false
|
101
|
+
# [true].true?
|
102
|
+
# => true
|
103
|
+
# [true,false].true?
|
104
|
+
# => true
|
105
|
+
# [false].true?
|
106
|
+
# => false
|
107
|
+
def true?
|
108
|
+
!empty? && any?{|v| v.true? }
|
109
|
+
end
|
110
|
+
|
111
|
+
def false?
|
112
|
+
!empty? && any?{|v| v.false? }
|
113
|
+
end
|
114
|
+
|
115
|
+
# I need to work on this one ...
|
116
|
+
def true_xor_false?
|
117
|
+
# self.include?('true') ^ self.include?('false') ^
|
118
|
+
# self.include?(true) ^ self.include?(false)
|
119
|
+
contains_true = contains_false = false
|
120
|
+
each {|v|
|
121
|
+
# ( v.to_boolean ) ? contains_true = true : contains_false = true
|
122
|
+
eval("contains_#{v.to_boolean}=true")
|
123
|
+
}
|
124
|
+
contains_true ^ contains_false
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
Array.send(:include, CommonLib::Array )
|