final 0.3.0 → 0.3.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5f7914e66cf69af464eda26e6289e3f05c6a078349e2b9fe91ad4e0a20dec5ca
4
- data.tar.gz: 5146a6c91f11149bb18071978f68f422ae60a748c0f5fa563ff73c66f4558ffb
3
+ metadata.gz: aabc866fcda14e6047d044a3bb77869df800f498db345807bd0793b187b1447a
4
+ data.tar.gz: 7dda6307af254464c9d1912b5a62adaaccd1990d8146d0f4f837d40716cec416
5
5
  SHA512:
6
- metadata.gz: 832ed6846121c6c19d486f44a34f08b33cc69bed9999628b1a5655f97d211f8773c87f4f60c604f3d709fb951f63307948c9b33bdd00e11c388071896dc8d232
7
- data.tar.gz: 58990ef4509fd12f0e73a6374485684076fcec5891181b5052ef24abebe9cb91a18fb38fbbe2a0a6311274a5c2ea9cec9205c9f96a29123413d85d67c1629ce6
6
+ metadata.gz: 49e0dafa040f9742dfe7a4b534048f4f9010b86afa4095d60c2584cf4ce78efc99d2829a59b18a257fd91e9e42d66e829f13594f6e1c3333d75b7f102f268d62
7
+ data.tar.gz: 14623815a23bc30fa4e27f4e21294869df88e8f21f1e267bafbd5d7ed61bddbeacb8b6a974bd0837760176750f9ae988520c3aae482036fcc3e00cca19367cd9
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -1,22 +1,28 @@
1
- == 0.3.0 - 16-Sep-2020
1
+ ## 0.3.1 - 7-Jun-2021
2
+ * Some internal refactoring to avoid string based instance_eval, plus
3
+ added some memoization. Thanks go to Okura Masafumi for the patch.
4
+ * Removed test-unit as a dev dependency, which I had apparently left
5
+ in the last release by mistake.
6
+
7
+ ## 0.3.0 - 16-Sep-2020
2
8
  * Switched from test-unit to rspec, and made corresponding updates.
3
9
 
4
- == 0.2.1 - 1-Jun-2020
10
+ ## 0.2.1 - 1-Jun-2020
5
11
  * Added a LICENSE file to distro as required by the Apache-2.0 license.
6
12
 
7
- == 0.2.0 - 8-Jan-2019
13
+ ## 0.2.0 - 8-Jan-2019
8
14
  * Changed license to Apache-2.0.
9
15
  * The VERSION constant is now FINAL_VERSION since this is a module.
10
16
  * Added some metadata to the gemspec.
11
17
  * Updated the cert, should be good for about 10 years.
12
18
 
13
- == 0.1.2 - 6-Dec-2015
19
+ ## 0.1.2 - 6-Dec-2015
14
20
  * This gem is now signed.
15
21
  * The gem related tasks in the Rakefile now assume Rubygems 2.x.
16
22
 
17
- == 0.1.1 - 8-Oct-2014
23
+ ## 0.1.1 - 8-Oct-2014
18
24
  * Updated gemspec, removed references to RubyForge, etc.
19
25
  * Updated Rakefile for Rubygems 2.x.
20
26
 
21
- == 0.1.0 - 8-Apr-2011
27
+ ## 0.1.0 - 8-Apr-2011
22
28
  * Initial release
@@ -1,7 +1,7 @@
1
- * CHANGES
1
+ * CHANGES.md
2
2
  * LICENSE
3
- * README
4
- * MANIFEST
3
+ * MANIFEST.md
4
+ * README.md
5
5
  * Rakefile
6
6
  * final.gemspec
7
7
  * certs/djberg96_pub.pem
data/README.md ADDED
@@ -0,0 +1,69 @@
1
+ [![Ruby](https://github.com/djberg96/final/actions/workflows/ruby.yml/badge.svg)](https://github.com/djberg96/final/actions/workflows/ruby.yml)
2
+
3
+ ## Description
4
+ A Ruby module that can make your classes final. A final class cannot
5
+ be subclassed, and its instance methods cannot be redefined.
6
+
7
+ ## Installation
8
+ `gem install final`
9
+
10
+ ## Synopsis
11
+ ```ruby
12
+ require 'final'
13
+
14
+ class Alpha
15
+ include Final
16
+
17
+ def foo
18
+ puts "Hello"
19
+ end
20
+ end
21
+
22
+ # Error! You cannot subclass Alpha.
23
+ class Beta < Alpha; end
24
+
25
+ # Error! You cannot redefine an existing method.
26
+ class Alpha
27
+ def foo
28
+ puts "Hi"
29
+ end
30
+ end
31
+
32
+ # Not an error. You can add new methods to an existing class.
33
+ class Alpha
34
+ def bar
35
+ puts "World"
36
+ end
37
+ end
38
+ ```
39
+
40
+ ## Developer's Notes
41
+ This library is merely a proof of concept that was published as the result
42
+ of a tweet made by James Edward Gray II, where he commented that Ruby core
43
+ classes should never be subclassed. Knowing that static languages like Java
44
+ implement the "final" keyword as a way to prevent subclassing, I wanted to
45
+ see if something similar could be done for Ruby. Turns out it can.
46
+
47
+ I do not, however, necessarily advocate actually using this library in
48
+ production code. Freezing a class this way is contrary to the very nature
49
+ of Ruby and dynamic languages in general. If you're going to use it, you had
50
+ better have a very good reason for doing so!
51
+
52
+ ## Caveats
53
+ Only instance methods are prevented from redefinition. Singleton methods are
54
+ not final. This change may happen in a future release.
55
+
56
+ ## License
57
+ Apache-2.0
58
+
59
+ ## Copyright
60
+ (C) 2003-2021 Daniel J. Berger
61
+ All Rights Reserved.
62
+
63
+ ## Warranty
64
+ This package is provided "as is" and without any express or
65
+ implied warranties, including, without limitation, the implied
66
+ warranties of merchantability and fitness for a particular purpose.
67
+
68
+ ## Author
69
+ Daniel J. Berger
data/Rakefile CHANGED
@@ -8,9 +8,9 @@ namespace :gem do
8
8
  desc 'Build the final gem'
9
9
  task :create => [:clean] do
10
10
  require 'rubygems/package'
11
- spec = eval(IO.read('final.gemspec'))
11
+ spec = Gem::Specification.load('final.gemspec')
12
12
  spec.signing_key = File.join(Dir.home, '.ssh', 'gem-private_key.pem')
13
- Gem::Package.build(spec, true)
13
+ Gem::Package.build(spec)
14
14
  end
15
15
 
16
16
  desc "Install the final gem"
data/final.gemspec CHANGED
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = 'final'
5
- spec.version = '0.3.0'
5
+ spec.version = '0.3.1'
6
6
  spec.license = 'Apache-2.0'
7
7
  spec.author = 'Daniel J. Berger'
8
8
  spec.email = 'djberg96@gmail.com'
@@ -12,15 +12,13 @@ Gem::Specification.new do |spec|
12
12
  spec.files = Dir['**/*'].reject{ |f| f.include?('git') }
13
13
  spec.cert_chain = Dir['certs/*']
14
14
 
15
- spec.extra_rdoc_files = ['README', 'CHANGES', 'MANIFEST']
16
-
17
- spec.add_development_dependency "rake"
18
- spec.add_development_dependency "rspec", "~> 3.9"
15
+ spec.add_development_dependency('rake')
16
+ spec.add_development_dependency('rspec', '~> 3.9')
19
17
 
20
18
  spec.metadata = {
21
19
  'homepage_uri' => 'https://github.com/djberg96/final',
22
20
  'bug_tracker_uri' => 'https://github.com/djberg96/final/issues',
23
- 'changelog_uri' => 'https://github.com/djberg96/final/blob/master/CHANGES',
21
+ 'changelog_uri' => 'https://github.com/djberg96/final/blob/main/CHANGES.md',
24
22
  'documentation_uri' => 'https://github.com/djberg96/final/wiki',
25
23
  'source_code_uri' => 'https://github.com/djberg96/final',
26
24
  'wiki_uri' => 'https://github.com/djberg96/final/wiki'
@@ -30,7 +28,4 @@ Gem::Specification.new do |spec|
30
28
  The final library enables you to declare your classes as final. This
31
29
  prevents your class from being subclassed or having its methods redefined.
32
30
  EOF
33
-
34
- spec.add_development_dependency('rake')
35
- spec.add_development_dependency('test-unit', '>= 2.2.0')
36
31
  end
data/lib/final.rb CHANGED
@@ -6,32 +6,31 @@ module Final
6
6
  class Error < RuntimeError; end
7
7
 
8
8
  # The version of the final library.
9
- FINAL_VERSION = '0.3.0'.freeze
9
+ FINAL_VERSION = '0.3.1'.freeze
10
10
 
11
11
  def self.included(mod)
12
- # Store already defined methods.
13
- mod.instance_eval("@final_methods = []")
14
-
15
- # Internal accessor used in the method_added definition.
16
- def mod.final_methods
17
- @final_methods
18
- end
12
+ mod.instance_eval do
13
+ # Store already defined methods.
14
+ def final_methods
15
+ @final_methods ||= []
16
+ end
19
17
 
20
- # Prevent subclassing, except implicity subclassing from Object.
21
- def mod.inherited(sub)
22
- raise Error, "cannot subclass #{self}" unless self == Object
23
- end
18
+ # Prevent subclassing, except implicity subclassing from Object.
19
+ def inherited(_sub)
20
+ raise Error, "cannot subclass #{self}" unless self == Object
21
+ end
24
22
 
25
- # Prevent methods from being redefined.
26
- #--
27
- # There's still going to be a method redefinition warning. Gosh, it
28
- # sure would be nice if we could disable warnings.
29
- #
30
- def mod.method_added(sym)
31
- if final_methods.include?(sym)
32
- raise Error, "method '#{sym}' already defined"
33
- else
34
- final_methods << sym
23
+ # Prevent methods from being redefined.
24
+ #--
25
+ # There's still going to be a method redefinition warning. Gosh, it
26
+ # sure would be nice if we could disable warnings.
27
+ #
28
+ def method_added(sym)
29
+ if final_methods.include?(sym)
30
+ raise Error, "method '#{sym}' already defined"
31
+ else
32
+ final_methods << sym
33
+ end
35
34
  end
36
35
  end
37
36
  end
data/spec/final_spec.rb CHANGED
@@ -19,7 +19,7 @@ RSpec.describe Final do
19
19
  end
20
20
 
21
21
  example "version constant returns expected version number" do
22
- expect(Final::FINAL_VERSION).to eq('0.3.0')
22
+ expect(Final::FINAL_VERSION).to eq('0.3.1')
23
23
  expect(Final::FINAL_VERSION).to be_frozen
24
24
  end
25
25
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: final
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel J. Berger
@@ -35,7 +35,7 @@ cert_chain:
35
35
  ORVCZpRuCPpmC8qmqxUnARDArzucjaclkxjLWvCVHeFa9UP7K3Nl9oTjJNv+7/jM
36
36
  WZs4eecIcUc4tKdHxcAJ0MO/Dkqq7hGaiHpwKY76wQ1+8xAh
37
37
  -----END CERTIFICATE-----
38
- date:
38
+ date: 2021-06-07 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: rake
@@ -65,65 +65,31 @@ dependencies:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
67
  version: '3.9'
68
- - !ruby/object:Gem::Dependency
69
- name: rake
70
- requirement: !ruby/object:Gem::Requirement
71
- requirements:
72
- - - ">="
73
- - !ruby/object:Gem::Version
74
- version: '0'
75
- type: :development
76
- prerelease: false
77
- version_requirements: !ruby/object:Gem::Requirement
78
- requirements:
79
- - - ">="
80
- - !ruby/object:Gem::Version
81
- version: '0'
82
- - !ruby/object:Gem::Dependency
83
- name: test-unit
84
- requirement: !ruby/object:Gem::Requirement
85
- requirements:
86
- - - ">="
87
- - !ruby/object:Gem::Version
88
- version: 2.2.0
89
- type: :development
90
- prerelease: false
91
- version_requirements: !ruby/object:Gem::Requirement
92
- requirements:
93
- - - ">="
94
- - !ruby/object:Gem::Version
95
- version: 2.2.0
96
68
  description: |2
97
69
  The final library enables you to declare your classes as final. This
98
70
  prevents your class from being subclassed or having its methods redefined.
99
71
  email: djberg96@gmail.com
100
72
  executables: []
101
73
  extensions: []
102
- extra_rdoc_files:
103
- - README
104
- - CHANGES
105
- - MANIFEST
74
+ extra_rdoc_files: []
106
75
  files:
76
+ - CHANGES.md
77
+ - Gemfile
107
78
  - LICENSE
108
- - CHANGES
109
- - MANIFEST
110
- - spec
111
- - spec/final_spec.rb
112
- - README
79
+ - MANIFEST.md
80
+ - README.md
113
81
  - Rakefile
114
- - certs
115
82
  - certs/djberg96_pub.pem
116
- - lib
117
- - lib/final.rb
118
- - Gemfile
119
83
  - final.gemspec
84
+ - lib/final.rb
85
+ - spec/final_spec.rb
120
86
  homepage: https://github.com/djberg96/final
121
87
  licenses:
122
88
  - Apache-2.0
123
89
  metadata:
124
90
  homepage_uri: https://github.com/djberg96/final
125
91
  bug_tracker_uri: https://github.com/djberg96/final/issues
126
- changelog_uri: https://github.com/djberg96/final/blob/master/CHANGES
92
+ changelog_uri: https://github.com/djberg96/final/blob/main/CHANGES.md
127
93
  documentation_uri: https://github.com/djberg96/final/wiki
128
94
  source_code_uri: https://github.com/djberg96/final
129
95
  wiki_uri: https://github.com/djberg96/final/wiki
@@ -142,7 +108,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
142
108
  - !ruby/object:Gem::Version
143
109
  version: '0'
144
110
  requirements: []
145
- rubygems_version: 3.1.4
111
+ rubygems_version: 3.2.15
146
112
  signing_key:
147
113
  specification_version: 4
148
114
  summary: An implementation of 'final' for Ruby
metadata.gz.sig CHANGED
Binary file
data/README DELETED
@@ -1,65 +0,0 @@
1
- = Description
2
- A Ruby module that can make your classes final. A final class cannot
3
- be subclassed, and its instance methods cannot be redefined.
4
-
5
- = Installation
6
- gem install final
7
-
8
- = Synopsis
9
- require 'final'
10
-
11
- class Alpha
12
- include Final
13
-
14
- def foo
15
- puts "Hello"
16
- end
17
- end
18
-
19
- # Error! You cannot subclass Alpha.
20
- class Beta < Alpha; end
21
-
22
- # Error! You cannot redefine an existing method.
23
- class Alpha
24
- def foo
25
- puts "Hi"
26
- end
27
- end
28
-
29
- # Not an error. You can add new methods to an existing class.
30
- class Alpha
31
- def bar
32
- puts "World"
33
- end
34
- end
35
-
36
- = Developer's Notes
37
- This library is merely a proof of concept that was published as the result
38
- of a tweet made by James Edward Gray II, where he commented that Ruby core
39
- classes should never be subclassed. Knowing that static languages like Java
40
- implement the "final" keyword as a way to prevent subclassing, I wanted to
41
- see if something similar could be done for Ruby. Turns out it can.
42
-
43
- I do not, however, necessarily advocate actually using this library in
44
- production code. Freezing a class this way is contrary to the very nature
45
- of Ruby and dynamic languages in general. If you're going to use it, you had
46
- better have a very good reason for doing so!
47
-
48
- = Caveats
49
- Only instance methods are prevented from redefinition. Singleton methods are
50
- not final. This change may happen in a future release.
51
-
52
- = License
53
- Apache-2.0
54
-
55
- = Copyright
56
- (C) 2003-2019 Daniel J. Berger
57
- All Rights Reserved.
58
-
59
- = Warranty
60
- This package is provided "as is" and without any express or
61
- implied warranties, including, without limitation, the implied
62
- warranties of merchantability and fitness for a particular purpose.
63
-
64
- = Author
65
- Daniel J. Berger