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.
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