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.
Files changed (69) hide show
  1. data/Rakefile +6 -6
  2. data/lib/rake_ext.rb +10 -5
  3. data/lib/rake_ext/project.rb +31 -16
  4. data/lib/rspec_ext.rb +82 -19
  5. data/lib/ruby_ext.rb +1 -52
  6. data/lib/ruby_ext/core.rb +24 -0
  7. data/lib/ruby_ext/{array.rb → core/array.rb} +4 -2
  8. data/lib/ruby_ext/core/basic_object.rb +8 -0
  9. data/lib/ruby_ext/core/class.rb +0 -0
  10. data/lib/ruby_ext/{deep_clone.rb → core/deep_clone.rb} +3 -4
  11. data/lib/ruby_ext/core/enumerable.rb +17 -0
  12. data/lib/ruby_ext/{file.rb → core/file.rb} +5 -2
  13. data/lib/ruby_ext/core/hash.rb +23 -0
  14. data/lib/ruby_ext/{kernel.rb → core/kernel.rb} +0 -0
  15. data/lib/ruby_ext/{micelaneous.rb → core/micelaneous.rb} +0 -0
  16. data/lib/ruby_ext/{module.rb → core/module.rb} +13 -2
  17. data/lib/ruby_ext/{multiple_inheritance.rb → core/multiple_inheritance.rb} +30 -14
  18. data/lib/ruby_ext/{must.rb → core/must.rb} +30 -27
  19. data/lib/ruby_ext/{not_defined.rb → core/not_defined.rb} +0 -0
  20. data/lib/ruby_ext/{object.rb → core/object.rb} +0 -0
  21. data/lib/ruby_ext/{open_object.rb → core/open_object.rb} +21 -16
  22. data/lib/ruby_ext/{string.rb → core/string.rb} +27 -0
  23. data/lib/ruby_ext/{symbol.rb → core/symbol.rb} +0 -0
  24. data/lib/ruby_ext/fixes.rb +6 -0
  25. data/lib/ruby_ext/gems.rb +0 -1
  26. data/lib/ruby_ext/more.rb +11 -0
  27. data/lib/ruby_ext/more/declarative_cache.rb +96 -0
  28. data/lib/ruby_ext/more/micelaneous.rb +7 -0
  29. data/lib/ruby_ext/{observable2.rb → more/observable2.rb} +0 -0
  30. data/lib/ruby_ext/{open_constructor.rb → more/open_constructor.rb} +2 -2
  31. data/lib/ruby_ext/more/safe_hash.rb +214 -0
  32. data/lib/ruby_ext/{synchronize.rb → more/synchronize.rb} +5 -5
  33. data/lib/ruby_ext/{tuple.rb → more/tuple.rb} +0 -0
  34. data/lib/yaml_fix.rb +9 -0
  35. data/readme.md +46 -42
  36. data/spec/core/array_spec.rb +7 -0
  37. data/spec/{deep_clone_spec.rb → core/deep_clone_spec.rb} +2 -3
  38. data/spec/core/enumerable.rb +9 -0
  39. data/spec/{kernel_spec.rb → core/kernel_spec.rb} +4 -6
  40. data/spec/{kernel_spec → core/kernel_spec}/TheNamespace/ClassA.rb +0 -0
  41. data/spec/{kernel_spec → core/kernel_spec}/another_class.rb +0 -0
  42. data/spec/{kernel_spec → core/kernel_spec}/the_namespace/class_b.rb +0 -0
  43. data/spec/{module_spec.rb → core/module_spec.rb} +2 -4
  44. data/spec/{multiple_inheritance_spec.rb → core/multiple_inheritance_spec.rb} +28 -12
  45. data/spec/core/must_spec.rb +32 -0
  46. data/spec/{open_object_spec.rb → core/open_object_spec.rb} +6 -7
  47. data/spec/core/spec_helper.rb +2 -0
  48. data/spec/{declarative_cache_spec.rb → more/declarative_cache_spec.rb} +35 -8
  49. data/spec/{observable2_spec.rb → more/observable2_spec.rb} +3 -4
  50. data/spec/{open_constructor_spec.rb → more/open_constructor_spec.rb} +6 -7
  51. data/spec/more/safe_hash_spec.rb +133 -0
  52. data/spec/more/spec_helper.rb +2 -0
  53. data/spec/{synchronize_spec.rb → more/synchronize_spec.rb} +2 -3
  54. metadata +67 -100
  55. data/lib/ruby_ext/basic_object.rb +0 -22
  56. data/lib/ruby_ext/class.rb +0 -11
  57. data/lib/ruby_ext/declarative_cache.rb +0 -85
  58. data/lib/ruby_ext/extra_blank_slate.rb +0 -17
  59. data/lib/ruby_ext/hash.rb +0 -15
  60. data/lib/ruby_ext/prepare_arguments.rb +0 -105
  61. data/lib/ruby_ext/prototype_inheritance.rb +0 -110
  62. data/lib/ruby_ext/should.rb +0 -166
  63. data/lib/rubyopt.rb +0 -7
  64. data/spec/_prototype_inheritance_spec.rb +0 -190
  65. data/spec/array_spec.rb +0 -8
  66. data/spec/must_spec.rb +0 -29
  67. data/spec/prepare_arguments_spec.rb +0 -46
  68. data/spec/should_spec.rb +0 -24
  69. 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
- :name => "ruby_ext",
8
- :version => "0.4.11",
9
- :summary => "Ruby language extensions",
7
+ name: "ruby_ext",
8
+ version: "0.4.12",
9
+ summary: "Ruby Extensions",
10
10
 
11
- :author => "Alexey Petrushin",
12
- :homepage => "http://github.com/alexeypetrushin/ruby_ext"
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 :default => :spec
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/**/[^_]*_spec.rb").each do |spec_file|
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 '' file only in Rakefile!")
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 & after task
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[:gem_name] ||= @options[:name]
75
+ @options[:official_name] ||= @options[:name]
71
76
 
72
77
  require 'rake_ext/project'
73
78
  end
@@ -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
- stub = stub_class.new
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
- required_gems
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(:gem_name)
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[:gem_name]}_tmp"
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[:gem_name]}*.gem").first
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 :release => [:gem, :push, :clean]
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 :focus => true
5
+ c.filter_run focus: true
6
6
  c.run_all_when_everything_filtered = true
7
7
  end
8
8
 
9
- RSpec::Core::ExampleGroup.class_eval do
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 prepare_spec_data spec_file_name
16
- dir = File.expand_path(spec_file_name.sub(/\.rb$/, ''))
17
- original_data_dir = dir + "_data"
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
- # unless "".respond_to? :dirname
95
+ unless "".respond_to? :dirname
33
96
  def dirname
34
97
  File.expand_path(File.dirname(self))
35
98
  end
36
- # end
99
+ end
37
100
 
38
101
  unless "".respond_to? :parent_dirname
39
102
  def parent_dirname
40
- File.expand_path(File.dirname(self) + "/..")
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 'ruby_ext/gems'
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
@@ -0,0 +1,8 @@
1
+ class BasicObject
2
+ protected :==, :equal?, :!, :!=
3
+
4
+ protected
5
+ def raise *args
6
+ ::Object.send :raise, *args
7
+ end
8
+ end
File without changes
@@ -45,11 +45,10 @@ Array.class_eval do
45
45
  end
46
46
  end
47
47
 
48
- [Class, Proc].each do |klass|
48
+ [Class, Proc, Regexp].each do |klass|
49
49
  klass.class_eval do
50
- def deep_clone
51
- self
52
- end
50
+ def clone; self end
51
+ alias_method :deep_clone, :clone
53
52
  end
54
53
  end
55
54
 
@@ -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