ruby_core_extensions 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +4 -0
- data/.rspec +2 -0
- data/.travis.yml +14 -0
- data/Gemfile +2 -0
- data/LICENSE +21 -0
- data/README.md +37 -0
- data/Rakefile +12 -0
- data/gemfiles/rails3.gemfile +11 -0
- data/gemfiles/rails4.gemfile +11 -0
- data/lib/ruby_core_extensions.rb +20 -0
- data/lib/ruby_core_extensions/array.rb +50 -0
- data/lib/ruby_core_extensions/class.rb +8 -0
- data/lib/ruby_core_extensions/compact.rb +2 -0
- data/lib/ruby_core_extensions/compact/array.rb +20 -0
- data/lib/ruby_core_extensions/compact/hash.rb +34 -0
- data/lib/ruby_core_extensions/enumerable.rb +39 -0
- data/lib/ruby_core_extensions/file.rb +12 -0
- data/lib/ruby_core_extensions/hash.rb +34 -0
- data/lib/ruby_core_extensions/kernel.rb +11 -0
- data/lib/ruby_core_extensions/numeric.rb +7 -0
- data/lib/ruby_core_extensions/object.rb +72 -0
- data/lib/ruby_core_extensions/recursive.rb +8 -0
- data/lib/ruby_core_extensions/recursive/array.rb +45 -0
- data/lib/ruby_core_extensions/recursive/big_decimal.rb +5 -0
- data/lib/ruby_core_extensions/recursive/date.rb +8 -0
- data/lib/ruby_core_extensions/recursive/date_time.rb +8 -0
- data/lib/ruby_core_extensions/recursive/fixnum.rb +7 -0
- data/lib/ruby_core_extensions/recursive/hash.rb +86 -0
- data/lib/ruby_core_extensions/recursive/object.rb +17 -0
- data/lib/ruby_core_extensions/recursive/time.rb +8 -0
- data/lib/ruby_core_extensions/string.rb +78 -0
- data/lib/ruby_core_extensions/version.rb +3 -0
- data/ruby_core_extensions.gemspec +32 -0
- data/spec/array_spec.rb +67 -0
- data/spec/class_spec.rb +12 -0
- data/spec/compact_spec.rb +49 -0
- data/spec/enumerable_spec.rb +24 -0
- data/spec/filename_spec.rb +17 -0
- data/spec/hash_spec.rb +107 -0
- data/spec/numeric_spec.rb +12 -0
- data/spec/object_spec.rb +58 -0
- data/spec/spec_helper.rb +17 -0
- data/spec/string_spec.rb +62 -0
- data/spec/support/coverage.rb +29 -0
- metadata +225 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 73d409278a49f15845c54d39663e24a0942bd004
|
4
|
+
data.tar.gz: 61a669479de59c7b8e9105d674cc44d28824151a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: addb261d51cdd07ced187a5efefa83d474d712875133108585a255be62168add46445b532a7816292466110c8766720394f91012c2b38db2e584a70830b700de
|
7
|
+
data.tar.gz: 3e37676250b767f9d97808b353e25e187c386de97f99ec457ff8a6823a7c25fbb8c74195e3488e0ed367de7db71aabb5b18ed9e600d10b558b5d839a908cbe47
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
language: ruby
|
2
|
+
rvm:
|
3
|
+
- 2.3.0
|
4
|
+
script: bundle exec rake spec
|
5
|
+
gemfile:
|
6
|
+
- gemfiles/rails3.gemfile
|
7
|
+
- gemfiles/rails4.gemfile
|
8
|
+
notifications:
|
9
|
+
email:
|
10
|
+
- support@travellink.com.au
|
11
|
+
flowdock:
|
12
|
+
secure: IK3CyMRa++LNdooemZJBZSNdwUiKpVdXZUz9exYIkj3La/EJDOy+kqV2NzYdqRht2BGHHiRsVn3hVqySDDuv9jxBHTZgM0v/pQ4kT8JZqi7fDb36axf3M6Y2VJyrJ0S/9BbHqLE95B4NXQ30ctLCSfQNbp9sOn2EwP3DZS9KJks=
|
13
|
+
sudo: false
|
14
|
+
cache: bundler
|
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License
|
2
|
+
|
3
|
+
Copyright (c) Tom Preston-Werner
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
Ruby Core Extensions
|
2
|
+
====================
|
3
|
+
|
4
|
+
[![Build Status](https://travis-ci.org/sealink/ruby_core_extensions.png?branch=master)](https://travis-ci.org/sealink/ruby_core_extensions)
|
5
|
+
[![Coverage Status](https://coveralls.io/repos/sealink/ruby_core_extensions/badge.png)](https://coveralls.io/r/sealink/ruby_core_extensions)
|
6
|
+
[![Dependency Status](https://gemnasium.com/sealink/ruby_core_extensions.png?travis)](https://gemnasium.com/sealink/ruby_core_extensions)
|
7
|
+
[![Code Climate](https://codeclimate.com/github/sealink/ruby_core_extensions.png)](https://codeclimate.com/github/sealink/ruby_core_extensions)
|
8
|
+
|
9
|
+
# DESCRIPTION
|
10
|
+
|
11
|
+
Extends the core ruby classes with helpful functions
|
12
|
+
|
13
|
+
# INSTALLATION
|
14
|
+
|
15
|
+
Add to your Gemfile:
|
16
|
+
gem 'ruby_core_extensions'
|
17
|
+
|
18
|
+
# Extensions
|
19
|
+
|
20
|
+
The following classes are extend in this gem:
|
21
|
+
|
22
|
+
* Array
|
23
|
+
* BigDecimal
|
24
|
+
* Class
|
25
|
+
* Date
|
26
|
+
* DateTime
|
27
|
+
* Enumerable
|
28
|
+
* File
|
29
|
+
* Fixnum
|
30
|
+
* Hash
|
31
|
+
* Kernel
|
32
|
+
* Numeric
|
33
|
+
* Object
|
34
|
+
* Range
|
35
|
+
* String
|
36
|
+
* Time
|
37
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
|
3
|
+
desc 'Default: run specs.'
|
4
|
+
task :default => :spec
|
5
|
+
|
6
|
+
require 'rspec/core/rake_task'
|
7
|
+
|
8
|
+
desc "Run specs"
|
9
|
+
RSpec::Core::RakeTask.new do |t|
|
10
|
+
t.pattern = "./spec/**/*_spec.rb" # don't need this, it's default.
|
11
|
+
# Put spec opts in a file named .rspec in root
|
12
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module RubyCoreExtensions
|
2
|
+
require 'active_support/version'
|
3
|
+
if ActiveSupport::VERSION::MAJOR > 2
|
4
|
+
require 'active_support/dependencies/autoload'
|
5
|
+
end
|
6
|
+
require 'active_support/core_ext'
|
7
|
+
|
8
|
+
require 'ruby_core_extensions/array'
|
9
|
+
require 'ruby_core_extensions/class'
|
10
|
+
require 'ruby_core_extensions/enumerable'
|
11
|
+
require 'ruby_core_extensions/file'
|
12
|
+
require 'ruby_core_extensions/hash'
|
13
|
+
require 'ruby_core_extensions/kernel'
|
14
|
+
require 'ruby_core_extensions/numeric'
|
15
|
+
require 'ruby_core_extensions/object'
|
16
|
+
require 'ruby_core_extensions/string'
|
17
|
+
|
18
|
+
require 'ruby_core_extensions/compact'
|
19
|
+
require 'ruby_core_extensions/recursive'
|
20
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
class Array
|
2
|
+
|
3
|
+
def to_param
|
4
|
+
self.collect { |element| element.respond_to?(:to_param) ? element.to_param : element }
|
5
|
+
end
|
6
|
+
|
7
|
+
def show_name
|
8
|
+
first.titleize
|
9
|
+
end
|
10
|
+
|
11
|
+
# Key should be unique, or latest element with that key will override previous ones.
|
12
|
+
def hash_by(key = nil, method = nil, &block)
|
13
|
+
self.inject({}) do |h, element|
|
14
|
+
if key
|
15
|
+
h[element.send(key)] = if block_given?
|
16
|
+
yield(element)
|
17
|
+
elsif method
|
18
|
+
element.send(method)
|
19
|
+
else
|
20
|
+
element
|
21
|
+
end
|
22
|
+
else # key is block and value is element
|
23
|
+
h[yield(element)] = element
|
24
|
+
end
|
25
|
+
h
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def hash_by_id(method = nil, &block)
|
30
|
+
hash_by(:id, method, &block)
|
31
|
+
end
|
32
|
+
|
33
|
+
def intersects?(other)
|
34
|
+
self.any?{|i| other.include?(i)}
|
35
|
+
end
|
36
|
+
|
37
|
+
# Same effect as Array.wrap(object).first
|
38
|
+
# but no need to create new object in case of non-array
|
39
|
+
def self.first(object)
|
40
|
+
return object.first if object.is_a?(Array)
|
41
|
+
object
|
42
|
+
end
|
43
|
+
|
44
|
+
# Same effect as Array.wrap(object).last
|
45
|
+
# but no need to create new object in case of non-array
|
46
|
+
def self.last(object)
|
47
|
+
return object.last if object.is_a?(Array)
|
48
|
+
object
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class Array
|
2
|
+
def compact_blank!
|
3
|
+
delete_if{|v| v.blank?}
|
4
|
+
end
|
5
|
+
|
6
|
+
def recursive_compact_blank!
|
7
|
+
delete_if do |v|
|
8
|
+
if v.is_a?(Hash)
|
9
|
+
v.recursive_compact_blank!
|
10
|
+
v.recursive_blank?
|
11
|
+
elsif v.is_a?(Array)
|
12
|
+
v.recursive_compact_blank!
|
13
|
+
v.recursive_blank?
|
14
|
+
else
|
15
|
+
v.blank?
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
@@ -0,0 +1,34 @@
|
|
1
|
+
class Hash
|
2
|
+
# Remove nil values
|
3
|
+
def compact
|
4
|
+
self.dup.compact!
|
5
|
+
end
|
6
|
+
|
7
|
+
# Remove nil values - !desctructively!
|
8
|
+
def compact!
|
9
|
+
delete_if{|k,v| v.nil?}
|
10
|
+
end
|
11
|
+
|
12
|
+
def compact_blank
|
13
|
+
self.dup.compact_blank!
|
14
|
+
end
|
15
|
+
|
16
|
+
def compact_blank!
|
17
|
+
delete_if{|k,v| v.blank?}
|
18
|
+
end
|
19
|
+
|
20
|
+
def recursive_compact_blank!
|
21
|
+
delete_if do |k,v|
|
22
|
+
if v.is_a?(Hash)
|
23
|
+
v.recursive_compact_blank!
|
24
|
+
v.recursive_blank?
|
25
|
+
elsif v.is_a?(Array)
|
26
|
+
v.recursive_compact_blank!
|
27
|
+
v.recursive_blank?
|
28
|
+
else
|
29
|
+
v.blank?
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Enumerable
|
2
|
+
|
3
|
+
def map_methods(*methods)
|
4
|
+
map do |object|
|
5
|
+
methods.inject({}) do |h, method|
|
6
|
+
h[method] = object.send(method)
|
7
|
+
h
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
def detect_and_return
|
14
|
+
detect do |e|
|
15
|
+
result = yield(e)
|
16
|
+
return result if result
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
def select_by_attr(attr, value)
|
22
|
+
select do |e|
|
23
|
+
e.send(attr) == value
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
if RUBY_VERSION < '1.9'
|
29
|
+
def with_object(obj, &block)
|
30
|
+
return to_enum :with_object, obj unless block_given?
|
31
|
+
each do |element|
|
32
|
+
yield element, obj
|
33
|
+
end
|
34
|
+
obj
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class File
|
2
|
+
# http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_276
|
3
|
+
SAFE_CHARS = /[^a-zA-Z0-9._\-]/
|
4
|
+
|
5
|
+
def self.safe_name(name)
|
6
|
+
name.gsub('&', 'and'). # prittify & to and
|
7
|
+
gsub(/\s/, '-'). # replace spaces with dashes
|
8
|
+
gsub(SAFE_CHARS, '-'). # replace with portable characters
|
9
|
+
gsub(/\-+/, '-') # limit - character to once
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
@@ -0,0 +1,34 @@
|
|
1
|
+
class Hash
|
2
|
+
|
3
|
+
unless self.method_defined?(:extract!)
|
4
|
+
#Imported from Rails 3
|
5
|
+
def extract!(*keys)
|
6
|
+
result = {}
|
7
|
+
keys.each { |key| result[key] = delete(key) }
|
8
|
+
result
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
def map_key_value(key_method, value_method = nil)
|
14
|
+
value_method ||= key_method
|
15
|
+
each.with_object({}) do |(k,v), new_hash|
|
16
|
+
new_hash[k.send(key_method)] = v.send(value_method)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
def map_key(method)
|
22
|
+
each.with_object({}) do |(k,v), new_hash|
|
23
|
+
new_hash[k.send(method)] = v
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
def map_value(method)
|
29
|
+
each.with_object({}) do |(k,v), new_hash|
|
30
|
+
new_hash[k] = v.send(method)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
class Object
|
2
|
+
# Does this object sound like another - phonetically?
|
3
|
+
def sounds_like?(other)
|
4
|
+
self.phonetic_code == other.phonetic_code
|
5
|
+
end
|
6
|
+
|
7
|
+
# Convert this object into a string, then convert that to phonetic code
|
8
|
+
def phonetic_code
|
9
|
+
self.to_s.phonetic_code
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_long_s
|
13
|
+
to_s
|
14
|
+
end
|
15
|
+
|
16
|
+
def virtual_belongs_to(*associations)
|
17
|
+
options = associations.extract_options!
|
18
|
+
|
19
|
+
for association in associations
|
20
|
+
class_eval <<-EVAL
|
21
|
+
attr_accessor :#{association}, :#{association}_id
|
22
|
+
|
23
|
+
def #{association}=(#{association})
|
24
|
+
@#{association}_id = #{association}.id if #{association}
|
25
|
+
@#{association} = #{association}
|
26
|
+
end
|
27
|
+
|
28
|
+
def #{association}_id=(#{association}_id)
|
29
|
+
@#{association} = nil
|
30
|
+
@#{association}_id = #{association}_id
|
31
|
+
end
|
32
|
+
|
33
|
+
def #{association}
|
34
|
+
@#{association} ||= #{(options[:class_name] || association.to_s).classify}.find_by_id(@#{association}_id)
|
35
|
+
end
|
36
|
+
|
37
|
+
def #{association}_id
|
38
|
+
@#{association}.id if #{association}
|
39
|
+
end
|
40
|
+
EVAL
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
def booleanize(name, options)
|
46
|
+
raise ArgumentError, ":rescue option is required" if options[:rescue].blank?
|
47
|
+
if !options[:rescue].is_a?(Array)
|
48
|
+
options[:rescue] = [options[:rescue]]
|
49
|
+
end
|
50
|
+
|
51
|
+
normal_name = name.to_s.gsub('!', '')
|
52
|
+
|
53
|
+
class_eval <<-EVAL
|
54
|
+
attr_accessor :reason_not_#{normal_name}
|
55
|
+
def #{normal_name}?(*args)
|
56
|
+
#{name}(*args)
|
57
|
+
@reason_not_#{normal_name} = nil
|
58
|
+
true
|
59
|
+
rescue #{options[:rescue].map(&:to_s).join(', ')} => e
|
60
|
+
@reason_not_#{normal_name} = e.message
|
61
|
+
false
|
62
|
+
end
|
63
|
+
EVAL
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
def to_bool
|
68
|
+
self.to_s.to_bool
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|