internal 0.1.0alpha01 → 0.1.0.alpha2

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.
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