kinda-core 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -1,6 +1,3 @@
1
- Author:: Manuel Vila (mailto:mvila@3base.com)
2
- License:: Don't know yet
3
-
4
1
  = Core
5
2
 
6
3
  Basic helpers used by other kinda projects.
@@ -11,4 +8,4 @@ Basic helpers used by other kinda projects.
11
8
 
12
9
  == Usage
13
10
 
14
- Still very alpha so documentation will come later.
11
+ Still very alpha, documentation will come later.
data/Rakefile ADDED
@@ -0,0 +1,20 @@
1
+ require "rake/testtask"
2
+
3
+ begin
4
+ require "hanna/rdoctask"
5
+ rescue LoadError
6
+ require "rake/rdoctask"
7
+ end
8
+
9
+ task :default => [:test]
10
+
11
+ Rake::TestTask.new do |t|
12
+ t.test_files = Dir["test/*_test.rb"]
13
+ end
14
+
15
+ Rake::RDocTask.new do |t|
16
+ t.title = "Core Documentation"
17
+ t.main = "README.rdoc"
18
+ t.rdoc_files.include("README.rdoc", "lib/**/*.rb")
19
+ t.rdoc_dir = "doc"
20
+ end
data/lib/core.rb CHANGED
@@ -1,8 +1,10 @@
1
1
  require File.join(File.dirname(__FILE__), 'core', 'module')
2
+ require File.join(File.dirname(__FILE__), 'core', 'object')
2
3
  ruby_files = Dir.glob(File.join(File.dirname(__FILE__), 'core', '*.rb'))
3
4
  ruby_files.each { |file| require file }
4
5
 
5
- module Kinda
6
+ module Kinda #:nodoc:
7
+ # Basic helpers used by other kinda projects
6
8
  module Core
7
9
  include Accessor
8
10
  include Forwardable
data/lib/core/accessor.rb CHANGED
@@ -1,14 +1,8 @@
1
- module Kinda
2
- module Core
1
+ module Kinda #:nodoc:
2
+ module Core #:nodoc:
3
+ # Improves the Ruby buit-in accessor methods
3
4
  module Accessor
4
- module ClassMethods
5
- # attr_reader(:name, :age, :size)
6
- # attr_reader(:name => :@name) is the default behaviour but you can use:
7
- # attr_reader (:name => @the_name) to use a different instance variable
8
- # attr_reader(:name => :first_name) or even an another attribute.
9
- # But more interesting, you can delegate to another object:
10
- # attr_reader(:name => [:father, :name])
11
- # attr_reader(:name => [:mother, :husband, :name])
5
+ ClassMethods = inheritable_extend do
12
6
  def __attr_reader__(*attributes, with_filter, &block)
13
7
  attributes.each do |attribute|
14
8
  if attribute.is_a?(Hash)
@@ -17,7 +11,7 @@ module Kinda
17
11
  source = "@#{attribute}"
18
12
  end
19
13
  proc = if with_filter || !block
20
- ::Proc.new do |*args|
14
+ Proc.new do |*args|
21
15
  return send("#{attribute}=", *args) unless args.empty?
22
16
  value = if source[0] == '@'
23
17
  instance_variable_get(source)
@@ -31,10 +25,19 @@ module Kinda
31
25
  else
32
26
  block
33
27
  end
34
- to_class.send(:define_method, attribute, &proc)
28
+ send(:define_method, attribute, &proc)
35
29
  end
36
30
  end
31
+
32
+ private :__attr_reader__
37
33
 
34
+ # attr_reader(:name, :age, :size)
35
+ # attr_reader(:name => :@name) is the default behaviour but you can use:
36
+ # attr_reader (:name => @the_name) to use a different instance variable
37
+ # attr_reader(:name => :first_name) or even an another attribute.
38
+ # More interesting, you can delegate to another object:
39
+ # attr_reader(:name => [:father, :name])
40
+ # attr_reader(:name => [:mother, :husband, :name])
38
41
  def attr_reader(*attributes, &block)
39
42
  __attr_reader__(*attributes, false, &block)
40
43
  end
@@ -51,7 +54,7 @@ module Kinda
51
54
  target = "@#{attribute}"
52
55
  end
53
56
  proc = if with_filter || !block
54
- ::Proc.new do |value|
57
+ Proc.new do |value|
55
58
  value = instance_exec(value, &block) if block
56
59
  if target[0] == '@'
57
60
  instance_variable_set(target, value)
@@ -64,9 +67,11 @@ module Kinda
64
67
  else
65
68
  block
66
69
  end
67
- to_class.send(:define_method, "#{attribute}=", &proc)
70
+ send(:define_method, "#{attribute}=", &proc)
68
71
  end
69
72
  end
73
+
74
+ private :__attr_writer__
70
75
 
71
76
  def attr_writer(*attributes, &block)
72
77
  __attr_writer__(*attributes, false, &block)
@@ -103,8 +108,7 @@ module Kinda
103
108
  end
104
109
  end
105
110
 
106
- include ClassMethods
107
- inheritable_extension ClassMethods
111
+ delegate_to_class ClassMethods.public_instance_methods
108
112
  end
109
113
  end
110
114
  end
@@ -3,7 +3,7 @@ require 'forwardable'
3
3
  module Kinda
4
4
  module Core
5
5
  module Forwardable
6
- module ClassMethods
6
+ ClassMethods = inheritable_extend do
7
7
  include ::Forwardable
8
8
 
9
9
  # Add a nice way to specify a different method for the accessor:
@@ -19,7 +19,7 @@ module Kinda
19
19
  end
20
20
  end
21
21
  end
22
-
22
+
23
23
  alias_method :delegate, :instance_delegate
24
24
 
25
25
  # Create both reader and writer delegate
@@ -79,8 +79,7 @@ module Kinda
79
79
  end
80
80
  end
81
81
 
82
- include ClassMethods
83
- inheritable_extension ClassMethods
82
+ delegate_to_class ClassMethods.public_instance_methods
84
83
  end
85
84
  end
86
85
  end
data/lib/core/functor.rb CHANGED
@@ -1,7 +1,7 @@
1
- # Thomas Sawyer's Functor Class slightly modified for Ruby 1.9
2
- # http://facets.rubyforge.org/apidoc/api/core/classes/Functor.html
3
1
  module Kinda
4
2
  module Core
3
+ # Thomas Sawyer's Functor Class slightly modified for Ruby 1.9
4
+ # http://facets.rubyforge.org/apidoc/api/core/classes/Functor.html
5
5
  class Functor < BasicObject
6
6
  def initialize(&proc)
7
7
  @proc = proc
data/lib/core/hash.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Kinda
2
2
  module Core
3
- module Hash
3
+ module HashExtension
4
4
  def delete_value(value)
5
5
  delete_if { |k, v| v == value }
6
6
  end
@@ -8,6 +8,6 @@ module Kinda
8
8
  end
9
9
  end
10
10
 
11
- class Hash
12
- include Kinda::Core::Hash
11
+ class Hash #:nodoc:
12
+ include Kinda::Core::HashExtension
13
13
  end
data/lib/core/module.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  module Kinda
2
2
  module Core
3
- module Module
3
+ module ModuleExtension
4
4
  def self.included(klass)
5
- klass.alias_method_chain :append_features, :module_extensions
5
+ klass.alias_method_chain :append_features, :inheritable_extensions
6
6
  end
7
7
 
8
8
  def alias_method_chain(target, feature)
@@ -37,22 +37,34 @@ module Kinda
37
37
  singleton_class.ancestors.take_while { |mod| !mod.is_a?(Class) }
38
38
  end
39
39
 
40
- def inheritable_extension(*mods)
41
- (@inheritable_extensions ||= []).unshift(mods.reverse).flatten!.uniq!
40
+ def inheritable_extend(*mods, &block)
41
+ if block
42
+ mod = Module.new
43
+ mod.extend extensions
44
+ mod.module_eval(&block)
45
+ mods << mod
46
+ end
47
+ extend *mods
48
+ (@inheritable_extensions ||= []).unshift(*mods.reverse).uniq!
49
+ mod
42
50
  end
43
51
 
44
- def append_features_with_module_extensions(target)
45
- append_features_without_module_extensions(target)
52
+ def append_features_with_inheritable_extensions(target)
53
+ append_features_without_inheritable_extensions(target)
46
54
  if @inheritable_extensions
47
55
  target.extend *@inheritable_extensions
48
- target.inheritable_extension *@inheritable_extensions.reverse
56
+ target.inheritable_extend *@inheritable_extensions.reverse
49
57
  end
50
58
  end
51
59
 
52
- def delegate_to_class(source, target=source)
53
- define_method(source) do |*args, &block|
54
- singleton_class_eval do
55
- send(target, *args, &block)
60
+ # delegate_to_class :singleton_method_added => :method_added
61
+ # delegate_to_class [:attr_reader, :attr_writer]
62
+ # delegate_to_class ClassMethods.instance_methods
63
+ def delegate_to_class(*sources)
64
+ sources, target = sources.first.first if sources.first.is_a?(Hash)
65
+ [*sources].flatten.each do |source|
66
+ define_method(source) do |*args, &block|
67
+ singleton_class_send(target || source, *args, &block)
56
68
  end
57
69
  end
58
70
  end
@@ -75,7 +87,7 @@ module Kinda
75
87
  end
76
88
  end
77
89
 
78
- class Module
79
- include Kinda::Core::Module
90
+ class Module #:nodoc:
91
+ include Kinda::Core::ModuleExtension
80
92
  end
81
93
 
data/lib/core/object.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Kinda
2
2
  module Core
3
- module Object
3
+ module ObjectExtension
4
4
  def self.included(klass)
5
5
  klass.alias_method_chain :extend, :flexible_arguments
6
6
  end
@@ -17,6 +17,10 @@ module Kinda
17
17
  singleton_class.class_eval(&block)
18
18
  end
19
19
 
20
+ def singleton_class_send(method_name, *args, &block)
21
+ singleton_class_eval { send(method_name, *args, &block) }
22
+ end
23
+
20
24
  def to_class
21
25
  kind_of?(Module) ? self : singleton_class
22
26
  end
@@ -58,6 +62,6 @@ module Kinda
58
62
  end
59
63
  end
60
64
 
61
- class Object
62
- include Kinda::Core::Object
65
+ class Object #:nodoc:
66
+ include Kinda::Core::ObjectExtension
63
67
  end
data/lib/core/proc.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Kinda
2
2
  module Core
3
- module Proc
3
+ module ProcExtension
4
4
  def call_with_this(this, *args, &block)
5
5
  binding_self = binding.eval('self')
6
6
  binding_self.push_this(this)
@@ -12,6 +12,6 @@ module Kinda
12
12
  end
13
13
  end
14
14
 
15
- class Proc
16
- include Kinda::Core::Proc
15
+ class Proc #:nodoc:
16
+ include Kinda::Core::ProcExtension
17
17
  end
data/lib/core/this.rb CHANGED
@@ -57,6 +57,6 @@ module Kinda
57
57
  end
58
58
  end
59
59
 
60
- class Object
60
+ class Object #:nodoc:
61
61
  include Kinda::Core::This
62
62
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kinda-core
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
  - Manuel Vila
@@ -22,7 +22,9 @@ extensions: []
22
22
  extra_rdoc_files:
23
23
  - README.rdoc
24
24
  files:
25
+ - Rakefile
25
26
  - lib/core.rb
27
+ - lib/kinda-core.rb
26
28
  - lib/core/accessor.rb
27
29
  - lib/core/forwardable.rb
28
30
  - lib/core/functor.rb
@@ -32,10 +34,10 @@ files:
32
34
  - lib/core/object.rb
33
35
  - lib/core/proc.rb
34
36
  - lib/core/this.rb
35
- - lib/kinda-core.rb
36
37
  - README.rdoc
37
38
  has_rdoc: true
38
39
  homepage: http://github.com/kinda/core
40
+ licenses:
39
41
  post_install_message:
40
42
  rdoc_options: []
41
43
 
@@ -56,7 +58,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
56
58
  requirements: []
57
59
 
58
60
  rubyforge_project: kinda-core
59
- rubygems_version: 1.2.0
61
+ rubygems_version: 1.3.5
60
62
  signing_key:
61
63
  specification_version: 2
62
64
  summary: Basic helpers used by other kinda projects