simple-annotations 0.9.0 → 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.
@@ -1,129 +1,122 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'version'
4
+
1
5
  module Annotations
2
-
6
+ # the version of simple_annotations
7
+ VERSION = Version.current
3
8
 
9
+ RESERVED_ANNOTATIONS = %i[after before].freeze
4
10
 
5
- RESERVED_ANNOTATIONS = [:after, :before]
6
-
7
- def self.included(klass)
8
- klass.extend(ClassMethods)
9
- end
10
-
11
- def annotations(meth=nil)
12
-
13
- annotation = AnnotationMonitor::registered[self.class.to_s.to_sym]
14
- return annotation[meth] if meth
15
- annotation
16
- end
17
-
18
-
19
- def hooks(meth=nil)
20
- if meth then
21
- return annotations(meth).select {|item,val| RESERVED_ANNOTATIONS.include? item }
22
- else
23
- res = Hash::new
24
- annotations.keys.each {|val| res[val] = annotations[val].select{|item,val| RESERVED_ANNOTATIONS.include? item }}
25
- return res
26
- end
27
- end
28
-
29
- def fields(meth=nil)
30
- if meth then
31
- return annotations(meth).select {|item,val| RESERVED_ANNOTATIONS.include? item }
32
- else
33
- res = Hash::new
34
- annotations.keys.each {|val| res[val] = annotations[val].select{|item,val| not RESERVED_ANNOTATIONS.include? item }}
35
- return res
36
- end
37
- end
38
-
39
-
40
- module ClassMethods
41
- def annotations(meth=nil)
42
-
43
- return AnnotationMonitor::registered[self.class.to_s.to_sym][meth] if meth
44
- AnnotationMonitor::registered[self.to_s.to_sym]
45
- end
46
-
47
- private
48
-
49
- def method_added(m)
50
- AnnotationMonitor::registered[self.to_s.to_sym][m] = @last_annotations if @last_annotations
51
- @last_annotations = nil
52
- super
53
- end
54
-
55
- def method_missing(meth, *args)
56
- return super unless /\A§/ =~ meth
57
- @last_annotations ||= {}
58
- if args.size == 0
59
- @last_annotations[meth[1..-1].to_sym] = true
60
- elsif args.size == 1
61
- @last_annotations[meth[1..-1].to_sym] = args.first
62
- else
63
- @last_annotations[meth[1..-1].to_sym] = args
11
+ def self.included(klass)
12
+ klass.extend(ClassMethods)
13
+ end
14
+
15
+ def annotations(meth = nil)
16
+ annotation = AnnotationMonitor.registered[self.class.to_s.to_sym]
17
+ return annotation[meth] if meth
18
+
19
+ annotation
20
+ end
21
+
22
+ def hooks(meth = nil)
23
+ if meth
24
+ annotations(meth).slice(*RESERVED_ANNOTATIONS)
25
+ else
26
+ res = {}
27
+ annotations.each_key do |val|
28
+ res[val] = annotations[val].select do |item, _val|
29
+ RESERVED_ANNOTATIONS.include? item
64
30
  end
65
31
  end
66
-
32
+ res
67
33
  end
68
34
  end
69
-
70
-
71
- class AnnotationMonitor
72
- @@annotated ={}
73
- @@before = TracePoint.new(:call) do |tp|
74
-
75
- selected_class = tp.defined_class.to_s.to_sym
76
- called_method = tp.method_id
77
- if AnnotationMonitor::registered.include? selected_class then
78
- annotations = AnnotationMonitor::registered[selected_class][called_method]
79
- if annotations.include? :before then
80
- annotations[:before].call
81
- end
82
-
35
+
36
+ def fields(meth = nil)
37
+ if meth
38
+ annotations(meth).except(*RESERVED_ANNOTATIONS)
39
+ else
40
+ res = {}
41
+ annotations.each_key do |val|
42
+ res[val] = annotations[val].except(*RESERVED_ANNOTATIONS)
83
43
  end
84
-
44
+ res
85
45
  end
86
- @@after = TracePoint.new(:return) do |tp|
87
-
88
- selected_class = tp.defined_class.to_s.to_sym
89
- called_method = tp.method_id
90
- if AnnotationMonitor::registered.include? selected_class then
91
- annotations = AnnotationMonitor::registered[selected_class][called_method]
92
- if annotations.include? :after then
93
- annotations[:after].call
94
- end
95
-
96
- end
97
-
46
+ end
47
+
48
+ module ClassMethods
49
+ def annotations(meth = nil)
50
+ return AnnotationMonitor.registered[self.class.to_s.to_sym][meth] if meth
51
+
52
+ AnnotationMonitor.registered[to_s.to_sym]
53
+ end
54
+
55
+ private
56
+
57
+ def method_added(m)
58
+ AnnotationMonitor.registered[to_s.to_sym][m] = @last_annotations if @last_annotations
59
+ @last_annotations = nil
60
+ super
98
61
  end
99
- @@after.enable unless @@after.enabled?
100
- @@before.enable unless @@before.enabled?
101
-
102
- def AnnotationMonitor::register(aClass)
103
- @@annotated[aClass] = {}
104
- end
105
-
106
- def AnnotationMonitor::registered
107
- return @@annotated
62
+
63
+ def method_missing(meth, *args)
64
+ return super unless /\A§/ =~ meth
65
+
66
+ @last_annotations ||= {}
67
+ @last_annotations[meth[1..].to_sym] = if args.empty?
68
+ true
69
+ elsif args.size == 1
70
+ args.first
71
+ else
72
+ args
73
+ end
108
74
  end
109
-
110
75
  end
111
-
112
-
113
- module AnnotationRefinement
114
- refine Module do
115
- private
116
-
117
- def annotate!
118
- AnnotationMonitor::register(self.to_s.to_sym)
119
- include Annotations
120
- end
76
+ end
121
77
 
78
+ class AnnotationMonitor
122
79
 
80
+ def AnnotationMonitor::register(aClass)
81
+ @@annotated[aClass] = {}
82
+ end
83
+
84
+ def AnnotationMonitor::registered
85
+ @@annotated
86
+ end
87
+
88
+ @@annotated = {}
89
+ @@before = TracePoint.new(:call) do |tp|
90
+ selected_class = tp.defined_class.to_s.to_sym
91
+ called_method = tp.method_id
92
+ if AnnotationMonitor.registered.include? selected_class
93
+ annotations = AnnotationMonitor.registered[selected_class][called_method]
94
+ annotations[:before].call if annotations.include? :before
95
+
96
+ end
97
+ end
98
+ @@after = TracePoint.new(:return) do |tp|
99
+ selected_class = tp.defined_class.to_s.to_sym
100
+ called_method = tp.method_id
101
+ if AnnotationMonitor.registered.include? selected_class
102
+ annotations = AnnotationMonitor.registered[selected_class][called_method]
103
+ annotations[:after].call if annotations.include? :after
123
104
 
124
105
  end
125
106
  end
107
+ @@after.enable unless @@after.enabled?
108
+ @@before.enable unless @@before.enabled?
126
109
 
127
110
 
128
-
129
-
111
+ end
112
+
113
+ module AnnotationRefinement
114
+ refine Module do
115
+ private
116
+
117
+ def annotate!
118
+ AnnotationMonitor.register(to_s.to_sym)
119
+ include Annotations
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,20 @@
1
+ require 'rubygems'
2
+ require 'simple-annotations'
3
+
4
+ class A
5
+ using AnnotationRefinement
6
+
7
+ annotate!
8
+
9
+ §test 'string'
10
+ def method
11
+ return annotations(__callee__)
12
+ end
13
+
14
+
15
+ end
16
+
17
+
18
+
19
+ anA = A.new
20
+ pp anA.method
@@ -0,0 +1,35 @@
1
+ require 'rubygems'
2
+ require 'simple-annotations'
3
+
4
+ class A
5
+ using AnnotationRefinement
6
+
7
+ annotate!
8
+
9
+ §test 1234
10
+ def m1
11
+
12
+ end
13
+
14
+ §foo 12
15
+ §bar
16
+ def m2; end
17
+
18
+ §foobar color: 'cyan'
19
+ def m3; end
20
+
21
+ def m4; end
22
+
23
+ §after -> { puts 'm5 after' }
24
+ def m5; end
25
+
26
+ §test 10, {}, [], 'string'
27
+ def m6; end
28
+ end
29
+
30
+
31
+ pp A.annotations
32
+
33
+ pp A.annotations[:m3]
34
+
35
+
@@ -0,0 +1,21 @@
1
+ require 'rubygems'
2
+ require 'simple-annotations'
3
+
4
+ class A
5
+ using AnnotationRefinement
6
+
7
+ annotate!
8
+
9
+ §test 1234 # Numeric
10
+ §foobar color: 'cyan' # Hash by double splat, like keyword
11
+ §testbar 10, {}, [], 'string' # Hybrid by splat
12
+ §barfoo # Boolean set true
13
+ §footest 'string' # String
14
+ def method
15
+
16
+ end
17
+
18
+ end
19
+
20
+
21
+ pp A.annotations[:method]
@@ -0,0 +1,22 @@
1
+ require 'rubygems'
2
+ require 'simple-annotations'
3
+
4
+ class A
5
+ using AnnotationRefinement
6
+
7
+ annotate!
8
+
9
+
10
+ §after -> { puts 'after' }
11
+ §before -> { puts 'before' }
12
+ def m1
13
+ puts 'test'
14
+ end
15
+
16
+
17
+ end
18
+
19
+
20
+
21
+ anA = A.new
22
+ anA.m1
@@ -1,24 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'English'
1
4
  Gem::Specification.new do |s|
2
- s.name = %q{simple-annotations}
3
- s.author = "Romain GEORGES"
4
- s.version = "0.9.0"
5
- s.date = "2021-12-27"
6
- s.summary = "Simple method annotations like in java or Python methods decorators"
7
- s.email = "romain@ultragreen.net"
8
- s.homepage = "http://www.ultragreen.net"
9
- s.description = "Simple method annotations like in java or Python methods decorators"
10
- s.files = `git ls-files`.split($/)
11
- s.required_ruby_version = '~> 2.7.0'
12
- s.add_development_dependency "rspec", "~> 3.10"
13
- s.add_development_dependency "roodi", "~> 5.0"
14
- s.add_development_dependency "rake", "~> 12.3"
15
- s.add_development_dependency "yard", "~> 0.9"
16
- s.add_development_dependency "yard-rspec", "~> 0.1"
17
- s.require_paths = ["lib"]
18
- s.require_paths << 'bin'
19
- s.bindir = 'bin'
20
- s.executables = Dir["bin/*"].map!{|item| item.gsub("bin/","")}
21
- s.test_files = s.files.grep(%r{^(test|spec|features)/})
22
- s.license = "BSD-2-Clause"
5
+ s.name = 'simple-annotations'
6
+ s.author = 'Romain GEORGES'
7
+ s.version = `cat VERSION`.chomp
8
+ s.summary = 'Simple method annotations like in java or Python methods decorators'
9
+ s.email = 'romain@ultragreen.net'
10
+ s.homepage = 'https://github.com/lecid/simple-annotations'
11
+ s.description = 'Simple method annotations like in java or Python methods decorators'
12
+ s.required_ruby_version = Gem::Requirement.new('>= 3.2.3')
13
+ s.license = 'BSD-3-Clause'
14
+ s.metadata['rubygems_mfa_required'] = 'true'
15
+ s.files = Dir.chdir(File.expand_path(__dir__)) do
16
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
23
17
  end
24
-
18
+ s.require_paths = ['lib']
19
+ s.add_development_dependency 'bundle-audit', '~> 0.1.0'
20
+ s.add_development_dependency 'code_statistics', '~> 0.2.13'
21
+ s.add_development_dependency 'rake', '~> 13.0'
22
+ s.add_development_dependency 'rspec', '~> 3.0'
23
+ s.add_development_dependency 'rspec-expectations', '~> 3.13.0'
24
+ s.add_development_dependency 'rubocop', '~> 1.32'
25
+ s.add_development_dependency 'yard', '~> 0.9.27'
26
+ s.add_development_dependency 'yard-rspec', '~> 0.1'
27
+ s.add_dependency 'version', '~> 1.1'
28
+ s.add_development_dependency 'cyclonedx-ruby', '~> 1.1'
29
+ s.add_development_dependency 'debride', '~> 1.12'
30
+ s.add_development_dependency 'diff-lcs', '~> 1.5.1'
31
+ end
metadata CHANGED
@@ -1,71 +1,113 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple-annotations
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Romain GEORGES
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-27 00:00:00.000000000 Z
11
+ date: 2024-04-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rspec
14
+ name: bundle-audit
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '3.10'
19
+ version: 0.1.0
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '3.10'
26
+ version: 0.1.0
27
27
  - !ruby/object:Gem::Dependency
28
- name: roodi
28
+ name: code_statistics
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '5.0'
33
+ version: 0.2.13
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '5.0'
40
+ version: 0.2.13
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '12.3'
47
+ version: '13.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '13.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec-expectations
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 3.13.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 3.13.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.32'
48
90
  type: :development
49
91
  prerelease: false
50
92
  version_requirements: !ruby/object:Gem::Requirement
51
93
  requirements:
52
94
  - - "~>"
53
95
  - !ruby/object:Gem::Version
54
- version: '12.3'
96
+ version: '1.32'
55
97
  - !ruby/object:Gem::Dependency
56
98
  name: yard
57
99
  requirement: !ruby/object:Gem::Requirement
58
100
  requirements:
59
101
  - - "~>"
60
102
  - !ruby/object:Gem::Version
61
- version: '0.9'
103
+ version: 0.9.27
62
104
  type: :development
63
105
  prerelease: false
64
106
  version_requirements: !ruby/object:Gem::Requirement
65
107
  requirements:
66
108
  - - "~>"
67
109
  - !ruby/object:Gem::Version
68
- version: '0.9'
110
+ version: 0.9.27
69
111
  - !ruby/object:Gem::Dependency
70
112
  name: yard-rspec
71
113
  requirement: !ruby/object:Gem::Requirement
@@ -80,40 +122,107 @@ dependencies:
80
122
  - - "~>"
81
123
  - !ruby/object:Gem::Version
82
124
  version: '0.1'
125
+ - !ruby/object:Gem::Dependency
126
+ name: version
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.1'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.1'
139
+ - !ruby/object:Gem::Dependency
140
+ name: cyclonedx-ruby
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '1.1'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '1.1'
153
+ - !ruby/object:Gem::Dependency
154
+ name: debride
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '1.12'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '1.12'
167
+ - !ruby/object:Gem::Dependency
168
+ name: diff-lcs
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: 1.5.1
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: 1.5.1
83
181
  description: Simple method annotations like in java or Python methods decorators
84
182
  email: romain@ultragreen.net
85
183
  executables: []
86
184
  extensions: []
87
185
  extra_rdoc_files: []
88
186
  files:
187
+ - ".debride_whitelist"
188
+ - ".github/workflows/main.yml"
189
+ - ".rspec"
190
+ - ".rubocop.yml"
89
191
  - AUTHORS
90
192
  - COPYRIGHT
91
193
  - Gemfile
194
+ - LICENSE.txt
195
+ - README.md
92
196
  - Rakefile
93
- - coding_convention.yml
197
+ - VERSION
198
+ - bom.xml
94
199
  - lib/simple-annotations.rb
200
+ - samples/test_base.rb
201
+ - samples/test_class_method.rb
202
+ - samples/test_fields.rb
203
+ - samples/test_hook.rb
95
204
  - simple-annotations.gemspec
96
- homepage: http://www.ultragreen.net
205
+ homepage: https://github.com/lecid/simple-annotations
97
206
  licenses:
98
- - BSD-2-Clause
99
- metadata: {}
207
+ - BSD-3-Clause
208
+ metadata:
209
+ rubygems_mfa_required: 'true'
100
210
  post_install_message:
101
211
  rdoc_options: []
102
212
  require_paths:
103
213
  - lib
104
- - bin
105
214
  required_ruby_version: !ruby/object:Gem::Requirement
106
215
  requirements:
107
- - - "~>"
216
+ - - ">="
108
217
  - !ruby/object:Gem::Version
109
- version: 2.7.0
218
+ version: 3.2.3
110
219
  required_rubygems_version: !ruby/object:Gem::Requirement
111
220
  requirements:
112
221
  - - ">="
113
222
  - !ruby/object:Gem::Version
114
223
  version: '0'
115
224
  requirements: []
116
- rubygems_version: 3.1.2
225
+ rubygems_version: 3.4.19
117
226
  signing_key:
118
227
  specification_version: 4
119
228
  summary: Simple method annotations like in java or Python methods decorators
@@ -1,25 +0,0 @@
1
- AssignmentInConditionalCheck:
2
- CaseMissingElseCheck:
3
- ClassLineCountCheck:
4
- line_count: 300
5
- ClassNameCheck:
6
- pattern: !ruby/regexp /^[A-Z][a-zA-Z0-9]*$/
7
- #ClassVariableCheck:
8
- CyclomaticComplexityBlockCheck:
9
- complexity: 4
10
- CyclomaticComplexityMethodCheck:
11
- complexity: 10
12
- EmptyRescueBodyCheck:
13
- ForLoopCheck:
14
- MethodLineCountCheck:
15
- line_count: 30
16
- MethodNameCheck:
17
- pattern: !ruby/regexp /^[_a-z<>=\[|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/
18
- # MissingForeignKeyIndexCheck:
19
- ModuleLineCountCheck:
20
- line_count: 500
21
- ModuleNameCheck:
22
- pattern: !ruby/regexp /^[A-Z][a-zA-Z0-9]*$/
23
- ParameterNumberCheck:
24
- parameter_count: 5
25
-