ruby_ext 0.4.11 → 0.4.12
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +6 -6
- data/lib/rake_ext.rb +10 -5
- data/lib/rake_ext/project.rb +31 -16
- data/lib/rspec_ext.rb +82 -19
- data/lib/ruby_ext.rb +1 -52
- data/lib/ruby_ext/core.rb +24 -0
- data/lib/ruby_ext/{array.rb → core/array.rb} +4 -2
- data/lib/ruby_ext/core/basic_object.rb +8 -0
- data/lib/ruby_ext/core/class.rb +0 -0
- data/lib/ruby_ext/{deep_clone.rb → core/deep_clone.rb} +3 -4
- data/lib/ruby_ext/core/enumerable.rb +17 -0
- data/lib/ruby_ext/{file.rb → core/file.rb} +5 -2
- data/lib/ruby_ext/core/hash.rb +23 -0
- data/lib/ruby_ext/{kernel.rb → core/kernel.rb} +0 -0
- data/lib/ruby_ext/{micelaneous.rb → core/micelaneous.rb} +0 -0
- data/lib/ruby_ext/{module.rb → core/module.rb} +13 -2
- data/lib/ruby_ext/{multiple_inheritance.rb → core/multiple_inheritance.rb} +30 -14
- data/lib/ruby_ext/{must.rb → core/must.rb} +30 -27
- data/lib/ruby_ext/{not_defined.rb → core/not_defined.rb} +0 -0
- data/lib/ruby_ext/{object.rb → core/object.rb} +0 -0
- data/lib/ruby_ext/{open_object.rb → core/open_object.rb} +21 -16
- data/lib/ruby_ext/{string.rb → core/string.rb} +27 -0
- data/lib/ruby_ext/{symbol.rb → core/symbol.rb} +0 -0
- data/lib/ruby_ext/fixes.rb +6 -0
- data/lib/ruby_ext/gems.rb +0 -1
- data/lib/ruby_ext/more.rb +11 -0
- data/lib/ruby_ext/more/declarative_cache.rb +96 -0
- data/lib/ruby_ext/more/micelaneous.rb +7 -0
- data/lib/ruby_ext/{observable2.rb → more/observable2.rb} +0 -0
- data/lib/ruby_ext/{open_constructor.rb → more/open_constructor.rb} +2 -2
- data/lib/ruby_ext/more/safe_hash.rb +214 -0
- data/lib/ruby_ext/{synchronize.rb → more/synchronize.rb} +5 -5
- data/lib/ruby_ext/{tuple.rb → more/tuple.rb} +0 -0
- data/lib/yaml_fix.rb +9 -0
- data/readme.md +46 -42
- data/spec/core/array_spec.rb +7 -0
- data/spec/{deep_clone_spec.rb → core/deep_clone_spec.rb} +2 -3
- data/spec/core/enumerable.rb +9 -0
- data/spec/{kernel_spec.rb → core/kernel_spec.rb} +4 -6
- data/spec/{kernel_spec → core/kernel_spec}/TheNamespace/ClassA.rb +0 -0
- data/spec/{kernel_spec → core/kernel_spec}/another_class.rb +0 -0
- data/spec/{kernel_spec → core/kernel_spec}/the_namespace/class_b.rb +0 -0
- data/spec/{module_spec.rb → core/module_spec.rb} +2 -4
- data/spec/{multiple_inheritance_spec.rb → core/multiple_inheritance_spec.rb} +28 -12
- data/spec/core/must_spec.rb +32 -0
- data/spec/{open_object_spec.rb → core/open_object_spec.rb} +6 -7
- data/spec/core/spec_helper.rb +2 -0
- data/spec/{declarative_cache_spec.rb → more/declarative_cache_spec.rb} +35 -8
- data/spec/{observable2_spec.rb → more/observable2_spec.rb} +3 -4
- data/spec/{open_constructor_spec.rb → more/open_constructor_spec.rb} +6 -7
- data/spec/more/safe_hash_spec.rb +133 -0
- data/spec/more/spec_helper.rb +2 -0
- data/spec/{synchronize_spec.rb → more/synchronize_spec.rb} +2 -3
- metadata +67 -100
- data/lib/ruby_ext/basic_object.rb +0 -22
- data/lib/ruby_ext/class.rb +0 -11
- data/lib/ruby_ext/declarative_cache.rb +0 -85
- data/lib/ruby_ext/extra_blank_slate.rb +0 -17
- data/lib/ruby_ext/hash.rb +0 -15
- data/lib/ruby_ext/prepare_arguments.rb +0 -105
- data/lib/ruby_ext/prototype_inheritance.rb +0 -110
- data/lib/ruby_ext/should.rb +0 -166
- data/lib/rubyopt.rb +0 -7
- data/spec/_prototype_inheritance_spec.rb +0 -190
- data/spec/array_spec.rb +0 -8
- data/spec/must_spec.rb +0 -29
- data/spec/prepare_arguments_spec.rb +0 -46
- data/spec/should_spec.rb +0 -24
- data/spec/spec_helper.rb +0 -19
data/Rakefile
CHANGED
@@ -1,13 +1,13 @@
|
|
1
|
-
lib_dir = File.expand_path(File.dirname(__FILE__))
|
1
|
+
lib_dir = "#{File.expand_path(File.dirname(__FILE__))}/lib"
|
2
2
|
$LOAD_PATH << lib_dir unless $LOAD_PATH.include? lib_dir
|
3
3
|
|
4
4
|
require 'rake_ext'
|
5
5
|
|
6
6
|
project(
|
7
|
-
:
|
8
|
-
:
|
9
|
-
:
|
7
|
+
name: "ruby_ext",
|
8
|
+
version: "0.4.12",
|
9
|
+
summary: "Ruby Extensions",
|
10
10
|
|
11
|
-
:
|
12
|
-
:
|
11
|
+
author: "Alexey Petrushin",
|
12
|
+
homepage: "http://github.com/alexeypetrushin/ruby_ext"
|
13
13
|
)
|
data/lib/rake_ext.rb
CHANGED
@@ -6,7 +6,7 @@ require 'fileutils'
|
|
6
6
|
#
|
7
7
|
begin
|
8
8
|
require 'rspec/core/rake_task'
|
9
|
-
task :
|
9
|
+
task default: :spec
|
10
10
|
|
11
11
|
RSpec::Core::RakeTask.new('spec') do |t|
|
12
12
|
t.pattern = "spec/**/[^_]*_spec.rb"
|
@@ -16,7 +16,7 @@ begin
|
|
16
16
|
|
17
17
|
desc "Run RSpec code exapmples in isolated mode (every spec file in another Ruby process)"
|
18
18
|
task :isolated do
|
19
|
-
Dir.glob("spec
|
19
|
+
Dir.glob("spec/[^_]**/[^_]*_spec.rb").each do |spec_file|
|
20
20
|
Kernel.system "rspec #{spec_file}"
|
21
21
|
end
|
22
22
|
end
|
@@ -32,7 +32,7 @@ end
|
|
32
32
|
#
|
33
33
|
PROJECT_DIR = (
|
34
34
|
caller.find{|line| line =~ /\/Rakefile\:/} ||
|
35
|
-
raise("You can include the ''
|
35
|
+
raise("You can include the 'rake_ext' only in Rakefile!")
|
36
36
|
).sub(/\/Rakefile\:.*/, '')
|
37
37
|
def project_dir
|
38
38
|
PROJECT_DIR
|
@@ -40,7 +40,7 @@ end
|
|
40
40
|
|
41
41
|
|
42
42
|
#
|
43
|
-
# before
|
43
|
+
# before, after and remove task
|
44
44
|
#
|
45
45
|
def before task_name, &block
|
46
46
|
@task_counter ||= {}
|
@@ -57,6 +57,11 @@ def after task_name, &block
|
|
57
57
|
task task_name, &block
|
58
58
|
end
|
59
59
|
|
60
|
+
def remove_task(task_name)
|
61
|
+
Rake.application.instance_variable_get('@tasks').delete(task_name.to_s)
|
62
|
+
end
|
63
|
+
alias :delete_task :remove_task
|
64
|
+
|
60
65
|
|
61
66
|
#
|
62
67
|
# project
|
@@ -67,7 +72,7 @@ def project options = nil
|
|
67
72
|
options.each{|k, v| @options[k.to_sym] = v}
|
68
73
|
|
69
74
|
@options[:name] || raise("project name not defined")
|
70
|
-
@options[:
|
75
|
+
@options[:official_name] ||= @options[:name]
|
71
76
|
|
72
77
|
require 'rake_ext/project'
|
73
78
|
end
|
data/lib/rake_ext/project.rb
CHANGED
@@ -2,8 +2,9 @@
|
|
2
2
|
# parse_dependencies_for
|
3
3
|
#
|
4
4
|
def parse_project_gemfile
|
5
|
-
required_gems = []
|
5
|
+
required_gems, required_fake_gems = [], []
|
6
6
|
gem_file = "#{project_dir}/lib/#{project[:name]}/gems.rb"
|
7
|
+
|
7
8
|
if File.exist? gem_file
|
8
9
|
# puts "Parsing gemfile #{gem_file}"
|
9
10
|
|
@@ -11,10 +12,12 @@ def parse_project_gemfile
|
|
11
12
|
|
12
13
|
stub_class = Class.new
|
13
14
|
stub_class.send(:define_method, :gem){|*args| required_gems << args}
|
14
|
-
|
15
|
+
stub_class.send(:define_method, :fake_gem){|*args| required_fake_gems << args}
|
16
|
+
stub = stub_class.new
|
15
17
|
stub.instance_eval code, __FILE__, __LINE__
|
16
18
|
end
|
17
|
-
|
19
|
+
|
20
|
+
return required_gems, required_fake_gems
|
18
21
|
end
|
19
22
|
|
20
23
|
|
@@ -24,15 +27,30 @@ end
|
|
24
27
|
namespace :gem do
|
25
28
|
desc "Install gem required by project"
|
26
29
|
task :install do
|
27
|
-
gems = parse_project_gemfile
|
30
|
+
gems, fake_gems = parse_project_gemfile
|
28
31
|
gems.each do |name, version|
|
32
|
+
puts "Installing gem #{name} #{version}"
|
33
|
+
%x(gem install #{name}#{" -v #{version}" if version} --ignore-dependencies)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
desc "List all gems required by project"
|
38
|
+
task :list do
|
39
|
+
puts "Gems required for #{project[:official_name]}:"
|
40
|
+
gems, fake_gems = parse_project_gemfile
|
41
|
+
puts(gems + fake_gems)
|
42
|
+
end
|
43
|
+
|
44
|
+
desc "Install all gem required by project (including fake gems)"
|
45
|
+
task :install_all do
|
46
|
+
gems, fake_gems = parse_project_gemfile
|
47
|
+
(gems + fake_gems).each do |name, version|
|
29
48
|
puts "Installing gem #{name} #{version}"
|
30
49
|
%x(gem install #{name} #{"-v #{version}" if version})
|
31
50
|
end
|
32
51
|
end
|
33
52
|
end
|
34
53
|
|
35
|
-
|
36
54
|
#
|
37
55
|
# Gem Spec, for sample look at Rakefile
|
38
56
|
#
|
@@ -42,17 +60,20 @@ require 'tmpdir'
|
|
42
60
|
|
43
61
|
namespace :gem do
|
44
62
|
spec = Gem::Specification.new do |s|
|
45
|
-
gems = parse_project_gemfile
|
63
|
+
gems, fake_gems = parse_project_gemfile
|
64
|
+
gems = gems + fake_gems
|
65
|
+
|
46
66
|
gems.each{|name_version| s.add_dependency *name_version}
|
47
67
|
|
48
68
|
options = project.clone
|
49
69
|
|
50
70
|
options.delete(:name)
|
51
|
-
s.name = options.delete(:
|
71
|
+
s.name = options.delete(:official_name)
|
52
72
|
s.platform = options.delete(:platform) || Gem::Platform::RUBY
|
53
73
|
s.has_rdoc = options.delete(:has_rdoc) == nil ? false : true
|
54
74
|
s.require_path = options.delete(:lib) || "lib"
|
55
75
|
s.files = options.delete(:files) || (%w{Rakefile readme.md} + Dir.glob("{lib,spec}/**/*"))
|
76
|
+
s.bindir = options.delete(:bin) if options.include? :bin
|
56
77
|
|
57
78
|
# s.name = options[:name)
|
58
79
|
# s.author = options[:author)
|
@@ -61,7 +82,7 @@ namespace :gem do
|
|
61
82
|
options.each{|k, v| s.send "#{k}=", v}
|
62
83
|
end
|
63
84
|
|
64
|
-
package_dir = Dir.tmpdir + "/#{project[:
|
85
|
+
package_dir = Dir.tmpdir + "/#{project[:official_name]}_tmp"
|
65
86
|
Rake::GemPackageTask.new(spec) do |p|
|
66
87
|
p.need_tar = true if RUBY_PLATFORM !~ /mswin/
|
67
88
|
p.need_zip = true
|
@@ -69,7 +90,7 @@ namespace :gem do
|
|
69
90
|
end
|
70
91
|
|
71
92
|
task :push do
|
72
|
-
gem_file = Dir.glob("#{package_dir}/#{project[:
|
93
|
+
gem_file = Dir.glob("#{package_dir}/#{project[:official_name]}*.gem").first
|
73
94
|
system "gem push #{gem_file}"
|
74
95
|
end
|
75
96
|
|
@@ -77,12 +98,6 @@ namespace :gem do
|
|
77
98
|
system "rm -r #{package_dir}"
|
78
99
|
end
|
79
100
|
|
80
|
-
desc "List all gems required by project"
|
81
|
-
task :list do
|
82
|
-
puts "Gems required for #{project[:gem_name]}:"
|
83
|
-
puts parse_project_gemfile
|
84
|
-
end
|
85
|
-
|
86
101
|
desc "Build and publish project as gem"
|
87
|
-
task :
|
102
|
+
task release: [:gem, :push, :clean]
|
88
103
|
end
|
data/lib/rspec_ext.rb
CHANGED
@@ -2,42 +2,105 @@ require 'rspec'
|
|
2
2
|
require 'fileutils'
|
3
3
|
|
4
4
|
RSpec.configure do |c|
|
5
|
-
c.filter_run :
|
5
|
+
c.filter_run focus: true
|
6
6
|
c.run_all_when_everything_filtered = true
|
7
7
|
end
|
8
8
|
|
9
|
-
|
9
|
+
def rspec &block
|
10
|
+
RSpec::Core::ExampleGroup.class_eval &block if block
|
11
|
+
return RSpec::Core::ExampleGroup
|
12
|
+
end
|
13
|
+
|
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 self.with_load_path *args
|
26
|
+
list = if args.first.is_a? Array
|
27
|
+
args.first
|
28
|
+
else
|
29
|
+
args
|
30
|
+
end
|
31
|
+
|
32
|
+
before(:all){list.each{|path| $LOAD_PATH << path}}
|
33
|
+
after(:all){list.each{|path| $LOAD_PATH.delete path}}
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.with_tmp_spec_dir *args
|
37
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
38
|
+
dir = args.first || self.spec_dir
|
39
|
+
|
40
|
+
options[:before] ||= :all
|
41
|
+
tmp_dir = "/tmp/#{dir.split('/').last}"
|
42
|
+
|
43
|
+
before options do
|
44
|
+
FileUtils.rm_r tmp_dir if File.exist? tmp_dir
|
45
|
+
FileUtils.cp_r dir, tmp_dir
|
46
|
+
@spec_dir = tmp_dir
|
47
|
+
end
|
48
|
+
|
49
|
+
after options do
|
50
|
+
FileUtils.rm_r tmp_dir if File.exist? tmp_dir
|
51
|
+
@spec_dir = nil
|
52
|
+
end
|
53
|
+
|
54
|
+
tmp_dir
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.with_spec_dir dir
|
58
|
+
before(:all){@spec_dir = dir}
|
59
|
+
after(:all){@spec_dir = nil}
|
60
|
+
end
|
61
|
+
|
62
|
+
# def self.with_spec_dir
|
63
|
+
|
64
|
+
# def self.spec_dir dir = nil
|
65
|
+
# @spec_dir ||= calculate_spec_dir_for_current_caller
|
66
|
+
# end
|
67
|
+
|
68
|
+
def self.spec_dir
|
69
|
+
self.calculate_default_spec_dir || raise(":spec_dir not defined!")
|
70
|
+
end
|
71
|
+
|
72
|
+
def spec_dir
|
73
|
+
@spec_dir || self.class.spec_dir
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.calculate_default_spec_dir
|
77
|
+
spec_file_name = caller.find{|line| line =~ /_spec\.rb\:/}
|
78
|
+
return nil unless spec_file_name
|
79
|
+
spec_dir = spec_file_name.sub(/\.rb\:.*/, '')
|
80
|
+
raise "spec dir not exist (#{spec_dir})!" unless File.exist? spec_dir
|
81
|
+
spec_dir
|
82
|
+
end
|
83
|
+
|
10
84
|
def remove_constants *args
|
11
85
|
args = args.first if args.size == 1 and args.first.is_a?(Array)
|
12
86
|
args.each{|c| Object.send :remove_const, c if Object.const_defined? c}
|
13
87
|
end
|
14
88
|
|
15
|
-
def
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
FileUtils.rm_r dir if File.exist? dir
|
20
|
-
FileUtils.cp_r original_data_dir, dir
|
21
|
-
|
22
|
-
dir
|
23
|
-
end
|
24
|
-
|
25
|
-
def clean_spec_data spec_file_name
|
26
|
-
dir = spec_file_name.sub(/\.rb$/, '')
|
27
|
-
FileUtils.rm_r dir if File.exist? dir
|
28
|
-
end
|
89
|
+
# def spec_tmp_dir
|
90
|
+
# $spec_tmp_dir || raise("you should call :with_tmp_spec_dir to be able to use :spec_tmp_dir!")
|
91
|
+
# end
|
29
92
|
end
|
30
93
|
|
31
94
|
class String
|
32
|
-
|
95
|
+
unless "".respond_to? :dirname
|
33
96
|
def dirname
|
34
97
|
File.expand_path(File.dirname(self))
|
35
98
|
end
|
36
|
-
|
99
|
+
end
|
37
100
|
|
38
101
|
unless "".respond_to? :parent_dirname
|
39
102
|
def parent_dirname
|
40
|
-
File.expand_path(
|
103
|
+
File.expand_path(self + "/..")
|
41
104
|
end
|
42
105
|
end
|
43
106
|
end
|
data/lib/ruby_ext.rb
CHANGED
@@ -1,52 +1 @@
|
|
1
|
-
require
|
2
|
-
|
3
|
-
core = [
|
4
|
-
'facets/array/indexable', # Array first!, last!
|
5
|
-
'facets/enumerable/every',
|
6
|
-
'facets/enumerable/group_by',
|
7
|
-
'facets/exception/detail', # pretty print
|
8
|
-
'facets/object/dup', # false.dup(), false.clone() and so on.
|
9
|
-
'facets/kernel/blank',
|
10
|
-
'facets/numeric/round.rb', # round_at, round_to
|
11
|
-
'facets/hash',
|
12
|
-
'facets/string/interpolate',
|
13
|
-
# 'facets/ostruct',
|
14
|
-
# 'facets/openobject' it has broken implementation and is completelly rewritend in ruby-ext
|
15
|
-
]
|
16
|
-
|
17
|
-
more = [
|
18
|
-
# 'facets/basicobject', causes problem with rspec
|
19
|
-
# 'facets/opencascade', causes problem with redefined OpenObject
|
20
|
-
]
|
21
|
-
|
22
|
-
(core + more).each{|f| require f}
|
23
|
-
|
24
|
-
{
|
25
|
-
:BasicObject => 'basic_object',
|
26
|
-
:OpenObject => 'open_object',
|
27
|
-
:OpenConstructor => 'open_constructor',
|
28
|
-
:Observable2 => 'observable2',
|
29
|
-
:ExtraBlankSlate => 'extra_blank_slate', # do I need it?
|
30
|
-
:Tuple => 'tuple',
|
31
|
-
}.each{|klass, file| Kernel.autoload klass, "ruby_ext/#{file}"}
|
32
|
-
|
33
|
-
%w{
|
34
|
-
file
|
35
|
-
array
|
36
|
-
hash
|
37
|
-
kernel
|
38
|
-
module
|
39
|
-
not_defined
|
40
|
-
object
|
41
|
-
class
|
42
|
-
string
|
43
|
-
symbol
|
44
|
-
|
45
|
-
deep_clone
|
46
|
-
declarative_cache
|
47
|
-
must
|
48
|
-
prepare_arguments
|
49
|
-
synchronize
|
50
|
-
micelaneous
|
51
|
-
multiple_inheritance
|
52
|
-
}.each{|f| require "ruby_ext/#{f}"}
|
1
|
+
require "ruby_ext/more"
|
@@ -0,0 +1,24 @@
|
|
1
|
+
raise 'ruby 1.9.2 or higher required!' if RUBY_VERSION < '1.9.2'
|
2
|
+
|
3
|
+
require 'ruby_ext/gems'
|
4
|
+
require 'ruby_ext/fixes'
|
5
|
+
|
6
|
+
%w(
|
7
|
+
basic_object
|
8
|
+
file
|
9
|
+
enumerable
|
10
|
+
array
|
11
|
+
hash
|
12
|
+
kernel
|
13
|
+
object
|
14
|
+
module
|
15
|
+
not_defined
|
16
|
+
class
|
17
|
+
string
|
18
|
+
symbol
|
19
|
+
must
|
20
|
+
open_object
|
21
|
+
deep_clone
|
22
|
+
multiple_inheritance
|
23
|
+
micelaneous
|
24
|
+
).each{|f| require "ruby_ext/core/#{f}"}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
class Array
|
1
|
+
class Array
|
2
2
|
def sfilter *filters
|
3
3
|
filters = filters.first if filters.size == 1 and filters.first.is_a?(Array)
|
4
4
|
filters.collect!{|o| o.is_a?(Regexp) ? o : /#{Regexp.escape o}/}
|
@@ -9,5 +9,7 @@ class Array
|
|
9
9
|
|
10
10
|
def self.wrap value
|
11
11
|
Array(value)
|
12
|
-
end
|
12
|
+
end
|
13
|
+
|
14
|
+
alias_method :filter, :select
|
13
15
|
end
|
File without changes
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Enumerable
|
2
|
+
class EveryProxy < BasicObject
|
3
|
+
def initialize enumerable
|
4
|
+
@enumerable = enumerable
|
5
|
+
end
|
6
|
+
|
7
|
+
protected
|
8
|
+
def method_missing m, *a, &b
|
9
|
+
@enumerable.each{|o| o.send m, *a, &b}
|
10
|
+
self
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def every
|
15
|
+
EveryProxy.new(self)
|
16
|
+
end
|
17
|
+
end
|