ruby_ext 0.4.11 → 0.4.12
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/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
|