libraries 0.0.1 → 0.0.2
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/.gitignore +3 -0
- data/Gemfile +4 -1
- data/Gemfile.lock +26 -0
- data/Rakefile +10 -0
- data/lib/libraries.rb +6 -2
- data/lib/libraries/active_record.rb +43 -0
- data/lib/libraries/array.rb +17 -0
- data/lib/libraries/enumerable.rb +15 -0
- data/lib/libraries/hash.rb +73 -0
- data/lib/libraries/object.rb +9 -0
- data/lib/libraries/string.rb +32 -0
- data/lib/libraries/version.rb +1 -1
- data/lib/rails.rb +2 -0
- data/spec/libraries/array_spec.rb +35 -0
- data/spec/libraries/hash_spec.rb +146 -0
- data/spec/libraries/object_spec.rb +22 -0
- data/spec/libraries/string_spec.rb +50 -0
- data/spec/spec_helper.rb +1 -0
- metadata +18 -4
data/.gitignore
ADDED
data/Gemfile
CHANGED
data/Gemfile.lock
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
libraries (0.0.1)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: http://rubygems.org/
|
8
|
+
specs:
|
9
|
+
diff-lcs (1.1.2)
|
10
|
+
rspec (2.0.1)
|
11
|
+
rspec-core (~> 2.0.1)
|
12
|
+
rspec-expectations (~> 2.0.1)
|
13
|
+
rspec-mocks (~> 2.0.1)
|
14
|
+
rspec-core (2.0.1)
|
15
|
+
rspec-expectations (2.0.1)
|
16
|
+
diff-lcs (>= 1.1.2)
|
17
|
+
rspec-mocks (2.0.1)
|
18
|
+
rspec-core (~> 2.0.1)
|
19
|
+
rspec-expectations (~> 2.0.1)
|
20
|
+
|
21
|
+
PLATFORMS
|
22
|
+
ruby
|
23
|
+
|
24
|
+
DEPENDENCIES
|
25
|
+
libraries!
|
26
|
+
rspec
|
data/Rakefile
CHANGED
data/lib/libraries.rb
CHANGED
@@ -0,0 +1,43 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
|
3
|
+
class Base
|
4
|
+
before_save(:_clean_whitespace)
|
5
|
+
|
6
|
+
def _clean_whitespace
|
7
|
+
self.attributes.each_pair do |key, value|
|
8
|
+
if value && value.respond_to?('strip')
|
9
|
+
self[key] = value.strip
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_hash(*fields)
|
15
|
+
h = attributes.symbolize_keys
|
16
|
+
fields.present? ? h.slice(*fields.flatten) : h
|
17
|
+
end
|
18
|
+
|
19
|
+
class << self
|
20
|
+
def conditions(*args)
|
21
|
+
scoped :conditions => args
|
22
|
+
end
|
23
|
+
|
24
|
+
def date_range(options)
|
25
|
+
options.reverse_merge! :field => "created_at", :end => Time.now
|
26
|
+
scoped :conditions => { options[:field] => options[:range] || options[:start]..options[:end] }
|
27
|
+
end
|
28
|
+
|
29
|
+
def sort_scope(options)
|
30
|
+
scoped :order => "#{options[:attribute]} #{options[:direction]}"
|
31
|
+
end
|
32
|
+
|
33
|
+
def random(_limit=1)
|
34
|
+
scoped :order => "RAND()", :limit => _limit
|
35
|
+
end
|
36
|
+
|
37
|
+
def limit(_limit)
|
38
|
+
scoped :limit => _limit
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class Array
|
2
|
+
|
3
|
+
def each_pair
|
4
|
+
self.in_groups_of(2).each { |g| yield g.first, g.last }
|
5
|
+
end
|
6
|
+
|
7
|
+
# delete all passed element and return the array after delete
|
8
|
+
def delete!(*args)
|
9
|
+
self.tap { |a| a.delete_if { |e| args.include? e } }
|
10
|
+
end
|
11
|
+
|
12
|
+
# same as delete! but does not alter self
|
13
|
+
def without(*args)
|
14
|
+
self.dup.tap { |dup| dup.delete!(*args) }
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Enumerable
|
2
|
+
|
3
|
+
# Call the given block for each element, creating a new hash
|
4
|
+
# that uses the element as the key and the block's result as the value.
|
5
|
+
def map_into_hash &block
|
6
|
+
# The "reduce(:concat)" does a shallow flatten, so that blocks that
|
7
|
+
# return arrays will do the Right Thing.
|
8
|
+
Hash[*map {|x| [x, block.call(x)]}.inject([], &:concat)]
|
9
|
+
end
|
10
|
+
|
11
|
+
def map_keyvals_into_hash &block
|
12
|
+
Hash[*map(&block).inject([], &:concat)]
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
class Hash
|
2
|
+
|
3
|
+
def recursive_symbolize_keys!
|
4
|
+
symbolize_keys!
|
5
|
+
# symbolize each hash in .values
|
6
|
+
values.each{|h| h.recursive_symbolize_keys! if h.is_a?(Hash) }
|
7
|
+
# symbolize each hash inside an array in .values
|
8
|
+
values.select{|v| v.is_a?(Array) }.flatten.each{|h| h.recursive_symbolize_keys! if h.is_a?(Hash) }
|
9
|
+
self
|
10
|
+
end
|
11
|
+
|
12
|
+
# deep lookup a nested hash without failing on non-existing keys
|
13
|
+
# in which case returns and empty hash
|
14
|
+
# This will only work on NESTED hashes, something like:
|
15
|
+
# h = {:a => {:b => {:c => 3}}}
|
16
|
+
# h.lookup(:a,:b,:c) => 3
|
17
|
+
# h.lookup(:a,:b) => {:c => 3}
|
18
|
+
# h.lookup(:a,:b,:X) => nil
|
19
|
+
# h.lookup(:a,:X,:Y) => nil
|
20
|
+
# h.lookup(:W,:T,:F) => nil
|
21
|
+
def nested_lookup(*keys)
|
22
|
+
keys.inject(self){ |h,k| (h || {}).fetch(k,nil) } rescue nil
|
23
|
+
end
|
24
|
+
|
25
|
+
# Takes a hash argument of old, new pairs
|
26
|
+
# Returns hash with keys renamed
|
27
|
+
def rename_keys!(keys_hash)
|
28
|
+
keys_hash.each do |old, new|
|
29
|
+
self[new] = self.delete(old)
|
30
|
+
end
|
31
|
+
self
|
32
|
+
end
|
33
|
+
|
34
|
+
def rename_keys(keys_hash)
|
35
|
+
self.dup.rename_keys!(keys_hash)
|
36
|
+
end
|
37
|
+
|
38
|
+
# map from a block
|
39
|
+
def map_into_hash(&block)
|
40
|
+
Hash[*map {|x| [x[0], block.call(x)]}.inject([], &:concat)]
|
41
|
+
end
|
42
|
+
|
43
|
+
def parent_to?(*args)
|
44
|
+
return self.slice(*args.first.keys) == args.first if args.size == 1 && args.first.is_a?(Hash)
|
45
|
+
args.each_pair do |key, value|
|
46
|
+
return false unless self[key].to_s == value.to_s
|
47
|
+
end
|
48
|
+
true
|
49
|
+
end
|
50
|
+
|
51
|
+
############################################################
|
52
|
+
# The following methods take as an argument, a list of keys
|
53
|
+
# See the specs for examples
|
54
|
+
|
55
|
+
def all_keys?(*keys)
|
56
|
+
keys.all? {|k| has_key? k}
|
57
|
+
end
|
58
|
+
|
59
|
+
def any_key?(*keys)
|
60
|
+
keys.any? {|k| has_key? k}
|
61
|
+
end
|
62
|
+
|
63
|
+
def all_values?(*keys)
|
64
|
+
keys.all?{|k| self[k].present?}
|
65
|
+
end
|
66
|
+
|
67
|
+
def any_value?(*keys)
|
68
|
+
keys.any?{|k| self[k].present?}
|
69
|
+
end
|
70
|
+
|
71
|
+
############################################################
|
72
|
+
|
73
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class String
|
2
|
+
|
3
|
+
def strip_with_arg_support!(char=nil)
|
4
|
+
if char.present?
|
5
|
+
m = char.each_char.inject('') {|r,c| r+=(c =~ /[\*\.\[\]\^\$\?\\\|\=\+\:\/\(\)]/ ? "\\" : "") + c}
|
6
|
+
self.gsub!(/^[#{m}]*(.*?)[#{m}]*$/,'\1')
|
7
|
+
else
|
8
|
+
strip_without_arg_support!
|
9
|
+
end
|
10
|
+
end
|
11
|
+
alias_method_chain :strip!, :arg_support
|
12
|
+
|
13
|
+
def strip_with_arg_support(char=nil)
|
14
|
+
char.present? ? self.dup.strip!(char) : strip_without_arg_support
|
15
|
+
end
|
16
|
+
alias_method_chain :strip, :arg_support
|
17
|
+
|
18
|
+
# In the sense of normal characters only, it also downcases the string
|
19
|
+
# Can be used, for example, in file names and css classes
|
20
|
+
def normalize!
|
21
|
+
return if normalize.blank?
|
22
|
+
self.gsub!(/[^A-Z0-9]/i, '_')
|
23
|
+
self.squeeze!("_")
|
24
|
+
self.strip!("_")
|
25
|
+
self.downcase!
|
26
|
+
end
|
27
|
+
|
28
|
+
def normalize
|
29
|
+
self.gsub(/[^A-Z0-9]/i, '_').squeeze("_").strip("_").downcase
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
data/lib/libraries/version.rb
CHANGED
data/lib/rails.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Array do
|
4
|
+
|
5
|
+
describe "#each_pair" do
|
6
|
+
it "yeilds pairs" do
|
7
|
+
out = ''
|
8
|
+
[1,2,3,4].each_pair { |a1,a2| out << "*#{a1}#{a2}*" }
|
9
|
+
out.should == "*12**34*"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#delete!" do
|
14
|
+
it "accepts one argument and returns the array after delete" do
|
15
|
+
[1,:a,3.14,"x"].delete!(1).should == [:a,3.14,"x"]
|
16
|
+
end
|
17
|
+
it "accepts a list of arguments and returns the array after delete" do
|
18
|
+
[1,:a,3.14,"x"].delete!(1, "x").should == [:a,3.14]
|
19
|
+
end
|
20
|
+
it "modifies receiver" do
|
21
|
+
a = [1,2,3]
|
22
|
+
a.delete!(2,3)
|
23
|
+
a.should == [1]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "#without" do
|
28
|
+
it "does not modify receiver" do
|
29
|
+
a = [1,2,3]
|
30
|
+
a.without(2,3).should == [1]
|
31
|
+
a.should == [1,2,3]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,146 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hash do
|
4
|
+
|
5
|
+
let(:names) { {:first => 'Homer', :mi => '', :last => 'Simpson', "A" => true} }
|
6
|
+
let(:numbers) { {:b => "0", "c" => 1} }
|
7
|
+
|
8
|
+
describe "#parent_to?" do
|
9
|
+
it "returns true for existing slices" do
|
10
|
+
names.should be_parent_to(:first => "Homer", :last => "Simpson")
|
11
|
+
names.should be_parent_to(:first => "Homer")
|
12
|
+
end
|
13
|
+
it "returns false for non existing slices" do
|
14
|
+
names.should_not be_parent_to(:first => "Bart", :last => "Simpson")
|
15
|
+
names.should_not be_parent_to(:first => "Bart")
|
16
|
+
end
|
17
|
+
it "supports key, value pairs" do
|
18
|
+
names.should be_parent_to(:first, "Homer")
|
19
|
+
names.should be_parent_to(:first, "Homer", :last, "Simpson")
|
20
|
+
names.should_not be_parent_to(:first, "Bart")
|
21
|
+
names.should_not be_parent_to(:first, "Bart", :last, "Simpson")
|
22
|
+
end
|
23
|
+
it "considers string integers with the key, value pairs call" do
|
24
|
+
numbers.should be_parent_to(:b, 0)
|
25
|
+
numbers.should_not be_parent_to(:b => 0)
|
26
|
+
numbers.should be_parent_to("c", "1")
|
27
|
+
numbers.should_not be_parent_to("c" => "1")
|
28
|
+
numbers.should be_parent_to(:b, 0, "c", "1")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#all_keys?" do
|
33
|
+
it "returns true when all keys are there" do
|
34
|
+
names.all_keys?(:first, :last).should be
|
35
|
+
end
|
36
|
+
it "returns false if one keys is not there" do
|
37
|
+
names.all_keys?(:first, :title).should_not be
|
38
|
+
end
|
39
|
+
it "returns false if all keys are not there" do
|
40
|
+
names.all_keys?(:title, :other).should_not be
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "#any_key?" do
|
45
|
+
it "returns true when any keys is there" do
|
46
|
+
names.any_key?(:first, :title).should be
|
47
|
+
end
|
48
|
+
it "returns true if all keys are there" do
|
49
|
+
names.any_key?(:first, :last).should be
|
50
|
+
end
|
51
|
+
it "returns false if all keys are not there" do
|
52
|
+
names.any_key?(:title, :other).should_not be
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "#any_values?" do
|
57
|
+
it 'returns true if one key has a value' do
|
58
|
+
names.any_value?(:first, :others).should be
|
59
|
+
end
|
60
|
+
it "returns false if all keys don't exist or don't have values" do
|
61
|
+
names.any_value?(:others, :mi).should_not be
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "#all_values?" do
|
66
|
+
it 'returns true if all key have values' do
|
67
|
+
names.all_values?(:first, :last).should be
|
68
|
+
end
|
69
|
+
it "returns false if one keys doesn't exist or doesn't have value" do
|
70
|
+
names.all_values?(:others, :mi).should_not be
|
71
|
+
names.all_values?(:others, :last).should_not be
|
72
|
+
names.all_values?(:mi, :last).should_not be
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe "#recursive_symbolize_keys!" do
|
77
|
+
let(:hash) {
|
78
|
+
{"name" => "names", "value" => names, "value_in_array" => [names] }
|
79
|
+
}
|
80
|
+
before do
|
81
|
+
hash.recursive_symbolize_keys!
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'symobolizes keys' do
|
85
|
+
hash.keys.should =~ [:name, :value, :value_in_array]
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'symbolizes keys in sub hashes' do
|
89
|
+
hash[:value].keys.should =~ [:first, :mi, :last, :A]
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'symbolizes keys in hashes inside sub arrays' do
|
93
|
+
hash[:value_in_array].first.keys.should =~ [:first, :mi, :last, :A]
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "#nested_lookup" do
|
98
|
+
let(:hash) { {:a => {:b => {:c => 3}}}}
|
99
|
+
it "returns nil for non existing keys" do
|
100
|
+
hash.nested_lookup(:X).should be_nil
|
101
|
+
end
|
102
|
+
it "returns nil for non existing nested keys" do
|
103
|
+
hash.nested_lookup(:X, 1, "F").should be_nil
|
104
|
+
end
|
105
|
+
it "returns nil for non existing keys after valid keys" do
|
106
|
+
hash.nested_lookup(:a,:b,:X).should be_nil
|
107
|
+
hash.nested_lookup(:a,:X,:Y).should be_nil
|
108
|
+
end
|
109
|
+
it "returns hash value for partial lookup" do
|
110
|
+
hash.nested_lookup(:a, :b).should == {:c => 3}
|
111
|
+
end
|
112
|
+
it "returns value for valid lookup" do
|
113
|
+
hash.nested_lookup(:a,:b,:c).should == 3
|
114
|
+
end
|
115
|
+
it "returns nil for lookups that goes beyond valid ones" do
|
116
|
+
hash.nested_lookup(:a,:b,:c,:d).should be_nil
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
describe "#rename_keys" do
|
121
|
+
let(:source_hash) { {:a => "Symbol", 1 => "Integer", -1 => 100, "a" => "Text"} }
|
122
|
+
let(:renamed_hash) { source_hash.rename_keys(:a => :b, 1 => 2, -1 => -2, "a" => "b") }
|
123
|
+
|
124
|
+
it "renames symbol key" do
|
125
|
+
renamed_hash[:b].should == "Symbol"
|
126
|
+
end
|
127
|
+
it "renames integer key" do
|
128
|
+
renamed_hash[2].should == "Integer"
|
129
|
+
end
|
130
|
+
it "renames text key" do
|
131
|
+
renamed_hash["b"].should == "Text"
|
132
|
+
end
|
133
|
+
it "doesn't care about value type" do
|
134
|
+
renamed_hash[-2].should == 100
|
135
|
+
end
|
136
|
+
it "does not modify the source hash" do
|
137
|
+
source_hash[:a].should == "Symbol"
|
138
|
+
source_hash[:b].should_not be
|
139
|
+
end
|
140
|
+
it "supports a bang version" do
|
141
|
+
source_hash.rename_keys! :a => :b, 1 => 2, -1 => -2, "a" => "b"
|
142
|
+
source_hash.should == {:b => "Symbol", 2 => "Integer", -2 => 100, "b" => "Text"}
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Object do
|
4
|
+
|
5
|
+
describe "#m" do
|
6
|
+
it "returns receiver methods" do
|
7
|
+
"".m.should include("downcase")
|
8
|
+
end
|
9
|
+
it "does not include Object methods" do
|
10
|
+
"".m.should_not include(Object.methods)
|
11
|
+
end
|
12
|
+
it "retruns sorted output" do
|
13
|
+
"".m.should == "".m.sort
|
14
|
+
end
|
15
|
+
it "accepts a regexp and returns only method matching it" do
|
16
|
+
boolean_methods = "".m /\?$/
|
17
|
+
boolean_methods.should include("all?", "one?")
|
18
|
+
boolean_methods.should_not include("downcase")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe String do
|
4
|
+
|
5
|
+
describe "#strip" do
|
6
|
+
it "accepts an argument and strips it from both ends of reciever" do
|
7
|
+
"**COOL**".strip("*").should == "COOL"
|
8
|
+
"^COOL^".strip("^").should == "COOL"
|
9
|
+
end
|
10
|
+
|
11
|
+
it "supports more than one character" do
|
12
|
+
"((((((((COOL))))))))))".strip("()").should == "COOL"
|
13
|
+
"((((((((COOL))))))))))".strip("()").should == "COOL"
|
14
|
+
end
|
15
|
+
|
16
|
+
it "supports normal and special characters" do
|
17
|
+
"!!@$()#^^COOLxxyyzzz".strip("!@$()#^xyz").should == "COOL"
|
18
|
+
end
|
19
|
+
|
20
|
+
it "has a bang version" do
|
21
|
+
a = "!!@$()#^^COOLxxyyzzz"
|
22
|
+
a.strip!("!@$()#^xyz")
|
23
|
+
a.should == "COOL"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "#normalize" do
|
28
|
+
it "strips anyting but A-Z and 0-9, squeezes and underscores" do
|
29
|
+
"** 10:10 (That's _IT_, I'm *OuT*)".normalize.should == "10_10_that_s_it_i_m_out"
|
30
|
+
end
|
31
|
+
|
32
|
+
it "has a bang version" do
|
33
|
+
a = "** 10:10 (That's _IT_, I'm *OuT*)"
|
34
|
+
a.normalize!
|
35
|
+
a.should == "10_10_that_s_it_i_m_out"
|
36
|
+
end
|
37
|
+
|
38
|
+
it "returns empty string, but does not alter reveiver if no A-Z|0-9 exist" do
|
39
|
+
a = "**%^^$%^#%*("
|
40
|
+
a.normalize.should == ""
|
41
|
+
a.normalize!.should_not be
|
42
|
+
a.should == "**%^^$%^#%*("
|
43
|
+
end
|
44
|
+
|
45
|
+
it "keeps normal letters, including repeated letters" do
|
46
|
+
"buzzz".normalize.should == "buzzz"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'libraries')
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: libraries
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 27
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 2
|
10
|
+
version: 0.0.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- On-Site.com
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-11-01 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -29,11 +29,25 @@ extensions: []
|
|
29
29
|
extra_rdoc_files: []
|
30
30
|
|
31
31
|
files:
|
32
|
+
- .gitignore
|
32
33
|
- Gemfile
|
34
|
+
- Gemfile.lock
|
33
35
|
- Rakefile
|
34
36
|
- lib/libraries.rb
|
37
|
+
- lib/libraries/active_record.rb
|
38
|
+
- lib/libraries/array.rb
|
39
|
+
- lib/libraries/enumerable.rb
|
40
|
+
- lib/libraries/hash.rb
|
41
|
+
- lib/libraries/object.rb
|
42
|
+
- lib/libraries/string.rb
|
35
43
|
- lib/libraries/version.rb
|
44
|
+
- lib/rails.rb
|
36
45
|
- libraries.gemspec
|
46
|
+
- spec/libraries/array_spec.rb
|
47
|
+
- spec/libraries/hash_spec.rb
|
48
|
+
- spec/libraries/object_spec.rb
|
49
|
+
- spec/libraries/string_spec.rb
|
50
|
+
- spec/spec_helper.rb
|
37
51
|
has_rdoc: true
|
38
52
|
homepage: http://rubygems.org/gems/libraries
|
39
53
|
licenses: []
|