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
@@ -1,8 +1,11 @@
1
1
  require 'fileutils'
2
2
 
3
3
  File.class_eval do
4
+ def file_name
5
+ File.basename path
6
+ end
7
+
4
8
  class << self
5
-
6
9
  def write(path, data)
7
10
  File.open(path, "wb") do |file|
8
11
  return file.write(data)
@@ -14,7 +17,7 @@ File.class_eval do
14
17
  end
15
18
 
16
19
  def delete_directory dir
17
- FileUtils.rm_r dir, :force => true if File.exist? dir
20
+ FileUtils.rm_r dir, force: true if File.exist? dir
18
21
  end
19
22
  end
20
23
  end
@@ -0,0 +1,23 @@
1
+ class Hash
2
+ def subset *keys, &block
3
+ keys = keys.first if keys.first.is_a? Array
4
+ h = {}
5
+ if keys
6
+ self.each do |k, v|
7
+ h[k] = v if keys.include? k
8
+ end
9
+ else
10
+ self.each do |k, v|
11
+ h[k] = v if block.call k
12
+ end
13
+ end
14
+ h
15
+ end
16
+
17
+ def validate_options! *valid_options
18
+ unknown_options = keys - valid_options
19
+ raise "unknown options :#{unknown_options.join(': ')}!" unless unknown_options.empty?
20
+ end
21
+
22
+ alias_method :to_h, :to_hash
23
+ end
File without changes
@@ -1,6 +1,16 @@
1
1
  require 'set'
2
2
 
3
3
  Module.class_eval do
4
+ def alias name = nil
5
+ if name
6
+ name.must_be.a String
7
+ name.must_not_be.blank
8
+ @alias = name.to_s
9
+ else
10
+ @alias ||= self.name.split('::').last
11
+ end
12
+ end
13
+
4
14
  def is?(base)
5
15
  ancestors.include?(base)
6
16
  end
@@ -47,6 +57,7 @@ Module.class_eval do
47
57
  each_namespace &b
48
58
  end
49
59
 
60
+ # TODO cache it?
50
61
  def self.namespace_for class_name
51
62
  list = class_name.split("::")
52
63
  if list.size > 1
@@ -112,8 +123,8 @@ Module.class_eval do
112
123
  m = method.to_s.clone
113
124
  ESCAPE_METHOD_SYMBOLS.each{|from, to| m.gsub! from, to}
114
125
  raise "Invalid method name '#{method}'!" unless m =~ /^[_a-zA-Z0-9]+$/
115
- m
126
+ m.to_sym
116
127
  end
117
128
 
118
- public :include
129
+ public :include, :define_method
119
130
  end
@@ -19,14 +19,14 @@ class Module
19
19
  @directly_included_by ||= Set.new
20
20
  end
21
21
 
22
- def fixed_include mod
23
- unless mod.directly_included_by.include? self
24
- mod.directly_included_by.add self
25
- end
22
+ def include2 mod
23
+ # unless mod.directly_included_by.include? self
24
+ mod.directly_included_by.add self
25
+ # end
26
26
 
27
27
  include mod
28
28
  directly_included_by.each do |child|
29
- child.fixed_include self
29
+ child.include2 self
30
30
  end
31
31
  end
32
32
  end
@@ -38,12 +38,19 @@ end
38
38
  class Module
39
39
  def class_prototype
40
40
  unless @class_prototype
41
- unless const_defined? :ClassMethods
41
+ ancestor = ancestors[1]
42
+ if(
43
+ !const_defined?(:ClassMethods) or
44
+ (
45
+ const_defined?(:ClassMethods) and ancestor and ancestor.const_defined?(:ClassMethods) and
46
+ const_get(:ClassMethods) == ancestor.const_get(:ClassMethods)
47
+ )
48
+ )
42
49
  class_eval "module ClassMethods; end", __FILE__, __LINE__
43
50
  end
44
51
  @class_prototype = const_get :ClassMethods
45
52
 
46
- (class << self; self end).fixed_include @class_prototype
53
+ (class << self; self end).include2 @class_prototype
47
54
  end
48
55
  @class_prototype
49
56
  end
@@ -57,20 +64,29 @@ class Module
57
64
  end
58
65
  end
59
66
 
67
+ def inherited &b
68
+ @inherited = b if b
69
+ @inherited
70
+ end
71
+
60
72
  def inherit *modules
61
73
  modules.each do |mod|
62
74
  # Instance Methods
63
- fixed_include mod
75
+ include2 mod
64
76
 
65
77
  # Class Methods
66
- if self.class == Module
67
- class_prototype.fixed_include mod.class_prototype
68
- else
69
- (class << self; self end).fixed_include mod.class_prototype
70
- end
78
+ unless self.class_prototype == mod.class_prototype
79
+ if self.class == Module
80
+ # p self => self.class_prototype, mod => mod.class_prototype
81
+ class_prototype.include2 mod.class_prototype
82
+ else
83
+ (class << self; self end).include2 mod.class_prototype
84
+ end
85
+ end
71
86
 
72
87
  # callback
73
- mod.inherited self if mod.respond_to? :inherited
88
+ # mod.inherited self if mod.respond_to? :inherited
89
+ self.instance_eval &mod.inherited if mod.inherited
74
90
  end
75
91
  end
76
92
  end
@@ -1,9 +1,9 @@
1
- class AssertionError < StandardError; end
1
+ class AssertionError < RuntimeError; end
2
2
 
3
- class MustAssertions < ExtraBlankSlate
3
+ class MustAssertions < BasicObject
4
4
  attr_reader :obj
5
5
 
6
- def initialize obj
6
+ def initialize obj
7
7
  @obj = obj
8
8
  end
9
9
 
@@ -24,18 +24,18 @@ class MustAssertions < ExtraBlankSlate
24
24
  end
25
25
 
26
26
  def defined
27
- !nil
27
+ @obj != nil
28
28
  end
29
29
 
30
30
  def respond_to method
31
31
  @obj.respond_to? method
32
32
  end
33
33
 
34
- def a klass
35
- if klass.class == Array
36
- klass.any?{|k| @obj.is_a? k}
34
+ def a *args
35
+ if args.class == ::Array
36
+ args.any?{|k| @obj.is_a? k}
37
37
  else
38
- @obj.is_a? klass
38
+ @obj.is_a? args
39
39
  end
40
40
  end
41
41
  alias_method :an, :a
@@ -55,7 +55,7 @@ class MustAssertions < ExtraBlankSlate
55
55
  def in *args
56
56
  if args.size == 1
57
57
  obj = args.first
58
- if obj.is_a?(Array) or obj.is_a?(Range)
58
+ if obj.is_a?(::Array) or obj.is_a?(::Range)
59
59
  obj.include? @obj
60
60
  else
61
61
  args.include? @obj
@@ -73,7 +73,7 @@ class MustAssertions < ExtraBlankSlate
73
73
  !@obj
74
74
  end
75
75
 
76
- def empty
76
+ def empty
77
77
  @obj.empty?
78
78
  end
79
79
 
@@ -101,11 +101,11 @@ class MustAssertions < ExtraBlankSlate
101
101
  @obj <= o
102
102
  end
103
103
 
104
- def exist arg
105
- @obj.exist? arg
104
+ def exist *args
105
+ @obj.exist? *args
106
106
  end
107
107
 
108
- def be
108
+ def be
109
109
  @prefix = 'be'
110
110
  self
111
111
  end
@@ -116,25 +116,25 @@ class MustAssertions < ExtraBlankSlate
116
116
  end
117
117
 
118
118
  def self.assertions
119
- special = %w{be have}
120
- instance_methods.select{|m| m !~ /^__/ and m != 'be'}
119
+ special = [:be, :have]
120
+ public_instance_methods.select{|m| m !~ /^__/ and !special.include?(m)}
121
121
  end
122
-
122
+
123
123
  protected
124
- def method_missing m, *args, &b
125
- raise RuntimeError, "Assertion '#{m}' is unknown!", caller[1..-1]
126
- end
124
+ # def method_missing m, *args, &b
125
+ # raise ::RuntimeError, "Assertion '#{m}' is unknown!", caller[1..-1]
126
+ # end
127
127
 
128
128
  def failed method, negative, *args
129
- stack = caller.sfilter('must.rb')
129
+ stack = ::Object.send(:caller).sfilter('must.rb')
130
130
 
131
131
  unless args.empty?
132
- Kernel.raise AssertionError, "
132
+ ::Object.send :raise, ::AssertionError, "
133
133
  ASSERTION FAILED (#{stack.first}):
134
- #{@obj.inspect} must #{'not ' if negative}#{"#{@prefix} " if @prefix}#{method} #{args.first.inspect}
134
+ #{@obj.inspect} must #{'not ' if negative}#{"#{@prefix} " if @prefix}#{method} #{args.collect{|a| a.inspect}.join(', ')}
135
135
  ", stack
136
136
  else
137
- Kernel.raise AssertionError, "
137
+ ::Object.send :raise, ::AssertionError, "
138
138
  ASSERTION FAILED (#{stack.first}):
139
139
  #{@obj.inspect} must #{'not ' if negative}#{"#{@prefix} " if @prefix}#{method}
140
140
  ", stack
@@ -151,11 +151,15 @@ class Must < MustAssertions
151
151
  @obj
152
152
  end
153
153
  end
154
+
155
+ def inspect
156
+ "<#Must>"
157
+ end
154
158
  end
155
159
 
156
160
  class MustNot < MustAssertions
157
- assertions.each do |m|
158
- desition = "_#{m}"
161
+ assertions.each do |m|
162
+ desition = "_#{m}".to_sym
159
163
  alias_method desition, m
160
164
  define_method m do |*args|
161
165
  failed m, true, *args if __send__(desition, *args)
@@ -164,8 +168,7 @@ class MustNot < MustAssertions
164
168
  end
165
169
  end
166
170
 
167
- Object.class_eval do
168
-
171
+ Object.class_eval do
169
172
  def must
170
173
  Must.new(self)
171
174
  end
File without changes
@@ -1,14 +1,18 @@
1
1
  raise "You shouldn't use OpenObject defined in facets, it's incopatible with this version!" if defined?(OpenObject)
2
2
 
3
- class OpenObject < Hash
4
-
5
- PUBLIC_METHODS = %w(as send each size is_a? clone dup empty? blank? present? merge merge! stringify_keys stringify_keys! symbolize_keys symbolize_keys! to_query)
6
- PUBLIC_METHODS_RE = /(^__|^object_)/
7
-
8
- protected(*public_instance_methods.select{ |m| !PUBLIC_METHODS.include?(m) and m !~ PUBLIC_METHODS_RE })
9
-
3
+ class OpenObject < Hash
4
+ #
5
+ # delete methods
6
+ #
7
+ PUBLIC_METHODS = %w(
8
+ as send each each_pair size is_a? clone dup empty? blank? present? merge merge! stringify_keys stringify_keys! symbolize_keys symbolize_keys! to_query
9
+ ).collect{|m| m.to_sym}
10
+ PUBLIC_METHODS_RE = /(^__|^object_|^must|^stub)/
11
+ protected(*public_instance_methods.select{|m| !PUBLIC_METHODS.include?(m) and m !~ PUBLIC_METHODS_RE})
12
+
10
13
  def inspect
11
- "#<#{self.class}:#{self.object_id} #{super}>"
14
+ # "#<#{self.class}:#{self.object_id} #{super}>"
15
+ "<#{super}>"
12
16
  end
13
17
 
14
18
  def to_a; super end
@@ -30,6 +34,7 @@ class OpenObject < Hash
30
34
  r
31
35
  end
32
36
  end
37
+ alias_method :to_oo, :to_openobject
33
38
 
34
39
  def each &block; super(&block) end
35
40
 
@@ -47,12 +52,12 @@ class OpenObject < Hash
47
52
  end
48
53
 
49
54
  def update other
50
- other.to_hash.each{|k,v| self[k.to_s] = v}
55
+ other.to_hash.each{|k,v| self[k.to_sym] = v}
51
56
  self
52
57
  end
53
58
 
54
59
  def delete key
55
- super key.to_s
60
+ super key.to_sym
56
61
  end
57
62
 
58
63
  def == other
@@ -64,15 +69,15 @@ class OpenObject < Hash
64
69
  end
65
70
 
66
71
  def []= k, v
67
- super k.to_s, v
72
+ super k.to_sym, v
68
73
  end
69
74
 
70
75
  def [] k
71
- super k.to_s
76
+ super k.to_sym
72
77
  end
73
78
 
74
79
  def include? k
75
- super k.to_s
80
+ super k.to_sym
76
81
  end
77
82
 
78
83
  def to_hash deep = false
@@ -105,10 +110,8 @@ class OpenObject < Hash
105
110
  end
106
111
 
107
112
  protected
108
- def method_missing m, arg = nil, &block
109
- m = m.to_s
113
+ def method_missing m, arg = nil, &block
110
114
  type = m[-1,1]
111
- # key = m.to_s.sub(/[=?!]$/,'').to_s
112
115
  if type == '='
113
116
  self[m[0..-2]] = arg
114
117
  elsif type == '!'
@@ -129,6 +132,7 @@ class NilClass
129
132
  def to_openobject deep = false
130
133
  OpenObject.new
131
134
  end
135
+ alias_method :to_oo, :to_openobject
132
136
  end
133
137
 
134
138
  class Hash
@@ -147,6 +151,7 @@ class Hash
147
151
  r
148
152
  end
149
153
  end
154
+ alias_method :to_oo, :to_openobject
150
155
 
151
156
  alias_method :oo_eql, :==
152
157
  def == other
@@ -7,6 +7,10 @@ String.class_eval do
7
7
  File.expand_path(File.dirname(self) + "/..")
8
8
  end
9
9
 
10
+ def expand_path
11
+ File.expand_path(self)
12
+ end
13
+
10
14
  def to_reader
11
15
  self.to_sym
12
16
  end
@@ -19,6 +23,10 @@ String.class_eval do
19
23
  "@#{self}"
20
24
  end
21
25
 
26
+ def to_a
27
+ [self]
28
+ end
29
+
22
30
  def interpolate binding
23
31
  binding.must_be.a Binding
24
32
  return gsub(/\#\{.+?\}/) do |term|
@@ -41,4 +49,23 @@ String.class_eval do
41
49
  word.downcase!
42
50
  word
43
51
  end
52
+
53
+ def camelize first_letter_in_uppercase = true
54
+ if first_letter_in_uppercase
55
+ gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
56
+ else
57
+ self[0].chr.downcase + camelize(lower_case_and_underscored_word)[1..-1]
58
+ end
59
+ end
60
+
61
+ def constantize
62
+ names = self.split('::')
63
+ names.shift if names.empty? || names.first.empty?
64
+
65
+ constant = Object
66
+ names.each do |name|
67
+ constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
68
+ end
69
+ constant
70
+ end
44
71
  end
File without changes
@@ -0,0 +1,6 @@
1
+ # clone doesn't unfreeze String
2
+ class String
3
+ def clone
4
+ "" + self
5
+ end
6
+ end