nakajima-fixjour 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -54,8 +54,7 @@ module Fixjour
54
54
  # Defines the new_* method
55
55
  def define_new(name, &block)
56
56
  define_method("new_#{name}") do |*args|
57
- overrides = args.first || { }
58
- overrides.extend(OverrideProcessing)
57
+ overrides = OverridesHash.new(args.first || { })
59
58
  result = block.bind(self).call(overrides)
60
59
  result
61
60
  end
@@ -94,13 +93,5 @@ module Fixjour
94
93
  klass.new
95
94
  end
96
95
  end
97
-
98
- module OverrideProcessing
99
- def process(key)
100
- if value = delete(key)
101
- yield value
102
- end
103
- end
104
- end
105
96
  end
106
97
  end
@@ -0,0 +1,15 @@
1
+ module Fixjour
2
+ class OverridesHash < Hash
3
+ private :delete
4
+
5
+ def initialize(hash)
6
+ replace(hash)
7
+ end
8
+
9
+ def process(option)
10
+ if value = delete(option)
11
+ yield value if block_given?
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,36 @@
1
+ module Fixjour
2
+ # Raised when a builder is defined for a class that already
3
+ # has one.
4
+ class RedundantBuilder < StandardError; end
5
+
6
+ def self.included(klass)
7
+ klass.extend(RedundancyChecker)
8
+ end
9
+
10
+ def self.builder_defined?(builder)
11
+ case builder
12
+ when Class then builders.include?(builders)
13
+ when String, Symbol then builders.map(&:name).include?(builder)
14
+ end
15
+ end
16
+
17
+ module RedundancyChecker
18
+ BUILDER_METHOD_PATTERN = /^(new|create|valid)_(\w+)(_attributes)?$/
19
+
20
+ def method_added(sym)
21
+ name = sym.to_s
22
+
23
+ if klass_name = get_klass_name(name)
24
+ if Fixjour.builder_defined?(klass_name)
25
+ raise RedundantBuilder.new("You already defined a builder for #{inspect}")
26
+ end
27
+ end
28
+ end
29
+
30
+ def get_klass_name(name)
31
+ if match = name.match(BUILDER_METHOD_PATTERN)
32
+ match[2].classify.gsub(/Attribute$/, '')
33
+ end
34
+ end
35
+ end
36
+ end
data/lib/fixjour.rb CHANGED
@@ -4,6 +4,7 @@ require 'rubygems'
4
4
  require 'activerecord'
5
5
  require 'core_ext/hash'
6
6
  require 'fixjour/redundant_check'
7
+ require 'fixjour/overrides_hash'
7
8
  require 'fixjour/verify'
8
9
  require 'fixjour/errors'
9
10
  require 'fixjour/builders'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nakajima-fixjour
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pat Nakajima
@@ -36,6 +36,8 @@ files:
36
36
  - lib/fixjour/builders.rb
37
37
  - lib/fixjour/errors.rb
38
38
  - lib/fixjour/verify.rb
39
+ - lib/fixjour/redundant_check.rb
40
+ - lib/fixjour/overrides_hash.rb
39
41
  - lib/fixjour.rb
40
42
  has_rdoc: true
41
43
  homepage: http://github.com/nakajima/fixjour