ccls-common_lib 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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 )
|