tag_ripper 0.2.1 → 0.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2e80933d8c317438627b041b30bd905ae33ed8d993db4ef149e69f3f71fd30d7
4
- data.tar.gz: 7eeb22fc466b8b50da7f6d3e887dfc02c04d0de462abf870f36bf0beda6b3a68
3
+ metadata.gz: e8223c939423f3fce3c103a0e16649b925cc2cf9d0130618e4172c8f8e206bde
4
+ data.tar.gz: dbd6a188942b85df76b27189df7cdcbfea4257e10c6fd7003467fdb552eb25b7
5
5
  SHA512:
6
- metadata.gz: 131915acf06d838e8d5aa62ee92b62eab06743071298aa57fb887975cd9414b825d9929a40349bd6e4607ee5b7475eb41dc205939dc8a86d8c51856880317692
7
- data.tar.gz: e7e86cc4d7984e3f05d1743d42892ee235152467a16f64edbc64cfe79d9683a5130aa013ce193084adb3348d509cc06938d78bbf5d2823efcb7a33ef61fbcf89
6
+ metadata.gz: 1a72eee3e5dbcafe2729452701418ea233ee6f0439bab493d7220687081a0fa9efc6ec20cb4d4fab5eaf6ea427e0fc5a5df7d6269f20bbfd53feadc5454abf50
7
+ data.tar.gz: 556c44f1683a4c46c896e11d4c0da33c1e1c14af6061a8ce28072feb8187bc56e6763e357e7d7a568c55da99f2edb95d78a13b56ff0b19124023df382d703be7
data/Guardfile CHANGED
@@ -3,10 +3,3 @@ guard :minitest, cli: "--verbose" do
3
3
  watch(%r{^lib/(.+)\.rb$}) { |m| "test/#{m[1]}_test.rb" }
4
4
  watch("test/test_helper.rb") { "test" }
5
5
  end
6
-
7
- guard :rubocop, all_on_start: false do
8
- watch(/^.+\.rb$/)
9
- watch(%r{^(config|test)/.+\.rb$})
10
- watch("Gemfile")
11
- watch(".rubocop.yml")
12
- end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: false
2
+
1
3
  module TagRipper
2
4
  # Follows the state changes of a taggable entity (class, model, or method)
3
5
  # as it responds to various Lexical tokens.
@@ -26,6 +28,7 @@ module TagRipper
26
28
  pending
27
29
  tagged
28
30
  awaiting_name
31
+ naming
29
32
  named
30
33
  closed
31
34
  ].freeze
@@ -34,30 +37,32 @@ module TagRipper
34
37
  # @return [Array<Symbol>]
35
38
  OPENED_STATUSES = %i[tagged awaiting_name named].freeze
36
39
 
37
- def initialize(name: nil, parent: nil, type: nil)
40
+ def initialize(name: nil, parent: nil, type: nil, status: :pending)
38
41
  @name = name
39
42
  @tags = Hash.new { |hash, key| hash[key] = Set.new }
40
43
  @parent = parent
41
44
  @type = type
42
- self.status = :pending
45
+ self.status = status
43
46
  end
44
47
 
45
48
  alias id object_id
46
49
 
47
50
  def send_event(event_name, lex)
48
- debug_event(event_name, lex) if ENV["DEBUG_TAG_RIPPER"]
49
- if respond_to?(event_name, true)
50
- send(event_name, lex)
51
- else
52
- self
53
- end
51
+ debug(<<~DEBUG)
52
+ Sending #{event_name} to #{self} with #{lex.token.inspect}
53
+ #{inspect}
54
+
55
+ DEBUG
56
+
57
+ return self unless respond_to?(event_name, true)
58
+
59
+ send(event_name, lex)
54
60
  end
55
61
 
56
- def debug_event(event_name, lex)
57
- puts <<~OUTPUT.chomp
58
- Sending #{event_name} to #{self} with #{lex.token.inspect}
59
- #{inspect}"
60
- OUTPUT
62
+ def debug(*strings)
63
+ return if ENV.fetch("TAG_RIPPER_DEBUG", "false") == "false"
64
+
65
+ puts strings.join(" - ")
61
66
  end
62
67
 
63
68
  def module?
@@ -112,12 +117,12 @@ module TagRipper
112
117
  !!@name
113
118
  end
114
119
 
115
- def name=(name)
116
- unless may_name?
120
+ def name=(value)
121
+ unless may_append_name?
117
122
  raise IllegalStateTransitionError.new(from: @status, to: :named)
118
123
  end
119
124
 
120
- @name = name.to_s
125
+ @name = value
121
126
  self.status = :named
122
127
  end
123
128
 
@@ -145,6 +150,10 @@ module TagRipper
145
150
  awaiting_name?
146
151
  end
147
152
 
153
+ def may_append_name?
154
+ awaiting_name? | naming?
155
+ end
156
+
148
157
  def may_close?
149
158
  named?
150
159
  end
@@ -182,8 +191,12 @@ module TagRipper
182
191
  protected
183
192
 
184
193
  def append_name!(string)
185
- raise StandardError, "Cannot append #{string} to nil" unless @name
194
+ unless may_append_name?
195
+ raise IllegalStateTransitionError.new(from: @status, to: :naming)
196
+ end
186
197
 
198
+ @status = :naming
199
+ @name ||= ""
187
200
  @name.concat(string.to_s)
188
201
  end
189
202
 
@@ -251,22 +264,36 @@ module TagRipper
251
264
  define_method].freeze
252
265
  private_constant :IGNORED_IDENT_KEYWORDS
253
266
 
254
- def name_from_lex(lex) # rubocop:disable Metrics
267
+ def name_from_lex(lex)
255
268
  return self if IGNORED_IDENT_KEYWORDS.include?(lex.token)
256
- # TODO: Simplify this logic
257
- return self if named? && !@name.end_with?("::")
258
- return self unless may_name? || (name? && @name.end_with?("::"))
259
269
 
260
- # self.status = :awaiting_name # TODO: Fix this with a proper state
261
- if named? && @name.to_s.end_with?("::")
262
- append_name!(lex.token)
263
- else
264
- self.name = "#{name}#{lex.token}"
265
- end
270
+ # If we are already done naming, then we don't want to name some more...
271
+ return self if named?
272
+
273
+ # Unless we are awaiting more name information, return self
274
+ return self unless may_append_name?
275
+
276
+ append_name!(lex.token)
266
277
 
267
278
  self
268
279
  end # rubocop:enable Metrics
269
280
 
281
+ # Token is not likely to be part of a TaggableEntity name
282
+ # (e.g. spaces, newlines, semicolons, keywords...)
283
+ def on_non_name_token(_lex)
284
+ if naming?
285
+ @status = :named
286
+ end
287
+ self
288
+ end
289
+
290
+ alias on_nl on_non_name_token
291
+ alias on_sp on_non_name_token
292
+ alias on_semicolon on_non_name_token
293
+ alias on_comma on_non_name_token
294
+ alias on_lparen on_non_name_token
295
+ alias on_rparen on_non_name_token
296
+
270
297
  ##
271
298
  # Matches names of constants: module names, const names, etc.
272
299
  alias on_const name_from_lex
@@ -276,7 +303,7 @@ module TagRipper
276
303
  alias on_ident name_from_lex
277
304
 
278
305
  def on_op(lex)
279
- if lex.double_colon?
306
+ if lex.double_colon? && may_append_name?
280
307
  append_name!(lex.token)
281
308
  end
282
309
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TagRipper
4
- VERSION = "0.2.1"
4
+ VERSION = "0.3.0"
5
5
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tag_ripper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gavin Morrice
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-07-02 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies: []
12
12
  description: Add tags to your Ruby code comments and then Rip the as lexical tokens
13
13
  email:
@@ -53,7 +53,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  requirements: []
56
- rubygems_version: 3.6.2
56
+ rubygems_version: 3.6.7
57
57
  specification_version: 4
58
58
  summary: Rips tags from Ruby code
59
59
  test_files: []