object_extender 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ M2M1MWRmMGIwNGI1ODQ5NGE4NGE4NTllOTMxNGNkYjU2YmJkMjRhZg==
5
+ data.tar.gz: !binary |-
6
+ YTE2ZTJhOTRhZWNmNDY0YzBmNTFiZDUxNWQ0N2IwMjQxZjIzYzE2OA==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ ZTc0M2I1NmYzNzMxMzk5OTRjYmNkNzE1ODJkMWYyYjY4ZmU3YTMyZGI1ZmY1
10
+ YTIyN2IxNjc0ZjNjNjIxMjQ2M2FjNTJjMjAxYzllZTE3MzdkNzk0ODYwYjM3
11
+ NWE4MTdkOGUwODA4MDdiZmU1M2MzZWZhNjgxNzFlNWU2NjM4MDE=
12
+ data.tar.gz: !binary |-
13
+ MTZjNjFmYjZlY2Y5ZjU5N2RiODI4MjY3MDk4N2U1NjBiNzU1ZTc1YmViOTU3
14
+ YTg4NTZjOGVlNThmNmU4MmFhYWZhMWExYWQ5YmFjNDQ3MmJjOTk1MDE0OWE2
15
+ MjhkNjNmMmYyMDUyNGMzNWNiMGFjNzdhODg3YTRmMTJjZjljMDM=
@@ -0,0 +1,2 @@
1
+ .DS_Store
2
+ /*.gem
@@ -0,0 +1,13 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.2
4
+ - 2.2
5
+ script: rake test
6
+
7
+ deploy:
8
+ provider: rubygems
9
+ api_key:
10
+ secure: iPLvtMc8QsgXQ/M9fUcRDuuURC+GWLIAoJvYM5qIPNbMrQi5Q66Vd2j63msycg0cITS6D0YqcepJ8iszy0uQsHaZvz4JFwK+LhA7L9gqFl3T9J6H3BgHsnCcbpI163VsB6rAnIAxX+ifCeWvb9mBwgZ1rLr6x08RsnyqWCxsJXOe9AlmrB3rmRelTA4rJ5GBcNmVxPAl564RZyh+fUDaDwo6oHer4ZVwVvgQZssYMCzljTyWa03wjbl+jPfoWETkdmt66h4i6/hkP2AGXsDeWW8Q2cN2xM0u2nzFkY3KtMtkm8nJKt5RUsUV9djYqWoQLlKVq8Olb8Oc0od8NgVl2IodsSkNAslBO70a38IH9Ch0CQ7kuvdP+aX/TLxbhkZeY79jqe3saQxHZx8uPv6W4OgvlapBd3Q5eqcrRVPx+z7CGy5mLeLLphCj7reEZxNVMCfmVz4f0GpHn3XwlDU/C610avJIHoOHhlLB2qbHh5JXF/SnBP+x0B89UPVdq1aoIoGCkf4Xf16fZKpdbvYz4JqQI62q5iEVZ5TvWwaCs1FdAzgZR0uFQUlaIvhkXOWLITYeWiN2JU2vAv4ukclWfNLxj4R5ue5V3fI+j5Szcib3eUqVHk97bthVZd2fyR86l9wy7YMoclkhZogMDu0Sexd2Y/RkXSNtpBFYBUnfaJM=
11
+ gemspec: object_extender.gemspec
12
+ on:
13
+ branch: master
@@ -0,0 +1,40 @@
1
+ # Object Extender Gem
2
+
3
+ Call class statements with extended object.
4
+
5
+ - http://github.com/masuidrive/object_extender_rb
6
+ - License: MIT
7
+ - Author: Yuichiro MASUI <masui@masuidrive.jp>
8
+
9
+
10
+ ## Getting Started
11
+
12
+ ```
13
+ require 'object_extender'
14
+
15
+ module AddFooAssoc
16
+ extend ObjectExtender
17
+
18
+ extended_class do
19
+ attr_accessor :foo
20
+ end
21
+
22
+ extended do
23
+ self.foo = :Foo
24
+ end
25
+ end
26
+
27
+ obj = Object.new
28
+ # obj.foo = :Foo => NoMethodError
29
+
30
+ obj.extend(AddFooAssoc)
31
+ obj.foo
32
+ obj.foo = :Bar
33
+
34
+ # Same as
35
+ obj = Object.new
36
+ obj.singleton_class.class_eval do
37
+ attr_accessor :foo
38
+ end
39
+ obj.foo = :Bar
40
+ ```
@@ -0,0 +1,8 @@
1
+ require 'rake/testtask'
2
+
3
+ Rake::TestTask.new do |t|
4
+ t.libs << 'test'
5
+ end
6
+
7
+ desc "Run tests"
8
+ task :default => :test
@@ -0,0 +1,54 @@
1
+ # This module is `ActiveSupport::Concern` for instance.
2
+ #
3
+ # module Foo
4
+ # extend ObjectExtender
5
+ # extended_class do
6
+ # attr_accessor :bar
7
+ # end
8
+ # extended do
9
+ # puts :extended
10
+ # end
11
+ # def foo; p @bar; end
12
+ # end
13
+ #
14
+ # obj = Object.new.extend(Foo)
15
+ # obj.bar = :Foo
16
+ # obj.foo
17
+ #
18
+ # References:
19
+ # - https://github.com/rails/rails/blob/master/activesupport/lib/active_support/concern.rb
20
+ #
21
+ require "object_extender/version"
22
+
23
+ module ObjectExtender
24
+ class MultipleExtendedClassBlocks < StandardError #:nodoc:
25
+ def initialize
26
+ super "Cannot define multiple 'extended_class' blocks"
27
+ end
28
+ end
29
+
30
+ class MultipleExtendedBlocks < StandardError #:nodoc:
31
+ def initialize
32
+ super "Cannot define multiple 'extended' blocks"
33
+ end
34
+ end
35
+
36
+ def extended(obj = nil, &block)
37
+ if obj.nil?
38
+ fail MultipleExtendedBlocks if instance_variable_defined?(:@_extended_block)
39
+ @_extended_block = block
40
+ else
41
+ if instance_variable_defined?(:@_extended_class_block)
42
+ obj.singleton_class.class_eval(&@_extended_class_block)
43
+ end
44
+ if instance_variable_defined?(:@_extended_block)
45
+ obj.instance_eval(&@_extended_block)
46
+ end
47
+ end
48
+ end
49
+
50
+ def extended_class(&block)
51
+ fail MultipleExtendedClassBlocks if instance_variable_defined?(:@_extended_class_block)
52
+ @_extended_class_block = block
53
+ end
54
+ end
@@ -0,0 +1,3 @@
1
+ module ObjectExtender
2
+ VERSION = '1.0.0'
3
+ end
@@ -0,0 +1,24 @@
1
+ lib = File.expand_path("../lib", __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'object_extender/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "object_extender"
7
+ spec.version = ObjectExtender::VERSION
8
+ spec.authors = ['Yuichiro MASUI']
9
+ spec.email = 'masui@masuidrive.jp'
10
+ spec.summary = 'Call class statements with extended object. It\'s without class pollution.'
11
+ spec.description = 'Call class statements with extended object. It\'s without class pollution.'
12
+
13
+ spec.homepage = "https://github.com/masuidrive/object_extender_rb"
14
+ spec.license = "MIT"
15
+
16
+ spec.required_ruby_version = '>= 1.9.2'
17
+
18
+ spec.files = `git ls-files`.split($/)
19
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
20
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
21
+ spec.require_paths = ['lib']
22
+
23
+ spec.add_development_dependency 'rake'
24
+ end
@@ -0,0 +1,113 @@
1
+ require 'test/unit'
2
+ require 'object_extender'
3
+
4
+ class ObjectExtenderTest < Test::Unit::TestCase
5
+ def test_without_ext
6
+ obj = Object.new
7
+ assert_raise NoMethodError do
8
+ obj.foo
9
+ end
10
+ assert_raise NoMethodError do
11
+ obj.bar
12
+ end
13
+ end
14
+
15
+ module WithCallingClassMethod
16
+ extend ObjectExtender
17
+ extended_class do
18
+ attr_accessor :foo
19
+ end
20
+ end
21
+
22
+ def test_with_calling_class_method
23
+ obj = Object.new
24
+ assert_equal obj, obj.extend(WithCallingClassMethod)
25
+ assert_nil obj.foo
26
+ obj.foo = :Foo
27
+ assert_equal :Foo, obj.foo
28
+
29
+ test_without_ext
30
+ end
31
+
32
+ module WithDefineMethod
33
+ extend ObjectExtender
34
+ def bar
35
+ :Bar
36
+ end
37
+ end
38
+
39
+ def test_with_define_method
40
+ obj = Object.new
41
+ assert_equal obj, obj.extend(WithDefineMethod)
42
+ assert_equal :Bar, obj.bar
43
+
44
+ test_without_ext
45
+ end
46
+
47
+ module WithCallingExtended
48
+ extend ObjectExtender
49
+ extended do
50
+ self.foo = :FooFoo
51
+ end
52
+ end
53
+
54
+ module WithCallingExtendedAndExtendedClass
55
+ extend ObjectExtender
56
+ extended_class do
57
+ attr_accessor :foo
58
+ end
59
+ extended do
60
+ self.foo = :FooFooFoo
61
+ end
62
+ end
63
+
64
+ def test_with_extended
65
+ obj = Object.new
66
+ assert_equal obj, obj.extend(WithCallingExtendedAndExtendedClass)
67
+ assert_equal :FooFooFoo, obj.foo
68
+
69
+ test_without_ext
70
+ end
71
+
72
+ def test_with_extended_and_extended_class
73
+ obj = Object.new
74
+ assert_equal obj, obj.extend(WithCallingClassMethod)
75
+ assert_equal obj, obj.extend(WithCallingExtended)
76
+ assert_equal :FooFoo, obj.foo
77
+
78
+ test_without_ext
79
+ end
80
+
81
+ def test_with_multiple_extended
82
+ obj = Object.new
83
+ assert_equal obj, obj.extend(WithCallingExtendedAndExtendedClass)
84
+ assert_equal obj, obj.extend(WithCallingExtended)
85
+ assert_equal :FooFoo, obj.foo
86
+
87
+ test_without_ext
88
+ end
89
+
90
+ def test_multiple_extended
91
+ assert_raises(ObjectExtender::MultipleExtendedBlocks) do
92
+ Module.new do
93
+ extend ObjectExtender
94
+ extended do
95
+ end
96
+ extended do
97
+ end
98
+ end
99
+ end
100
+ end
101
+
102
+ def test_multiple_extended_class
103
+ assert_raises(ObjectExtender::MultipleExtendedClassBlocks) do
104
+ Module.new do
105
+ extend ObjectExtender
106
+ extended_class do
107
+ end
108
+ extended_class do
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: object_extender
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Yuichiro MASUI
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-02-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: Call class statements with extended object. It's without class pollution.
28
+ email: masui@masuidrive.jp
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - .gitignore
34
+ - .travis.yml
35
+ - README.md
36
+ - Rakefile
37
+ - lib/object_extender.rb
38
+ - lib/object_extender/version.rb
39
+ - object_extender.gemspec
40
+ - test/test_object_extender.rb
41
+ homepage: https://github.com/masuidrive/object_extender_rb
42
+ licenses:
43
+ - MIT
44
+ metadata: {}
45
+ post_install_message:
46
+ rdoc_options: []
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: 1.9.2
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ! '>='
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ requirements: []
60
+ rubyforge_project:
61
+ rubygems_version: 2.4.5
62
+ signing_key:
63
+ specification_version: 4
64
+ summary: Call class statements with extended object. It's without class pollution.
65
+ test_files:
66
+ - test/test_object_extender.rb