metafun 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ old/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in metafun.gemspec
4
+ gemspec
data/README.rdoc ADDED
@@ -0,0 +1,33 @@
1
+ = Metafun
2
+
3
+ A library for extending Ruby native metaprogramming capabilities
4
+
5
+ == Install
6
+
7
+ Currently not deployed as a gem
8
+
9
+ == Usage
10
+
11
+ === Delegator
12
+
13
+ Delegator delegates easily methods from a given module into a target object. The delegated methods have private access to the original module properties. Its main purpose is to easy deploy DSLs
14
+
15
+ require "metafun/delegator"
16
+
17
+ extend Metafun::Delegator
18
+
19
+ module TheModule
20
+ @@local_var = "Hello delegation"
21
+ def self.take_action
22
+ @@local_var
23
+ end
24
+ end
25
+
26
+ delegate TheModule, :take_action
27
+
28
+ puts take_action # At this stage, this is exactly the same
29
+ # as calling TheModule.take_action
30
+
31
+ Copyright 2011 Xavier Via
32
+
33
+ GPL License
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,48 @@
1
+ Feature: Delegate Module or Class methods to main Object
2
+ In order to create DSLs from modules
3
+ As a gem developer
4
+ I want to delegate their methods to main Object
5
+
6
+ Scenario: Delegate a single "Hello World" method from a module
7
+ Given a module with the :greet method which returns "Hello World!"
8
+ And I included the Delegator in the class
9
+ When I delegate :greet into the class
10
+ And I execute :greet in the class
11
+ Then I should get "Hello World!"
12
+
13
+ Scenario: Make the same delegation into an object
14
+ Given a module with the :greet method which returns "Hello World!"
15
+ And I included the Delegator in the object
16
+ When I delegate :greet into the object
17
+ And I execute :greet in the object
18
+ Then I should get "Hello World!"
19
+
20
+ Scenario: Delegate into a class a method that receives a block
21
+ Given a module with the :with_block method that receives a block and returns its result
22
+ And I included the Delegator in the class
23
+ When I delegate :with_block into the class
24
+ And I execute :with_block in the class sending a block that returns "Hello Block!"
25
+ Then I should get "Hello Block!"
26
+
27
+ Scenario: Delegate into an object a method that receives a block
28
+ Given a module with the :with_block method that receives a block and returns its result
29
+ And I included the Delegator in the object
30
+ When I delegate :with_block into the object
31
+ And I execute :with_block in the object sending a block that returns "Hello Block!"
32
+ Then I should get "Hello Block!"
33
+
34
+ Scenario: Check that delegated method have local access to module properties
35
+ Given a module with the :local_check method that returns @@local_var
36
+ And the module @@local_var = "I am a local var, cheers!"
37
+ And I included the Delegator in the class
38
+ When I delegate :local_check into the class
39
+ And I execute :local_check in the class
40
+ Then I should get "I am a local var, cheers!"
41
+
42
+ Scenario: Same as above, in an object
43
+ Given a module with the :local_check method that returns @@local_var
44
+ And the module @@local_var = "I am a local var, cheers!"
45
+ And I included the Delegator in the object
46
+ When I delegate :local_check into the object
47
+ And I execute :local_check in the object
48
+ Then I should get "I am a local var, cheers!"
@@ -0,0 +1,65 @@
1
+ # Given
2
+ Given /a module with the :(.+?) method which returns "(.+?)"$/ do |method, what|
3
+ @the_module = Module.new
4
+ @the_module.module_eval "def self.#{method}; return '#{what}'; end"
5
+ end
6
+
7
+ Given /a module with the :with_block method that receives a block and returns its result/ do
8
+ @the_module = Module.new do
9
+ def self.with_block(&block)
10
+ return yield block
11
+ end
12
+ end
13
+ end
14
+
15
+ Given /a module with the :local_check method that returns @@local_var/ do
16
+ @the_module = Module.new do
17
+ def self.local_check
18
+ @@local_var
19
+ end
20
+ end
21
+ end
22
+
23
+ Given /the module @@local_var = "(.+?)"/ do |text|
24
+ @the_module.module_eval "@@local_var = '#{text}'"
25
+ end
26
+
27
+ Given /I included the Delegator in the class/ do
28
+ @the_class = Class.new
29
+ @the_class.extend Metafun::Delegator
30
+ end
31
+
32
+ Given /I included the Delegator in the object/ do
33
+ @the_object = Object.new
34
+ @the_object.extend Metafun::Delegator
35
+ end
36
+
37
+ # When
38
+ When /I delegate :(.+?) into the class/ do |method_name|
39
+ @the_class.delegate @the_module, method_name.to_sym
40
+ end
41
+
42
+ When /I delegate :(.+?) into the object/ do |method_name|
43
+ @the_object.delegate @the_module, method_name.to_sym
44
+ end
45
+
46
+ When /I execute :(.+?) in the class$/ do |method_name|
47
+ @the_result = @the_class.send method_name.to_sym
48
+ end
49
+
50
+ When /I execute :(.+?) in the object$/ do |method_name|
51
+ @the_result = @the_object.send method_name.to_sym
52
+ end
53
+
54
+ When /I execute :(.+?) in the class sending a block that returns "(.+?)"$/ do |method_name, return_value|
55
+ @the_result = @the_class.send method_name.to_sym do return_value end
56
+ end
57
+
58
+ When /I execute :(.+?) in the object sending a block that returns "(.+?)"$/ do |method_name, return_value|
59
+ @the_result = @the_object.send method_name.to_sym do return_value end
60
+ end
61
+
62
+ # Then
63
+ Then /I should get "(.+?)"$/ do |result|
64
+ @the_result.should == result
65
+ end
@@ -0,0 +1,2 @@
1
+ $LOAD_PATH << File.expand_path("../../../lib", __FILE__)
2
+ require "metafun"
data/lib/metafun.rb ADDED
@@ -0,0 +1 @@
1
+ require "metafun/delegator"
@@ -0,0 +1,11 @@
1
+ module Metafun
2
+ module Delegator
3
+ def delegate(target, *methods)
4
+ methods.each do |method|
5
+ self.class.send :define_method, method do |*a, &b|
6
+ target.send method, *a, &b
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ module Metafun
2
+ VERSION = "0.0.1"
3
+ end
data/metafun.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "metafun/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "metafun"
7
+ s.version = Metafun::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Xavier Via"]
10
+ s.email = ["xavier.via.canel@gmail.com"]
11
+ s.homepage = ""
12
+ s.summary = %q{A library for extending Ruby native metaprogramming capabilities}
13
+ s.description = %q{A library for extending Ruby native metaprogramming capabilities}
14
+
15
+ s.add_development_dependency "cucumber"
16
+ s.add_development_dependency "rspec"
17
+
18
+ s.rubyforge_project = "metafun"
19
+
20
+ s.files = `git ls-files`.split("\n")
21
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
22
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
23
+ s.require_paths = ["lib"]
24
+ end
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: metafun
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Xavier Via
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-08-11 00:00:00.000000000 -03:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: cucumber
17
+ requirement: &22465536 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: *22465536
26
+ - !ruby/object:Gem::Dependency
27
+ name: rspec
28
+ requirement: &22465284 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: *22465284
37
+ description: A library for extending Ruby native metaprogramming capabilities
38
+ email:
39
+ - xavier.via.canel@gmail.com
40
+ executables: []
41
+ extensions: []
42
+ extra_rdoc_files: []
43
+ files:
44
+ - .gitignore
45
+ - Gemfile
46
+ - README.rdoc
47
+ - Rakefile
48
+ - features/delegator.feature
49
+ - features/steps/delegator.rb
50
+ - features/support/env.rb
51
+ - lib/metafun.rb
52
+ - lib/metafun/delegator.rb
53
+ - lib/metafun/version.rb
54
+ - metafun.gemspec
55
+ has_rdoc: true
56
+ homepage: ''
57
+ licenses: []
58
+ post_install_message:
59
+ rdoc_options: []
60
+ require_paths:
61
+ - lib
62
+ required_ruby_version: !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ! '>='
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ required_rubygems_version: !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ! '>='
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ requirements: []
75
+ rubyforge_project: metafun
76
+ rubygems_version: 1.5.2
77
+ signing_key:
78
+ specification_version: 3
79
+ summary: A library for extending Ruby native metaprogramming capabilities
80
+ test_files: []