internal 0.1.0alpha01 → 0.1.0.alpha2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8beaebb6456b1b31120cf25433dd056d938c0412
4
+ data.tar.gz: a589fef9999659ba706c8e827073afb72e0e32bd
5
+ SHA512:
6
+ metadata.gz: 2b8b04f8deeabe6566294d22d431070e8367a23bb89c649eb893ff00ed53536a90f7c6180ce039ccabb685d8c755ea192b80f3a8470d5fb8827caa9bba236537
7
+ data.tar.gz: 4938ea8d8fe0f5cc0fac99eb4eec1a0f0ff6a73ce7ca6a388cc525327530aa1798e7fa5756d2c35687f9f441693c753c53f3c941193f8b1333226d0094c70c45
data/CHANGELOG.md ADDED
@@ -0,0 +1,16 @@
1
+ # Changelog
2
+
3
+ ### v0.1.0alpha2 / 2014-07-01
4
+
5
+ * 1 major change
6
+
7
+ * Deprecated internal module mixin in favor of module class extension
8
+
9
+ ### v0.1.0alpha01 / 2014-06-30
10
+
11
+ * 2 major changes
12
+
13
+ * Module Internal mixin to add internal methods for singleton classes and objects.
14
+ * Created internal method for singleton classes
15
+ * Create internal method for class instance objects
16
+
data/Gemfile CHANGED
@@ -4,5 +4,11 @@ source 'https://rubygems.org'
4
4
  gemspec
5
5
 
6
6
  gem 'pry'
7
- gem 'pry-debugger'
7
+ gem 'pry-doc'
8
+ if RUBY_VERSION < '2.0.0'
9
+ gem 'pry-debugger'
10
+ else
11
+ gem 'pry-byebug'
12
+ end
8
13
  gem 'pry-stack_explorer'
14
+
data/design_rationale.md CHANGED
@@ -1,9 +1,5 @@
1
- # First Attempt
2
-
3
- This attempt is based on the following concepts:
4
-
5
- 1. Create module Internal to extend a given class 'Foo'
6
- 2. Use protected to define the internal interface
7
- 3. Use binding_of_caller gem to udpate the methods visibility
8
-
9
- ## NOTE: Abandoned since we couldn't get a solution for class methods
1
+ * Extend Module class with new internal method
2
+ * Use binding_of_caller to infer if it is internal or not
3
+ * Create aditional methods:
4
+ * internal_instance_methods
5
+ * internal_methods
data/lib/internal.rb CHANGED
@@ -1,86 +1,5 @@
1
1
  require 'internal/version'
2
- require 'binding_of_caller'
2
+ require 'module'
3
3
 
4
4
  module Internal
5
- def caller_internal?
6
- caller_namespace_root == class_namespace_root
7
- end
8
- private :caller_internal?
9
-
10
- def caller_namespace_root
11
- namespace_root binding.of_caller(3).eval('self.class.name')
12
- end
13
- private :caller_namespace_root
14
-
15
- def class_namespace_root
16
- namespace_root self.name
17
- end
18
- private :class_namespace_root
19
-
20
- def internal_methods
21
- @internal_methods ||= protected_methods
22
- end
23
- private :internal_methods
24
-
25
- def internal_instance_methods
26
- @internal_instance_methods ||= protected_instance_methods
27
- end
28
- private :internal_instance_methods
29
-
30
- def namespace_root(namespace)
31
- namespace.sub!(/\A([A-Z][a-z_]*)((::.*))*\z/, '\\1')
32
- end
33
- private :namespace_root
34
-
35
- def new *args
36
- caller_internal? ? set_internal_instance_methods_public! : set_internal_instance_methods_protected!
37
- super *args
38
- end
39
- public :new
40
-
41
- def set_internal_class_methods_protected!
42
- internal_methods.each { |m| self.instance_eval("class << self; protected :#{m}; end") }
43
- end
44
- private :set_internal_class_methods_protected!
45
-
46
- def set_internal_class_methods_public!
47
- internal_methods.each { |m| self.instance_eval("class << self; public :#{m}; end") }
48
- end
49
- private :set_internal_class_methods_public!
50
-
51
- def set_internal_instance_methods_protected!
52
- internal_instance_methods.each { |m| protected m }
53
- end
54
- private :set_internal_instance_methods_protected!
55
-
56
- def set_internal_instance_methods_public!
57
- internal_instance_methods.each { |m| public m }
58
- end
59
- private :set_internal_instance_methods_public!
60
-
61
- alias_method :old_public_method_defined?, :public_method_defined?
62
- def public_method_defined?(*args)
63
- old_public_method_defined?(*args)
64
- end
65
- public :public_method_defined?
66
-
67
- alias_method :old_public_methods, :public_methods
68
- def public_methods
69
- ret = old_public_methods
70
- ret << internal_methods if caller_internal?
71
- end
72
- public :public_methods
73
-
74
- alias_method :old_protected_methods, :protected_methods
75
- def protected_methods
76
- caller_internal? ? [] : internal_methods
77
- end
78
- protected :protected_methods
79
-
80
- def work_internal_class_methods!
81
- internal_methods.each do |m|
82
- self.instance_eval("alias_method old_#{m} #{m}; def #{m}(*args); raise NoMethodError if !caller_internal?; old_#{m}(*args); end")
83
- end
84
- end
85
- private :work_internal_class_methods!
86
5
  end
@@ -1,37 +1,33 @@
1
1
  module Internal
2
2
  def self.version
3
- critical = 0 # Broken backwards compatibility of public interface
4
- # Production code based on previous releases maybe be broken by this release
5
- major = 1 # Changed public interface. No backwards compatibility issues.
3
+ # Any third party software should rely only on current major version
4
+ # Any release under the current major release should be good.
5
+ # Use: gem 'internal', '~> 1.0'
6
+ #
7
+ # Any extension to the current gem should rely only on current major and minor release.
8
+ # A Change to the major or minor release can brake the extension
9
+ # Usage: gem 'internal', '~> 1.1.0'
10
+ major = 0 # Broken backwards compatibility of public interface
11
+ # Production code based on previous releases maybe be broken by this release
12
+ minor = 1 # Changed public interface. No backwards compatibility issues.
6
13
  # Production code based on previous releases should not present any issues after upgrade.
7
14
  # Production code based on this release may be broken when using previous releases.
8
- minor = 0 # Changed internal interface
15
+ # Changes to internal interface with broken backwards compatibility
16
+ # Library extensions may be broken
17
+ tiny = 0 # Changed internal interface with backward compatibility
9
18
  # There should be no impact on third party software
10
- # Library extensions using library internal interface may be broken.
11
- patch = nil # Changed private interface (protected and/or private methods). Bug fixes. Refactoring.
12
- # Patch needs to increase for each commit. Patch is a three digits figure.
13
- # No side effects of any sort should be detected
14
- alpha = 1 # First phase of development of new major or critical release
15
- beta = nil # release candidate for first critical release (v0.9.0, v1.0.0.0beta1, v1.0.0)
16
- pre_release = nil # release candidate of new minor releases
17
- release_candidate = nil # Used before releasing new major or critical releases
19
+ # Library extensions using library internal interface are not broken.
20
+ # Changed private interface (protected and/or private methods). Bug fixes. Refactoring.
21
+ # No side effects of any sort should be detected
22
+ alpha = 2 # First phase of development of new major, minor or patch release
23
+ release_candidate = nil # Used before releasing new minor or major releases
18
24
 
19
- version = "#{critical}.#{major}.#{minor}"
20
-
21
- if patch
22
- version += ".#{'%03d' % patch}"
23
- elsif pre_release
24
- version += "pre#{'%02d' % pre_release}"
25
+ "#{major}.#{minor}.#{tiny}" << if alpha
26
+ ".alpha#{alpha}"
25
27
  elsif release_candidate
26
- version += "rc#{release_candidate}"
27
- elsif alpha
28
- version += "alpha#{'%02d' % alpha}"
29
- elsif beta
30
- version += "beta#{beta}"
28
+ ".rc#{release_candidate}"
31
29
  end
32
- version
33
30
  end
34
31
 
35
-
36
- VERSION = version
32
+ VERSION = version.freeze
37
33
  end
data/lib/module.rb ADDED
@@ -0,0 +1,43 @@
1
+ class Module
2
+ def internal_instance_methods
3
+ @@internal_instance_methods ||= []
4
+ end
5
+
6
+ def internal_methods
7
+ @@internal_methods ||= []
8
+ end
9
+
10
+ def internal(meth)
11
+ if caller[0] =~ /\A.*`singletonclass'\z/
12
+ caller_stack = 1
13
+ eval_string = 'self.name'
14
+ internal_instance_methods << meth
15
+ else
16
+ caller_stack = 1
17
+ eval_string = 'self.class.name'
18
+ internal_methods << meth
19
+ end
20
+
21
+ # alias to create instance method alias
22
+ #self.instance_eval("alias_method :__rbint_#{meth}, :#{meth}")
23
+ # same thing as
24
+ alias_method :"__rbint_#{meth}", meth
25
+
26
+ # create class method
27
+ self.class_eval( "def #{meth}
28
+ require 'binding_of_caller'
29
+ cn = binding.of_caller(#{caller_stack}).eval('#{eval_string}')
30
+ a = self.class.namespace_root(cn)
31
+ b = self.class.namespace_root(#{eval_string})
32
+ if a != b
33
+ raise NoMethodError
34
+ end
35
+ send('__rbint_#{meth}')
36
+ end")
37
+ end
38
+
39
+ def namespace_root(namespace)
40
+ namespace.sub!(/\A(([A-Z]{1}[a-z_]*)+)((::.*))*\z/, '\\1')
41
+ end
42
+ public :namespace_root
43
+ end
@@ -0,0 +1,52 @@
1
+ $:.unshift(File.expand_path('../../lib', __FILE__))
2
+
3
+ require 'module'
4
+ require 'minitest'
5
+ require 'minitest/autorun'
6
+ require 'pry'
7
+
8
+ module Foo
9
+ class Foo::Bar
10
+ def bar
11
+ 'bar'
12
+ end
13
+ internal :bar
14
+
15
+ class << self
16
+ def baz
17
+ 'baz'
18
+ end
19
+ internal :baz
20
+ end
21
+ end
22
+ end
23
+
24
+ class Foo::Baz
25
+ def self.baz
26
+ Foo::Bar.baz
27
+ end
28
+
29
+ def bar
30
+ Foo::Bar.new.bar
31
+ end
32
+ end
33
+
34
+ class InternalTest < Minitest::Test
35
+ def test_internal_instance_method_call
36
+ assert_equal 'bar', ::Foo::Baz.new.bar
37
+ end
38
+
39
+ def test_internal_class_method_call
40
+ assert_equal 'baz', ::Foo::Baz.baz
41
+ end
42
+
43
+ def test_external_instance_method_call
44
+ assert_raises(NoMethodError) { Foo::Bar.new.bar }
45
+ end
46
+
47
+ def test_external_class_method_call
48
+ assert_raises(NoMethodError) { Foo::Bar.baz }
49
+ end
50
+ end
51
+
52
+
metadata CHANGED
@@ -1,141 +1,110 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: internal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0alpha01
5
- prerelease: 5
4
+ version: 0.1.0.alpha2
6
5
  platform: ruby
7
6
  authors:
8
7
  - Daniel da Silva Ferreira (dsferreira)
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-06-30 00:00:00.000000000 Z
11
+ date: 2014-07-13 00:00:00.000000000 Z
13
12
  dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: sender
16
- requirement: !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
22
- type: :runtime
23
- prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ! '>='
28
- - !ruby/object:Gem::Version
29
- version: '0'
30
13
  - !ruby/object:Gem::Dependency
31
14
  name: binding_of_caller
32
15
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
16
  requirements:
35
- - - ! '>='
17
+ - - "~>"
36
18
  - !ruby/object:Gem::Version
37
- version: '0'
19
+ version: '0.7'
38
20
  type: :runtime
39
21
  prerelease: false
40
22
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
23
  requirements:
43
- - - ! '>='
24
+ - - "~>"
44
25
  - !ruby/object:Gem::Version
45
- version: '0'
26
+ version: '0.7'
46
27
  - !ruby/object:Gem::Dependency
47
28
  name: bundler
48
29
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
30
  requirements:
51
- - - ~>
31
+ - - "~>"
52
32
  - !ruby/object:Gem::Version
53
33
  version: '1.3'
54
34
  type: :development
55
35
  prerelease: false
56
36
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
37
  requirements:
59
- - - ~>
38
+ - - "~>"
60
39
  - !ruby/object:Gem::Version
61
40
  version: '1.3'
62
41
  - !ruby/object:Gem::Dependency
63
42
  name: rake
64
43
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
44
  requirements:
67
- - - ! '>='
45
+ - - "~>"
68
46
  - !ruby/object:Gem::Version
69
- version: '0'
47
+ version: '10.3'
70
48
  type: :development
71
49
  prerelease: false
72
50
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
51
  requirements:
75
- - - ! '>='
52
+ - - "~>"
76
53
  - !ruby/object:Gem::Version
77
- version: '0'
54
+ version: '10.3'
78
55
  - !ruby/object:Gem::Dependency
79
56
  name: minitest
80
57
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
58
  requirements:
83
- - - ! '>='
59
+ - - "~>"
84
60
  - !ruby/object:Gem::Version
85
- version: '0'
61
+ version: '5.0'
86
62
  type: :development
87
63
  prerelease: false
88
64
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
65
  requirements:
91
- - - ! '>='
66
+ - - "~>"
92
67
  - !ruby/object:Gem::Version
93
- version: '0'
68
+ version: '5.0'
94
69
  description: Internal
95
70
  email:
96
- - danieldasilvaferreira@gmail.com
71
+ - daniel.ferreira@dsferreira.com
97
72
  executables: []
98
73
  extensions: []
99
74
  extra_rdoc_files: []
100
75
  files:
101
- - .gitignore
102
- - .rvmrc
76
+ - CHANGELOG.md
103
77
  - Gemfile
104
78
  - LICENSE.txt
105
79
  - README.md
106
- - Rakefile
107
80
  - design_rationale.md
108
- - internal.gemspec
109
81
  - lib/internal.rb
110
82
  - lib/internal/version.rb
111
- - test/internal_test.rb
112
- homepage: ''
83
+ - lib/module.rb
84
+ - test/module_test.rb
85
+ homepage: http://github.com/dsferreira/internal
113
86
  licenses:
114
87
  - MIT
88
+ metadata: {}
115
89
  post_install_message:
116
90
  rdoc_options: []
117
91
  require_paths:
118
92
  - lib
119
93
  required_ruby_version: !ruby/object:Gem::Requirement
120
- none: false
121
94
  requirements:
122
- - - ! '>='
95
+ - - ">="
123
96
  - !ruby/object:Gem::Version
124
97
  version: '0'
125
- segments:
126
- - 0
127
- hash: 4162978592114588374
128
98
  required_rubygems_version: !ruby/object:Gem::Requirement
129
- none: false
130
99
  requirements:
131
- - - ! '>'
100
+ - - ">"
132
101
  - !ruby/object:Gem::Version
133
102
  version: 1.3.1
134
103
  requirements: []
135
104
  rubyforge_project:
136
- rubygems_version: 1.8.25
105
+ rubygems_version: 2.2.2
137
106
  signing_key:
138
- specification_version: 3
107
+ specification_version: 4
139
108
  summary: Makes a class, module or method internal
140
109
  test_files:
141
- - test/internal_test.rb
110
+ - test/module_test.rb
data/.gitignore DELETED
@@ -1,17 +0,0 @@
1
- *.gem
2
- *.rbc
3
- .bundle
4
- .config
5
- .yardoc
6
- Gemfile.lock
7
- InstalledFiles
8
- _yardoc
9
- coverage
10
- doc/
11
- lib/bundler/man
12
- pkg
13
- rdoc
14
- spec/reports
15
- test/tmp
16
- test/version_tmp
17
- tmp
data/.rvmrc DELETED
@@ -1 +0,0 @@
1
- rvm --create use "ruby-1.9.3-p392@internal"
data/Rakefile DELETED
@@ -1 +0,0 @@
1
- require "bundler/gem_tasks"
data/internal.gemspec DELETED
@@ -1,26 +0,0 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'internal/version'
5
-
6
- Gem::Specification.new do |spec|
7
- spec.name = 'internal'
8
- spec.version = Internal::VERSION
9
- spec.authors = ['Daniel da Silva Ferreira (dsferreira)']
10
- spec.email = ['danieldasilvaferreira@gmail.com']
11
- spec.description = %q{Internal}
12
- spec.summary = %q{Makes a class, module or method internal}
13
- spec.homepage = ''
14
- spec.license = 'MIT'
15
-
16
- spec.files = `git ls-files`.split($/)
17
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
- spec.require_paths = ['lib']
20
-
21
- spec.add_dependency 'sender'
22
- spec.add_dependency 'binding_of_caller'
23
- spec.add_development_dependency 'bundler', '~> 1.3'
24
- spec.add_development_dependency 'rake'
25
- spec.add_development_dependency 'minitest'
26
- end
@@ -1,67 +0,0 @@
1
- $:.unshift(File.expand_path('../../lib', __FILE__))
2
-
3
- require 'pry'
4
- require 'minitest'
5
- require 'minitest/autorun'
6
- require 'internal'
7
-
8
- module Foo
9
- end
10
-
11
- class Foo::Bar
12
- extend Internal
13
-
14
- def initialize(*args)
15
- @args = args
16
- end
17
-
18
- def bar
19
- @args
20
- end
21
- protected :bar
22
-
23
- class << self
24
- def baz
25
- 'baz'
26
- end
27
- public :baz
28
- end
29
- end
30
-
31
- class Foo::Baz
32
- def self.baz
33
- Foo::Bar.baz
34
- end
35
-
36
- def bar(*args)
37
- Foo::Bar.new(*args).bar
38
- end
39
- end
40
-
41
- class Bar
42
- def self.baz
43
- Foo::Bar.baz
44
- end
45
-
46
- def bar(*args)
47
- Foo::Bar.new(*args).bar
48
- end
49
- end
50
-
51
- class InternalTest < Minitest::Test
52
- def test_internal_class_instance_method
53
- assert_equal ::Foo::Baz.new.bar('a'), ['a']
54
- end
55
-
56
- def test_internal_class_singleton_method
57
- assert_equal ::Foo::Baz.baz, 'baz'
58
- end
59
-
60
- def test_external_class_instance_method
61
- assert_raises(NoMethodError) { ::Bar.new.bar('a') }
62
- end
63
-
64
- def test_external_class_singleton_method
65
- assert_raises(NoMethodError) { ::Bar.baz }
66
- end
67
- end