methodfinalizer 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -8,4 +8,9 @@
8
8
 
9
9
  * added 2 methods
10
10
 
11
- * added 'final_singleton_method_exists?' and 'final_instance_method_exists?'
11
+ * added 'final_singleton_method_exists?' and 'final_instance_method_exists?'
12
+
13
+ === 0.7.0 / 2009-03-26
14
+
15
+ * fixed: #24861 (please see at details at rubyforge)
16
+ * resolved handling of special final class method redefinition (see commit message at github for more)
data/Manifest.txt CHANGED
@@ -7,14 +7,19 @@ lib/methodfinalizer.rb
7
7
  lib/final_method/final_method.rb
8
8
  lib/final_method/final_method_version.rb
9
9
  lib/final_method/final_method_exceptions.rb
10
+ test/test_final_declared_but_not_defined.rb
10
11
  test/test_method_finalizer.rb
11
12
  test/test_method_finalizer_usage.rb
13
+ test/test_special_class_method_redefinition.rb
12
14
  test/test_classes_files/method_finalizer_usage.rb
15
+ test/test_classes_files/special_class_method_redefinition.rb
13
16
  test/test_classes_files/final_class_method_files/final_class_method_called_with_no_method_arguments.rb
17
+ test/test_classes_files/final_class_method_files/final_class_method_declared_but_not_defined.rb
14
18
  test/test_classes_files/final_class_method_files/redeclared_final_class_methods_in_child.rb
15
19
  test/test_classes_files/final_class_method_files/redefined_final_class_method_in_child_class_using_parent.rb
16
20
  test/test_classes_files/final_class_method_files/redefined_final_class_method_in_child_class.rb
17
21
  test/test_classes_files/final_instance_method_files/final_instance_method_called_with_no_method_arguments.rb
22
+ test/test_classes_files/final_instance_method_files/final_instance_method_declared_but_not_defined.rb
18
23
  test/test_classes_files/final_instance_method_files/redeclared_final_instance_methods_in_child.rb
19
24
  test/test_classes_files/final_instance_method_files/redefined_final_instance_method_in_child_instance_using_parent.rb
20
25
  test/test_classes_files/final_instance_method_files/redefined_final_instance_method_in_child_class.rb
data/Rakefile CHANGED
@@ -3,6 +3,7 @@ require 'hoe'
3
3
  require 'lib/methodfinalizer'
4
4
 
5
5
  Hoe.new('methodfinalizer', OOP::Concepts::FinalMethod::FINAL_METHOD_VERSION) do |p|
6
+ p.extra_deps << ['ruby2ruby', '= 1.2.2']
6
7
  p.rubyforge_name = 'methodfinalizer'
7
8
  p.developer('Wilfrido T. Nuqui Jr.', 'dofreewill22@gmail.com')
8
9
  end
@@ -1,4 +1,6 @@
1
1
  require File.dirname(__FILE__) + '/final_method_version'
2
+ require 'rubygems'
3
+ require 'ruby2ruby'
2
4
 
3
5
  module OOP
4
6
  module Concepts
@@ -239,10 +241,11 @@ module OOP
239
241
  validations = validate_methods(final_methods, method_names, self)
240
242
  if(validations[:valid])
241
243
  if final_methods.has_key?(self) && ((final_methods[self] - method_names) == final_methods[self])
242
- final_methods[self].concat(method_names.collect{|method_name| {method_name => 0}})
244
+ final_methods[self].concat(method_names.collect{|method_name| {method_name => {:definition_count => 0, :definition_str => nil}}})
243
245
  else
244
- final_methods[self] = method_names.collect{|method_name| {method_name => 0}}
246
+ final_methods[self] = method_names.collect{|method_name| {method_name => {:definition_count => 0, :definition_str => nil}}}
245
247
  end
248
+ nil # must return nil
246
249
  else
247
250
  final_method_error = method_type.eql?('class') ? FinalClassMethodRedeclarationError : FinalInstanceMethodRedeclarationError
248
251
  raise final_method_error.new(validations[:error_message])
@@ -258,15 +261,23 @@ module OOP
258
261
  else
259
262
  remove_method method_name
260
263
  end
261
- final_method_error = method_type.eql?('class') ? FinalClassMethodRedefinitionError : FinalInstanceMethodRedefinitionError
262
- raise final_method_error.new("cannot redefine '#{method_name}' because it is already defined as final #{method_type} method in parent #{parent}.")
264
+ unless get_first_final_method_definition(parent, final_methods, method_name).nil? # defined here
265
+ final_method_error = method_type.eql?('class') ? FinalClassMethodRedefinitionError : FinalInstanceMethodRedefinitionError
266
+ raise final_method_error.new("cannot redefine '#{method_name}' because it is already defined as final #{method_type} method in parent #{parent}.")
267
+ else
268
+ final_method_error = method_type.eql?('class') ? FinalClassMethodEmptyDefinitionError : FinalInstanceMethodEmptyDefinitionError
269
+ raise final_method_error.new("'#{method_name}' is declared but not defined as final #{method_type} method in parent #{parent} and was attempted to be redefined in child #{self}.")
270
+ end
271
+
263
272
  else
264
273
  unless(parent = get_class_of_final_method(final_methods, method_name, true)).nil?
265
274
  increment_final_method_definition_count(final_methods[parent], method_name)
266
- if((final_method_definition_count(final_methods[parent], method_name)) > 1) && method_type.eql?('class')
267
- final_method_error = method_type.eql?('class') ? FinalClassMethodRedefinitionError : FinalInstanceMethodRedefinitionError
268
- raise final_method_error.new("redefining class method '#{method_name}' in same class but inside child class will yield erroneous effect.")
269
- exit
275
+ if((fmd_count = final_method_definition_count(final_methods[parent], method_name)) == 1)
276
+ store_first_final_method_definition(parent, final_methods, method_name, method_type)
277
+ elsif (fmd_count > 1) && method_type.eql?('class')
278
+ reset_final_method_definition_count(final_methods[parent], method_name)
279
+ class_eval get_first_final_method_definition(parent, final_methods, method_name)
280
+ raise FinalClassMethodRedefinitionError.new("cannot redefine '#{method_name}' because it is already defined as final class method in parent #{parent}.")
270
281
  end
271
282
  end
272
283
  end
@@ -290,13 +301,31 @@ module OOP
290
301
 
291
302
  def increment_final_method_definition_count(method_names, method_name)
292
303
  method_names.each do |mn|
293
- mn[method_name] +=1 if mn.has_key?(method_name)
304
+ mn[method_name][:definition_count] +=1 if mn.has_key?(method_name)
294
305
  end
295
306
  end
296
307
 
297
308
  def final_method_definition_count(method_names, method_name)
298
309
  method_names.each do |mn|
299
- return mn[method_name] if mn.has_key?(method_name)
310
+ return mn[method_name][:definition_count] if mn.has_key?(method_name)
311
+ end
312
+ end
313
+
314
+ def store_first_final_method_definition(context, final_methods, method_name, method_type)
315
+ final_methods[context].each do |mn|
316
+ mn[method_name][:definition_str] = "#{Ruby2Ruby.translate context, "#{"self." if method_type.eql?('class')}#{method_name}"}" if mn.has_key?(method_name)
317
+ end
318
+ end
319
+
320
+ def get_first_final_method_definition(context, final_methods, method_name)
321
+ final_methods[context].each do |mn|
322
+ return mn[method_name][:definition_str] if mn.has_key?(method_name)
323
+ end
324
+ end
325
+
326
+ def reset_final_method_definition_count(method_names, method_name)
327
+ method_names.each do |mn|
328
+ mn[method_name][:definition_count] = 0 if mn.has_key?(method_name)
300
329
  end
301
330
  end
302
331
 
@@ -20,4 +20,14 @@ end
20
20
  # Raised when final instance method declared in parent class
21
21
  # is attempted to be redeclared in child class as final instance method.
22
22
  class FinalInstanceMethodRedeclarationError < FinalMethodError
23
+ end
24
+
25
+ # Raised when final class method is declared but not defined in parent class
26
+ # and is attempted to be defined in child class
27
+ class FinalClassMethodEmptyDefinitionError < FinalMethodError
28
+ end
29
+
30
+ # Raised when final instance method is declared but not defined in parent class
31
+ # and is attempted to be defined in child class
32
+ class FinalInstanceMethodEmptyDefinitionError < FinalMethodError
23
33
  end
@@ -1,7 +1,7 @@
1
1
  module OOP
2
2
  module Concepts
3
3
  module FinalMethodVersion
4
- MAJOR, MINOR, TINY = 0, 6, 0
4
+ MAJOR, MINOR, TINY = 0, 7, 0
5
5
 
6
6
  FINAL_METHOD_VERSION = [MAJOR, MINOR, TINY].join('.')
7
7
  end
@@ -0,0 +1,10 @@
1
+ require 'methodfinalizer'
2
+
3
+ class Dog
4
+ final_class_method :increase_breed_type
5
+ end
6
+
7
+ class ChowChow < Dog
8
+ def self.increase_breed_type
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ require 'methodfinalizer'
2
+
3
+ class Dog
4
+ final_instance_method :wiggle
5
+ end
6
+
7
+ class ChowChow < Dog
8
+ def wiggle
9
+ end
10
+ end
@@ -0,0 +1,15 @@
1
+ # final class method is redefined in child class
2
+ require "methodfinalizer"
3
+
4
+ class Dog
5
+ final_class_methods :bark
6
+ def self.bark
7
+ "aw aw aw!"
8
+ end
9
+ end
10
+
11
+ class ChowChow < Dog
12
+ def Dog.bark
13
+ "meow meow meow!"
14
+ end
15
+ end
@@ -0,0 +1,32 @@
1
+ require 'test/unit'
2
+ require 'final_method/final_method_exceptions'
3
+
4
+ class TestFinalDeclaredButNotDefined < Test::Unit::TestCase
5
+ def test_final_class_method_called_with_no_method_arguments
6
+ assert_raises FinalClassMethodEmptyDefinitionError do
7
+ require "test_classes_files/final_class_method_files/final_class_method_declared_but_not_defined"
8
+ end
9
+ end
10
+
11
+ def test_final_instance_method_called_with_no_method_arguments
12
+ assert_raises FinalInstanceMethodEmptyDefinitionError do
13
+ require "test_classes_files/final_instance_method_files/final_instance_method_declared_but_not_defined"
14
+ end
15
+ end
16
+
17
+ def test_final_class_method_called_with_no_method_arguments_with_rescue
18
+ begin
19
+ require "test_classes_files/final_class_method_files/final_class_method_declared_but_not_defined"
20
+ rescue
21
+ assert !ChowChow.respond_to?(:increase_breed_type)
22
+ end
23
+ end
24
+
25
+ def test_final_instance_method_called_with_no_method_arguments_with_rescue
26
+ begin
27
+ require "test_classes_files/final_instance_method_files/final_instance_method_declared_but_not_defined"
28
+ rescue
29
+ assert !ChowChow.new.respond_to?(:wiggle)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,20 @@
1
+ require 'test/unit'
2
+ require 'methodfinalizer'
3
+
4
+ class TestSpecialClassMethodRedefinition < Test::Unit::TestCase
5
+ def test_require_without_rescue
6
+ assert_raises FinalClassMethodRedefinitionError do
7
+ require "test_classes_files/special_class_method_redefinition"
8
+ end
9
+ end
10
+
11
+ def test_require_with_rescue
12
+ begin
13
+ require "test_classes_files/special_class_method_redefinition"
14
+ rescue
15
+ assert_equal "aw aw aw!", Dog.bark # redefinition is handled by 'methodfinalizer'
16
+ assert_equal "aw aw aw!", ChowChow.bark
17
+ assert_not_equal "meow meow meow!", ChowChow.bark
18
+ end
19
+ end
20
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: methodfinalizer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wilfrido T. Nuqui Jr.
@@ -9,9 +9,19 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-03-24 00:00:00 +08:00
12
+ date: 2009-03-26 00:00:00 +08:00
13
13
  default_executable:
14
14
  dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: ruby2ruby
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - "="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.2.2
24
+ version:
15
25
  - !ruby/object:Gem::Dependency
16
26
  name: hoe
17
27
  type: :development
@@ -44,14 +54,19 @@ files:
44
54
  - lib/final_method/final_method.rb
45
55
  - lib/final_method/final_method_version.rb
46
56
  - lib/final_method/final_method_exceptions.rb
57
+ - test/test_final_declared_but_not_defined.rb
47
58
  - test/test_method_finalizer.rb
48
59
  - test/test_method_finalizer_usage.rb
60
+ - test/test_special_class_method_redefinition.rb
49
61
  - test/test_classes_files/method_finalizer_usage.rb
62
+ - test/test_classes_files/special_class_method_redefinition.rb
50
63
  - test/test_classes_files/final_class_method_files/final_class_method_called_with_no_method_arguments.rb
64
+ - test/test_classes_files/final_class_method_files/final_class_method_declared_but_not_defined.rb
51
65
  - test/test_classes_files/final_class_method_files/redeclared_final_class_methods_in_child.rb
52
66
  - test/test_classes_files/final_class_method_files/redefined_final_class_method_in_child_class_using_parent.rb
53
67
  - test/test_classes_files/final_class_method_files/redefined_final_class_method_in_child_class.rb
54
68
  - test/test_classes_files/final_instance_method_files/final_instance_method_called_with_no_method_arguments.rb
69
+ - test/test_classes_files/final_instance_method_files/final_instance_method_declared_but_not_defined.rb
55
70
  - test/test_classes_files/final_instance_method_files/redeclared_final_instance_methods_in_child.rb
56
71
  - test/test_classes_files/final_instance_method_files/redefined_final_instance_method_in_child_instance_using_parent.rb
57
72
  - test/test_classes_files/final_instance_method_files/redefined_final_instance_method_in_child_class.rb
@@ -83,5 +98,7 @@ signing_key:
83
98
  specification_version: 2
84
99
  summary: "'methodfinalizer' is a gem that allows you to declare final class and instance methods in your ruby program."
85
100
  test_files:
101
+ - test/test_final_declared_but_not_defined.rb
102
+ - test/test_special_class_method_redefinition.rb
86
103
  - test/test_method_finalizer_usage.rb
87
104
  - test/test_method_finalizer.rb