ruby_ext 4.0.0 → 4.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +0 -1
- data/lib/rake_ext.rb +40 -3
- data/lib/rspec_ext.rb +8 -137
- data/lib/rspec_ext/code_coverage.rb +9 -0
- data/lib/rspec_ext/factory.rb +64 -0
- data/lib/rspec_ext/misc.rb +22 -0
- data/lib/rspec_ext/rspec.rb +106 -0
- data/lib/ruby_ext/core/array.rb +2 -0
- data/lib/ruby_ext/core/hash.rb +21 -2
- data/lib/ruby_ext/core/open_object.rb +0 -1
- data/readme.md +1 -3
- data/spec/core/hash_spec.rb +21 -0
- data/spec/more/must_spec.rb +2 -2
- data/spec/rspec_ext/factory_spec.rb +50 -0
- metadata +8 -2
data/Rakefile
CHANGED
data/lib/rake_ext.rb
CHANGED
@@ -96,7 +96,44 @@ end
|
|
96
96
|
#
|
97
97
|
# Docs
|
98
98
|
#
|
99
|
-
|
100
|
-
|
101
|
-
|
99
|
+
namespace :docs do
|
100
|
+
desc "Generate documentation"
|
101
|
+
task :generate do
|
102
|
+
%x(cd docs && rocco -o site *.rb)
|
103
|
+
end
|
104
|
+
|
105
|
+
desc "Publish documentation"
|
106
|
+
task :publish do
|
107
|
+
require 'open3'
|
108
|
+
require 'vfs'
|
109
|
+
|
110
|
+
executor = Class.new do
|
111
|
+
def run cmd, expectation = nil
|
112
|
+
stdin, stdout, stderr = Open3.popen3 cmd
|
113
|
+
stderr = stderr.read
|
114
|
+
stdout = stdout.read
|
115
|
+
|
116
|
+
if expectation and (stdout + stderr) !~ expectation
|
117
|
+
puts stdout
|
118
|
+
puts stderr
|
119
|
+
raise "can't execute '#{cmd}'!"
|
120
|
+
end
|
121
|
+
stdout
|
122
|
+
end
|
123
|
+
end.new
|
124
|
+
|
125
|
+
out = executor.run "git status", /nothing to commit .working directory clean/
|
126
|
+
|
127
|
+
'.'.to_dir.tmp do |tmp|
|
128
|
+
tmp.delete
|
129
|
+
"docs/site".to_dir.copy_to tmp['site']
|
130
|
+
|
131
|
+
executor.run "git checkout gh-pages", /Switched to branch 'gh-pages'/
|
132
|
+
tmp['site'].copy_to '.'.to_dir
|
133
|
+
executor.run "git add ."
|
134
|
+
executor.run "git commit -a -m 'upd docs'", /upd docs/
|
135
|
+
executor.run "git push", /gh-pages -> gh-pages/
|
136
|
+
executor.run "git checkout master", /Switched to branch 'master'/
|
137
|
+
end
|
138
|
+
end
|
102
139
|
end
|
data/lib/rspec_ext.rb
CHANGED
@@ -1,142 +1,13 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
#
|
4
|
-
# require 'simplecov'
|
5
|
-
# SimpleCov.start do
|
6
|
-
# add_filter "/spec/"
|
7
|
-
# end
|
8
|
-
# SimpleCov.at_exit do
|
9
|
-
# SimpleCov.result.format!
|
10
|
-
# Kernel.exec 'open ./coverage/index.html'
|
11
|
-
# end
|
12
|
-
#
|
13
|
-
# CLASS_LOADER_GENERATE_TMP_FILES = true
|
1
|
+
# Uncomment to enable code coverage tool.
|
2
|
+
# require 'rspec_ext/code_coverage'
|
14
3
|
|
15
4
|
require 'rspec'
|
16
|
-
require 'fileutils'
|
17
5
|
|
18
|
-
|
19
|
-
|
20
|
-
c.run_all_when_everything_filtered = true
|
21
|
-
end
|
6
|
+
require 'rspec_ext/rspec'
|
7
|
+
require 'rspec_ext/misc'
|
22
8
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
rspec do
|
29
|
-
def self.define_matcher *args, &block
|
30
|
-
RSpec::Matchers.define *args do |expected|
|
31
|
-
match do |actual|
|
32
|
-
block.call actual, expected if block
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
rspec do
|
39
|
-
def self.before_all &block
|
40
|
-
before :all, &block
|
41
|
-
end
|
42
|
-
|
43
|
-
def self.after_all &block
|
44
|
-
after :all, &block
|
45
|
-
end
|
46
|
-
|
47
|
-
def self.with_load_path *paths
|
48
|
-
before_all{paths.each{|path| $LOAD_PATH << path}}
|
49
|
-
after_all{paths.each{|path| $LOAD_PATH.delete path}}
|
50
|
-
end
|
51
|
-
|
52
|
-
def with_load_path *paths, &b
|
53
|
-
begin
|
54
|
-
paths.each{|path| $LOAD_PATH << path}
|
55
|
-
b.call
|
56
|
-
ensure
|
57
|
-
paths.each{|path| $LOAD_PATH.delete path}
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def self.with_tmp_spec_dir *args
|
62
|
-
options = args.last.is_a?(Hash) ? args.pop : {}
|
63
|
-
dir = args.first || self.spec_dir
|
64
|
-
|
65
|
-
options[:before] ||= :all
|
66
|
-
tmp_dir = "/tmp/#{dir.split('/').last}"
|
67
|
-
|
68
|
-
before options do
|
69
|
-
FileUtils.rm_r tmp_dir if File.exist? tmp_dir
|
70
|
-
FileUtils.cp_r dir, tmp_dir
|
71
|
-
@spec_dir = tmp_dir
|
72
|
-
end
|
73
|
-
|
74
|
-
after options do
|
75
|
-
FileUtils.rm_r tmp_dir if File.exist? tmp_dir
|
76
|
-
@spec_dir = nil
|
77
|
-
end
|
78
|
-
|
79
|
-
tmp_dir
|
80
|
-
end
|
81
|
-
|
82
|
-
def self.with_spec_dir dir
|
83
|
-
before_all{@spec_dir = dir}
|
84
|
-
after_all{@spec_dir = nil}
|
85
|
-
end
|
86
|
-
|
87
|
-
def self.spec_dir
|
88
|
-
self.calculate_default_spec_dir || raise(":spec_dir not defined!")
|
89
|
-
end
|
90
|
-
|
91
|
-
def spec_dir
|
92
|
-
@spec_dir || self.class.spec_dir
|
93
|
-
end
|
94
|
-
|
95
|
-
def self.calculate_default_spec_dir
|
96
|
-
spec_file_name = caller.find{|line| line =~ /_spec\.rb\:/}
|
97
|
-
return nil unless spec_file_name
|
98
|
-
spec_dir = spec_file_name.sub(/\.rb\:.*/, '')
|
99
|
-
raise "spec dir not exist (#{spec_dir})!" unless File.exist? spec_dir
|
100
|
-
spec_dir
|
101
|
-
end
|
102
|
-
|
103
|
-
def remove_constants *args
|
104
|
-
args = args.first if args.size == 1 and args.first.is_a?(Array)
|
105
|
-
args.each{|c| Object.send :remove_const, c if Object.const_defined? c}
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
|
110
|
-
class String
|
111
|
-
unless method_defined? :dirname
|
112
|
-
def dirname
|
113
|
-
File.expand_path(File.dirname(self))
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
def to_xhtml css = nil
|
118
|
-
require 'rspec_ext/nokogiri'
|
119
|
-
|
120
|
-
node = Nokogiri::HTML(self)
|
121
|
-
unless css
|
122
|
-
node
|
123
|
-
else
|
124
|
-
nodes = node.css(css)
|
125
|
-
raise "Elements for '#{css}' CSS query not found!" if nodes.size < 1
|
126
|
-
raise "Found more than one elment for '#{css}' CSS query!" if nodes.size > 1
|
127
|
-
nodes.first
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
# Stubbing every instances of class.
|
133
|
-
class Class
|
134
|
-
def instance_stub! &block
|
135
|
-
new_method = method :new
|
136
|
-
stub! :new do |*args|
|
137
|
-
instance = new_method.call *args
|
138
|
-
block.call instance
|
139
|
-
instance
|
140
|
-
end
|
141
|
-
end
|
9
|
+
# FactoryGirl replacement.
|
10
|
+
autoload :Factory, 'rspec_ext/factory'
|
11
|
+
def factory name = nil
|
12
|
+
name ? factory.build(name) : $factory ||= Factory.new
|
142
13
|
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# FactoryGirl replacement (because original FactoryGirl is bloated, and
|
2
|
+
# even more - it depends on activesupport, and this makes it too
|
3
|
+
# unconvinient to use in non-Rails environments).
|
4
|
+
|
5
|
+
class Factory
|
6
|
+
class Builder
|
7
|
+
attr_reader :name, :klass, :parent, :initializer
|
8
|
+
|
9
|
+
def initialize name, options = {}, &initializer
|
10
|
+
@initializer = initializer
|
11
|
+
@klass, @parent = options[:class], options[:parent]
|
12
|
+
unless klass or parent or initializer
|
13
|
+
raise "there are nor class nor initializer nor parent provided for :#{name}!"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def build attributes = {}, &block
|
18
|
+
if parent
|
19
|
+
o = factory.build parent
|
20
|
+
initializer.call o if initializer
|
21
|
+
elsif klass
|
22
|
+
real_class = self.klass.is_a?(String) ? self.klass.constantize : self.klass
|
23
|
+
o = real_class.new
|
24
|
+
initializer.call o if initializer
|
25
|
+
elsif initializer
|
26
|
+
o = initializer.call
|
27
|
+
end
|
28
|
+
|
29
|
+
attributes.each{|name, value| o.send :"#{name}=", value}
|
30
|
+
block.call o if block
|
31
|
+
|
32
|
+
o
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
attr_reader :registry, :counters
|
37
|
+
|
38
|
+
def initialize
|
39
|
+
@registry, @counters = {}, Hash.new(0)
|
40
|
+
end
|
41
|
+
|
42
|
+
def define name, options = {}, &initializer
|
43
|
+
raise "definition of :#{name} already exist!" if registry.include? name
|
44
|
+
registry[name] = Builder.new(name, options, &initializer)
|
45
|
+
end
|
46
|
+
|
47
|
+
def build name, attributes = {}, &block
|
48
|
+
builder = registry[name] || raise("no definition for :#{name}!")
|
49
|
+
builder.build attributes, &block
|
50
|
+
end
|
51
|
+
alias_method :[], :build
|
52
|
+
|
53
|
+
def create name, attributes = {}, &block
|
54
|
+
o = build name, attributes, &block
|
55
|
+
o.respond_to?(:save!) ? o.save! : o.save
|
56
|
+
o
|
57
|
+
end
|
58
|
+
|
59
|
+
def next name = :general
|
60
|
+
v = counters[name]
|
61
|
+
counters[name] += 1
|
62
|
+
v
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
String.class_eval do
|
2
|
+
unless method_defined? :dirname
|
3
|
+
def dirname
|
4
|
+
File.expand_path(File.dirname(self))
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
# Convert string to HTML node.
|
9
|
+
def to_xhtml css = nil
|
10
|
+
require 'rspec_ext/nokogiri'
|
11
|
+
|
12
|
+
node = Nokogiri::HTML(self)
|
13
|
+
unless css
|
14
|
+
node
|
15
|
+
else
|
16
|
+
nodes = node.css(css)
|
17
|
+
raise "Elements for '#{css}' CSS query not found!" if nodes.size < 1
|
18
|
+
raise "Found more than one elment for '#{css}' CSS query!" if nodes.size > 1
|
19
|
+
nodes.first
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
# Adding filtering specs with focus.
|
2
|
+
RSpec.configure do |c|
|
3
|
+
c.filter_run focus: true
|
4
|
+
c.run_all_when_everything_filtered = true
|
5
|
+
end
|
6
|
+
|
7
|
+
# Shortcut for extending RSpec.
|
8
|
+
def rspec &block
|
9
|
+
RSpec::Core::ExampleGroup.class_eval &block if block
|
10
|
+
return RSpec::Core::ExampleGroup
|
11
|
+
end
|
12
|
+
|
13
|
+
# Shortcut for defining matchers.
|
14
|
+
rspec do
|
15
|
+
def self.define_matcher *args, &block
|
16
|
+
RSpec::Matchers.define *args do |expected|
|
17
|
+
match do |actual|
|
18
|
+
block.call actual, expected if block
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
rspec do
|
25
|
+
def remove_constants *args
|
26
|
+
args = args.first if args.size == 1 and args.first.is_a?(Array)
|
27
|
+
args.each{|c| Object.send :remove_const, c if Object.const_defined? c}
|
28
|
+
end
|
29
|
+
|
30
|
+
# Before and after all shortcuts.
|
31
|
+
def self.before_all █ before :all, &block end
|
32
|
+
def self.after_all █ after :all, &block end
|
33
|
+
|
34
|
+
# Helpers for working with $LOAD_PATH.
|
35
|
+
def self.with_load_path *paths
|
36
|
+
before_all{paths.each{|path| $LOAD_PATH << path}}
|
37
|
+
after_all{paths.each{|path| $LOAD_PATH.delete path}}
|
38
|
+
end
|
39
|
+
def with_load_path *paths, &b
|
40
|
+
begin
|
41
|
+
paths.each{|path| $LOAD_PATH << path}
|
42
|
+
b.call
|
43
|
+
ensure
|
44
|
+
paths.each{|path| $LOAD_PATH.delete path}
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Helpers for working with spec directories and temp directories.
|
49
|
+
|
50
|
+
def self.with_tmp_spec_dir *args
|
51
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
52
|
+
dir = args.first || self.spec_dir
|
53
|
+
|
54
|
+
options[:before] ||= :all
|
55
|
+
tmp_dir = "/tmp/#{dir.split('/').last}"
|
56
|
+
|
57
|
+
before options do
|
58
|
+
require 'fileutils'
|
59
|
+
|
60
|
+
FileUtils.rm_r tmp_dir if File.exist? tmp_dir
|
61
|
+
FileUtils.cp_r dir, tmp_dir
|
62
|
+
@spec_dir = tmp_dir
|
63
|
+
end
|
64
|
+
|
65
|
+
after options do
|
66
|
+
FileUtils.rm_r tmp_dir if File.exist? tmp_dir
|
67
|
+
@spec_dir = nil
|
68
|
+
end
|
69
|
+
|
70
|
+
tmp_dir
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.with_spec_dir dir
|
74
|
+
before_all{@spec_dir = dir}
|
75
|
+
after_all{@spec_dir = nil}
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.spec_dir
|
79
|
+
self.calculate_default_spec_dir || raise(":spec_dir not defined!")
|
80
|
+
end
|
81
|
+
|
82
|
+
def spec_dir
|
83
|
+
@spec_dir || self.class.spec_dir
|
84
|
+
end
|
85
|
+
|
86
|
+
protected
|
87
|
+
def self.calculate_default_spec_dir
|
88
|
+
spec_file_name = caller.find{|line| line =~ /_spec\.rb\:/}
|
89
|
+
return nil unless spec_file_name
|
90
|
+
spec_dir = spec_file_name.sub(/\.rb\:.*/, '')
|
91
|
+
raise "spec dir not exist (#{spec_dir})!" unless File.exist? spec_dir
|
92
|
+
spec_dir
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
# Stubbing every instances of class.
|
97
|
+
class Class
|
98
|
+
def after_instantiate &block
|
99
|
+
new_method = method :new
|
100
|
+
stub! :new do |*args|
|
101
|
+
instance = new_method.call *args
|
102
|
+
block.call instance
|
103
|
+
instance
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
data/lib/ruby_ext/core/array.rb
CHANGED
data/lib/ruby_ext/core/hash.rb
CHANGED
@@ -38,8 +38,6 @@ Hash.class_eval do
|
|
38
38
|
|
39
39
|
alias_method :blank?, :empty?
|
40
40
|
|
41
|
-
alias_method :to_h, :to_hash
|
42
|
-
|
43
41
|
# OpenObject.
|
44
42
|
|
45
43
|
def to_openobject deep = false
|
@@ -53,4 +51,25 @@ Hash.class_eval do
|
|
53
51
|
other == self if other.is_a? OpenObject
|
54
52
|
eql_without_oo other
|
55
53
|
end
|
54
|
+
|
55
|
+
class << self
|
56
|
+
def symbolize obj
|
57
|
+
convert_keys obj, :to_sym
|
58
|
+
end
|
59
|
+
|
60
|
+
def stringify obj
|
61
|
+
convert_keys obj, :to_s
|
62
|
+
end
|
63
|
+
|
64
|
+
protected
|
65
|
+
def convert_keys obj, method
|
66
|
+
if obj.is_a? Hash
|
67
|
+
{}.tap{|h| obj.each{|k, v| h[k.send(method)] = convert_keys v, method}}
|
68
|
+
elsif obj.is_a? Array
|
69
|
+
obj.collect{|v| convert_keys v, method}
|
70
|
+
else
|
71
|
+
obj
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
56
75
|
end
|
data/readme.md
CHANGED
@@ -1,8 +1,6 @@
|
|
1
|
-
Collection of various utility classes and standard library extensions for Ruby language.
|
2
|
-
|
3
1
|
## must - assertion tool, kind of RSpec assertions in runtime code
|
4
2
|
|
5
|
-
Expectations are generated dynamically, so it will be also available and have the same form
|
3
|
+
Expectations are generated dynamically, so it will be also available and have the same form
|
6
4
|
for any of Your custom methods.
|
7
5
|
|
8
6
|
It also doesn't pollute core Ruby classes very much, there are only 2 methods `must`, `must_not` added to
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe 'Hash' do
|
4
|
+
it 'should symbolize hashes in arbitrary objects' do
|
5
|
+
as_string = {
|
6
|
+
'a' => 'a',
|
7
|
+
'b' => {
|
8
|
+
'a' => [{'a' => 'a'}]
|
9
|
+
}
|
10
|
+
}
|
11
|
+
as_symbol = {
|
12
|
+
a: 'a',
|
13
|
+
b: {
|
14
|
+
a: [{a: 'a'}]
|
15
|
+
}
|
16
|
+
}
|
17
|
+
|
18
|
+
Hash.symbolize(as_string).should == as_symbol
|
19
|
+
Hash.stringify(as_symbol).should == as_string
|
20
|
+
end
|
21
|
+
end
|
data/spec/more/must_spec.rb
CHANGED
@@ -41,8 +41,8 @@ describe 'Assert' do
|
|
41
41
|
[].must.be_empty.should == []
|
42
42
|
end
|
43
43
|
|
44
|
-
it "have"
|
44
|
+
it "have" do
|
45
45
|
[1, 2, 3].must_not.have_any{|v| v == 4}
|
46
|
-
-> {[1, 2, 3].must_not.have_any{|v| v == 2}}.should raise_error(/
|
46
|
+
-> {[1, 2, 3].must_not.have_any{|v| v == 2}}.should raise_error(/must not have any/m)
|
47
47
|
end
|
48
48
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "factory" do
|
4
|
+
before do
|
5
|
+
factory.registry.clear
|
6
|
+
factory.counters.clear
|
7
|
+
end
|
8
|
+
after{remove_constants :User}
|
9
|
+
|
10
|
+
it "basic" do
|
11
|
+
factory.define :user, class: 'OpenObject' do |u|
|
12
|
+
u.name = 'an_user'
|
13
|
+
end
|
14
|
+
|
15
|
+
factory.build(:user, password: 'abc'){|u| u.roles = %w(user)}.should ==
|
16
|
+
{name: 'an_user', password: 'abc', roles: %w(user)}.to_openobject
|
17
|
+
end
|
18
|
+
|
19
|
+
it "parent" do
|
20
|
+
factory.define :user, class: 'OpenObject' do |u|
|
21
|
+
u.name = 'an_user'
|
22
|
+
end
|
23
|
+
|
24
|
+
factory.define :manager, parent: :user do |u|
|
25
|
+
u.name = 'a_manager'
|
26
|
+
end
|
27
|
+
|
28
|
+
factory.build(:manager, password: 'abc'){|u| u.roles = %w(manager)}.should ==
|
29
|
+
{name: 'a_manager', password: 'abc', roles: %w(manager)}.to_openobject
|
30
|
+
end
|
31
|
+
|
32
|
+
it "create" do
|
33
|
+
stub = self.stub
|
34
|
+
factory.define :user, class: stub
|
35
|
+
factory.define :manager, parent: :user
|
36
|
+
|
37
|
+
stub.should_receive(:new).once.and_return stub
|
38
|
+
stub.should_receive(:save!).once
|
39
|
+
factory.create :manager
|
40
|
+
end
|
41
|
+
|
42
|
+
it "input validations" do
|
43
|
+
-> {factory.define :user}.should raise_error(/provided for :user/)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "counters" do
|
47
|
+
factory.next(:id).should == 0
|
48
|
+
factory.next(:id).should == 1
|
49
|
+
end
|
50
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_ext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0.
|
4
|
+
version: 4.0.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-11-
|
12
|
+
date: 2011-11-19 00:00:00.000000000Z
|
13
13
|
dependencies: []
|
14
14
|
description:
|
15
15
|
email:
|
@@ -21,7 +21,11 @@ files:
|
|
21
21
|
- readme.md
|
22
22
|
- lib/rake_ext/project.rb
|
23
23
|
- lib/rake_ext.rb
|
24
|
+
- lib/rspec_ext/code_coverage.rb
|
25
|
+
- lib/rspec_ext/factory.rb
|
26
|
+
- lib/rspec_ext/misc.rb
|
24
27
|
- lib/rspec_ext/nokogiri.rb
|
28
|
+
- lib/rspec_ext/rspec.rb
|
25
29
|
- lib/rspec_ext.rb
|
26
30
|
- lib/ruby_ext/core/array.rb
|
27
31
|
- lib/ruby_ext/core/basic_object.rb
|
@@ -54,6 +58,7 @@ files:
|
|
54
58
|
- spec/core/array_spec.rb
|
55
59
|
- spec/core/deep_clone_spec.rb
|
56
60
|
- spec/core/enumerable.rb
|
61
|
+
- spec/core/hash_spec.rb
|
57
62
|
- spec/core/module_spec.rb
|
58
63
|
- spec/core/multiple_inheritance_spec.rb
|
59
64
|
- spec/core/object_spec.rb
|
@@ -63,6 +68,7 @@ files:
|
|
63
68
|
- spec/more/must_spec.rb
|
64
69
|
- spec/more/observable_spec.rb
|
65
70
|
- spec/more/open_constructor_spec.rb
|
71
|
+
- spec/rspec_ext/factory_spec.rb
|
66
72
|
- spec/spec_helper.rb
|
67
73
|
homepage: http://github.com/alexeypetrushin/ruby_ext
|
68
74
|
licenses: []
|