simple-annotations 0.9.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
-