modularity 0.4.1 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -14,21 +14,21 @@ Models are often concerned with multiple themes like "authentication", "contact
14
14
  a couple of validations and callbacks here, and some method there. Modularity lets you organize your model into multiple
15
15
  partial classes, so each file can deal with a single aspect of your model:
16
16
 
17
- # app/model/user.rb
17
+ # app/models/user.rb
18
18
  class User < ActiveRecord::Base
19
19
  does "user/authentication"
20
20
  does "user/address"
21
21
  end
22
22
 
23
- # app/model/user/authentication.rb
24
- module User::Authentication
23
+ # app/models/user/authentication_trait.rb
24
+ module User::AuthenticationTrait
25
25
  as_trait do
26
26
  # methods, validations, etc. regarding usernames and passwords go here
27
27
  end
28
28
  end
29
29
 
30
- # app/model/user/permissions.rb
31
- module User::Permissions
30
+ # app/models/user/permissions_trait.rb
31
+ module User::PermissionsTrait
32
32
  as_trait do
33
33
  # methods, validations, etc. regarding contact information go here
34
34
  end
@@ -45,13 +45,13 @@ application, allowing you to express your application domain in both classes and
45
45
 
46
46
  Here is an example of a <tt>strip_field</tt> macro, which created setter methods that remove leading and trailing whitespace from newly assigned values:
47
47
 
48
- # app/model/article.rb
48
+ # app/models/article.rb
49
49
  class Article
50
50
  does "strip_fields", :name, :brand
51
51
  end
52
52
 
53
- # app/model/shared/strip_fields.rb
54
- module StripFields
53
+ # app/models/shared/strip_fields_trait.rb
54
+ module StripFieldsTrait
55
55
  as_trait do |*fields|
56
56
  fields.each do |field|
57
57
  define_method("#{field}=") do |value|
@@ -69,12 +69,13 @@ that are re-used from multiple classes.
69
69
  Using a module to add both instance methods and class methods is {very awkward}[http://redcorundum.blogspot.com/2006/06/mixing-in-class-methods.html].
70
70
  Modularity does away with the clutter and lets you say this:
71
71
 
72
- # app/model/model.rb
72
+ # app/models/model.rb
73
73
  class Model
74
74
  does "mixin"
75
75
  end
76
76
 
77
- module Mixins
77
+ # app/models/mixin_trait.rb
78
+ module MixinTrait
78
79
  as_trait do
79
80
  def instance_method
80
81
  # ...
@@ -90,6 +91,11 @@ Modularity does away with the clutter and lets you say this:
90
91
 
91
92
  sudo gem sources -a http://gemcutter.org
92
93
  sudo gem install modularity
94
+
95
+ == Dependencies
96
+
97
+ Modularity requires Ruby 1.8.7. Earlier versions are missing <tt>class_exec</tt>. You might be able to hack in <tt>class_exec</tt>
98
+ using {this}[http://github.com/brynary/rspec/blob/f80d61a399b34f58084a378c85a43a95ff484619/lib/spec/extensions/instance_exec.rb] as a guide, but it's not pretty.
93
99
 
94
100
  == Credits
95
101
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.1
1
+ 0.6.0
data/lib/modularity.rb CHANGED
@@ -1 +1,2 @@
1
1
  require 'modularity/does'
2
+
@@ -1,11 +1,9 @@
1
1
  module Modularity
2
2
  module AsTrait
3
-
4
3
  def as_trait(&block)
5
- @as_trait = block
4
+ @trait_macro = block
6
5
  end
7
-
8
6
  end
9
7
  end
10
8
 
11
- Module.send :include, Modularity::AsTrait
9
+ Object.send :include, Modularity::AsTrait
@@ -1,5 +1,5 @@
1
- require 'modularity/as_trait'
2
1
  require 'modularity/inflector'
2
+ require 'modularity/as_trait'
3
3
 
4
4
  module Modularity
5
5
  module Does
@@ -10,10 +10,9 @@ module Modularity
10
10
 
11
11
  module ClassMethods
12
12
  def does(trait_name, *args)
13
- trait_name = Modularity::Inflector.camelize(trait_name.to_s)
13
+ trait_name = "#{Modularity::Inflector.camelize(trait_name.to_s)}Trait"
14
14
  trait = Modularity::Inflector.constantize(trait_name)
15
- include(trait)
16
- macro = trait.instance_variable_get("@as_trait") or raise "Missing as_trait directive in #{trait_name}"
15
+ macro = trait.instance_variable_get("@trait_macro") or raise "Missing trait directive in #{trait_name}"
17
16
  class_exec(*args, &macro)
18
17
  end
19
18
  end
data/modularity.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{modularity}
8
- s.version = "0.4.1"
8
+ s.version = "0.6.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Henning Koch"]
12
- s.date = %q{2010-02-15}
12
+ s.date = %q{2010-02-18}
13
13
  s.description = %q{Traits and partial classes for Ruby}
14
14
  s.email = %q{github@makandra.de}
15
15
  s.extra_rdoc_files = [
@@ -17,13 +17,13 @@ describe Modularity::AsTrait do
17
17
  describe 'as_trait' do
18
18
 
19
19
  it "should let modules save a proc upon loading" do
20
- Trait.instance_variable_get("@as_trait").call.should == "hi world"
20
+ Trait.instance_variable_get("@trait_macro").call.should == "hi world"
21
21
  end
22
22
 
23
23
  it "should let modules save a proc with parameters upon loading" do
24
- ParametrizedTrait.instance_variable_get("@as_trait").call("jean").should == "hi, jean"
24
+ ParametrizedTrait.instance_variable_get("@trait_macro").call("jean").should == "hi, jean"
25
25
  end
26
26
 
27
27
  end
28
-
28
+
29
29
  end
data/spec/does_spec.rb CHANGED
@@ -1,20 +1,26 @@
1
1
  require File.dirname(__FILE__) + '/spec_helper'
2
2
 
3
- module Trait
4
- as_trait {}
3
+ module SomeTrait
4
+ as_trait do
5
+ some_trait_included
6
+ end
5
7
  end
6
8
 
7
- module Trait::Child
8
- as_trait {}
9
+ module Some
10
+ module ChildTrait
11
+ as_trait do
12
+ some_child_trait_included
13
+ end
14
+ end
9
15
  end
10
16
 
11
- module CallMethod
17
+ module CallMethodTrait
12
18
  as_trait do |field|
13
19
  send(field)
14
20
  end
15
21
  end
16
22
 
17
- module Visibility
23
+ module VisibilityTrait
18
24
  as_trait do
19
25
  def public_method_from_trait
20
26
  end
@@ -27,7 +33,7 @@ module Visibility
27
33
  end
28
34
  end
29
35
 
30
- module DefineConstantMethod
36
+ module DefineConstantMethodTrait
31
37
  as_trait do |name, return_value|
32
38
  define_method name do
33
39
  return_value
@@ -42,17 +48,17 @@ describe Modularity::AsTrait do
42
48
 
43
49
  describe 'does' do
44
50
 
45
- it "should include the named module" do
46
- Doer.should_receive(:include).with(Trait)
51
+ it "should apply the named module" do
52
+ Doer.should_receive(:some_trait_included)
47
53
  Doer.class_eval do
48
- does "trait"
54
+ does "some"
49
55
  end
50
56
  end
51
57
 
52
- it "should include a namespaced module, using slash-notation like require" do
53
- Doer.should_receive(:include).with(Trait::Child)
58
+ it "should apply a namespaced module, using slash-notation like require" do
59
+ Doer.should_receive(:some_child_trait_included)
54
60
  Doer.class_eval do
55
- does "trait/child"
61
+ does "some/child"
56
62
  end
57
63
  end
58
64
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: modularity
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Henning Koch
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-02-15 00:00:00 +01:00
12
+ date: 2010-02-18 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies: []
15
15