smart_todo 1.4.3 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.devcontainer/devcontainer.json +25 -0
- data/.github/workflows/build.yml +1 -2
- data/.rubocop.yml +2 -0
- data/Gemfile.lock +20 -16
- data/bin/rubocop +4 -2
- data/exe/smart_todo +1 -1
- data/lib/smart_todo/cli.rb +25 -2
- data/lib/smart_todo/dispatchers/base.rb +23 -21
- data/lib/smart_todo/dispatchers/output.rb +3 -1
- data/lib/smart_todo/dispatchers/slack.rb +6 -4
- data/lib/smart_todo/events/date.rb +14 -12
- data/lib/smart_todo/events/issue_close.rb +28 -1
- data/lib/smart_todo/events/ruby_version.rb +36 -0
- data/lib/smart_todo/events.rb +8 -0
- data/lib/smart_todo/parser/metadata_parser.rb +14 -9
- data/lib/smart_todo/slack_client.rb +2 -1
- data/lib/smart_todo/version.rb +1 -1
- data/lib/smart_todo.rb +1 -0
- data/lib/smart_todo_cop.rb +5 -1
- data/smart_todo.gemspec +2 -0
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c17d1471d893e5a764dda2fa9adcfc73049b5c5a45d6678feca40104879065fc
|
4
|
+
data.tar.gz: 85411f13bc189f060372e90a72fc1a545cd0030b6f67cf0fd75f1ff97dbeb755
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bfe190ce26c9b3e65aea86f3d23e40a400c14edcac8c465b361341ac00a7ab7d59498c9c3edda92d7e180659cad96240148bce26dc3a1db77a92ee2e03575204
|
7
|
+
data.tar.gz: f1c0386fbb5346a74c3f9c0c3b6228a9af29a810241793a5f44db5cbe7d7873c24e9dda987b65aff0d4984193be3652bec472431a48407badb2eb7610da506d6
|
@@ -0,0 +1,25 @@
|
|
1
|
+
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
|
2
|
+
// README at: https://github.com/devcontainers/templates/tree/main/src/ruby
|
3
|
+
{
|
4
|
+
"name": "Ruby",
|
5
|
+
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
|
6
|
+
"image": "mcr.microsoft.com/devcontainers/ruby:0-3-bullseye",
|
7
|
+
"features": {
|
8
|
+
"ghcr.io/devcontainers/features/github-cli:1": {}
|
9
|
+
},
|
10
|
+
|
11
|
+
// Features to add to the dev container. More info: https://containers.dev/features.
|
12
|
+
// "features": {},
|
13
|
+
|
14
|
+
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
15
|
+
// "forwardPorts": [],
|
16
|
+
|
17
|
+
// Use 'postCreateCommand' to run commands after the container is created.
|
18
|
+
"postCreateCommand": "bundle install",
|
19
|
+
|
20
|
+
// Configure tool-specific properties.
|
21
|
+
// "customizations": {},
|
22
|
+
|
23
|
+
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
|
24
|
+
// "remoteUser": "root"
|
25
|
+
}
|
data/.github/workflows/build.yml
CHANGED
@@ -12,7 +12,7 @@ jobs:
|
|
12
12
|
name: Ruby ${{ matrix.version }}
|
13
13
|
strategy:
|
14
14
|
matrix:
|
15
|
-
version: [
|
15
|
+
version: [3.0, 3.1, 3.2]
|
16
16
|
|
17
17
|
steps:
|
18
18
|
- uses: actions/checkout@v2
|
@@ -24,4 +24,3 @@ jobs:
|
|
24
24
|
- name: Run Tests
|
25
25
|
run: |
|
26
26
|
bundle exec rake test
|
27
|
-
|
data/.rubocop.yml
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
smart_todo (1.
|
4
|
+
smart_todo (1.6.0)
|
5
5
|
rexml
|
6
6
|
|
7
7
|
GEM
|
@@ -13,30 +13,34 @@ GEM
|
|
13
13
|
crack (0.4.5)
|
14
14
|
rexml
|
15
15
|
hashdiff (1.0.1)
|
16
|
+
json (2.6.3)
|
16
17
|
minitest (5.14.4)
|
17
|
-
parallel (1.
|
18
|
-
parser (3.
|
18
|
+
parallel (1.23.0)
|
19
|
+
parser (3.2.2.3)
|
19
20
|
ast (~> 2.4.1)
|
21
|
+
racc
|
20
22
|
public_suffix (4.0.6)
|
21
|
-
|
23
|
+
racc (1.7.0)
|
24
|
+
rainbow (3.1.1)
|
22
25
|
rake (13.0.6)
|
23
|
-
regexp_parser (2.
|
26
|
+
regexp_parser (2.8.1)
|
24
27
|
rexml (3.2.5)
|
25
|
-
rubocop (1.
|
28
|
+
rubocop (1.52.1)
|
29
|
+
json (~> 2.3)
|
26
30
|
parallel (~> 1.10)
|
27
|
-
parser (>= 3.
|
31
|
+
parser (>= 3.2.2.3)
|
28
32
|
rainbow (>= 2.2.2, < 4.0)
|
29
33
|
regexp_parser (>= 1.8, < 3.0)
|
30
|
-
rexml
|
31
|
-
rubocop-ast (>= 1.
|
34
|
+
rexml (>= 3.2.5, < 4.0)
|
35
|
+
rubocop-ast (>= 1.28.0, < 2.0)
|
32
36
|
ruby-progressbar (~> 1.7)
|
33
|
-
unicode-display_width (>=
|
34
|
-
rubocop-ast (1.
|
35
|
-
parser (>= 3.
|
36
|
-
rubocop-shopify (2.
|
37
|
-
rubocop (~> 1.
|
38
|
-
ruby-progressbar (1.
|
39
|
-
unicode-display_width (2.
|
37
|
+
unicode-display_width (>= 2.4.0, < 3.0)
|
38
|
+
rubocop-ast (1.29.0)
|
39
|
+
parser (>= 3.2.1.0)
|
40
|
+
rubocop-shopify (2.14.0)
|
41
|
+
rubocop (~> 1.51)
|
42
|
+
ruby-progressbar (1.13.0)
|
43
|
+
unicode-display_width (2.4.2)
|
40
44
|
webmock (3.11.2)
|
41
45
|
addressable (>= 2.3.6)
|
42
46
|
crack (>= 0.3.2)
|
data/bin/rubocop
CHANGED
@@ -9,8 +9,10 @@
|
|
9
9
|
#
|
10
10
|
|
11
11
|
require "pathname"
|
12
|
-
ENV["BUNDLE_GEMFILE"] ||= File.expand_path(
|
13
|
-
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path(
|
13
|
+
"../../Gemfile",
|
14
|
+
Pathname.new(__FILE__).realpath,
|
15
|
+
)
|
14
16
|
|
15
17
|
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
18
|
|
data/exe/smart_todo
CHANGED
data/lib/smart_todo/cli.rb
CHANGED
@@ -9,21 +9,35 @@ module SmartTodo
|
|
9
9
|
class CLI
|
10
10
|
def initialize
|
11
11
|
@options = {}
|
12
|
+
@errors = []
|
12
13
|
end
|
13
14
|
|
14
15
|
# @param args [Array<String>]
|
15
16
|
def run(args = ARGV)
|
16
17
|
paths = define_options.parse!(args)
|
17
18
|
validate_options!
|
19
|
+
|
18
20
|
paths << "." if paths.empty?
|
19
21
|
|
20
22
|
paths.each do |path|
|
21
23
|
normalize_path(path).each do |file|
|
22
24
|
parse_file(file)
|
23
25
|
|
24
|
-
|
25
|
-
|
26
|
+
$stdout.print(".")
|
27
|
+
$stdout.flush
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
if @errors.empty?
|
32
|
+
0
|
33
|
+
else
|
34
|
+
$stderr.puts "There were errors while checking for TODOs:\n"
|
35
|
+
|
36
|
+
@errors.each do |error|
|
37
|
+
$stderr.puts error
|
26
38
|
end
|
39
|
+
|
40
|
+
1
|
27
41
|
end
|
28
42
|
end
|
29
43
|
|
@@ -71,8 +85,17 @@ module SmartTodo
|
|
71
85
|
event_message = nil
|
72
86
|
event_met = todo_node.metadata.events.find do |event|
|
73
87
|
event_message = Events.public_send(event.method_name, *event.arguments)
|
88
|
+
rescue => e
|
89
|
+
message = "Error while parsing #{file} on event `#{event.method_name}` with arguments #{event.arguments}: " \
|
90
|
+
"#{e.message}"
|
91
|
+
|
92
|
+
@errors << message
|
93
|
+
|
94
|
+
nil
|
74
95
|
end
|
75
96
|
|
97
|
+
@errors.concat(todo_node.metadata.errors)
|
98
|
+
|
76
99
|
dispatcher.new(event_message, todo_node, file, @options).dispatch if event_met
|
77
100
|
end
|
78
101
|
end
|
@@ -3,29 +3,31 @@
|
|
3
3
|
module SmartTodo
|
4
4
|
module Dispatchers
|
5
5
|
class Base
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
6
|
+
class << self
|
7
|
+
# Factory pattern to retrieve the right dispatcher class.
|
8
|
+
#
|
9
|
+
# @param dispatcher [String]
|
10
|
+
#
|
11
|
+
# @return [Class]
|
12
|
+
def class_for(dispatcher)
|
13
|
+
case dispatcher
|
14
|
+
when "slack"
|
15
|
+
Slack
|
16
|
+
when nil, "output"
|
17
|
+
Output
|
18
|
+
end
|
17
19
|
end
|
18
|
-
end
|
19
20
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
21
|
+
# Subclasses should define what options from the CLI they need in order
|
22
|
+
# to properly deliver the message. For instance the Slack dispatcher
|
23
|
+
# requires an API key.
|
24
|
+
#
|
25
|
+
# @param _options [Hash]
|
26
|
+
#
|
27
|
+
# @return void
|
28
|
+
def validate_options!(_options)
|
29
|
+
raise(NotImplemetedError, "subclass responsability")
|
30
|
+
end
|
29
31
|
end
|
30
32
|
|
31
33
|
# @param event_message [String] the success message associated
|
@@ -5,10 +5,12 @@ module SmartTodo
|
|
5
5
|
# Dispatcher that sends TODO reminders on Slack. Assignees can be either individual
|
6
6
|
# (using the associated slack email address) or a channel.
|
7
7
|
class Slack < Base
|
8
|
-
|
9
|
-
|
8
|
+
class << self
|
9
|
+
def validate_options!(options)
|
10
|
+
options[:slack_token] ||= ENV.fetch("SMART_TODO_SLACK_TOKEN") { raise(ArgumentError, "Missing :slack_token") }
|
10
11
|
|
11
|
-
|
12
|
+
options.fetch(:fallback_channel) { raise(ArgumentError, "Missing :fallback_channel") }
|
13
|
+
end
|
12
14
|
end
|
13
15
|
|
14
16
|
# Make a Slack API call to dispatch the message to each assignee
|
@@ -35,7 +37,7 @@ module SmartTodo
|
|
35
37
|
|
36
38
|
client.post_message(user.dig("user", "id"), slack_message(user, assignee))
|
37
39
|
rescue SlackClient::Error => error
|
38
|
-
if ["users_not_found", "channel_not_found"].include?(error.error_code)
|
40
|
+
if ["users_not_found", "channel_not_found", "is_archived"].include?(error.error_code)
|
39
41
|
user = { "user" => { "id" => @options[:fallback_channel] }, "fallback" => true }
|
40
42
|
else
|
41
43
|
raise(error)
|
@@ -6,20 +6,22 @@ module SmartTodo
|
|
6
6
|
module Events
|
7
7
|
# An event that check if the passed date is passed
|
8
8
|
class Date
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
9
|
+
class << self
|
10
|
+
# @param on_date [String] a string parsable by Time.parse
|
11
|
+
# @return [String, false]
|
12
|
+
def met?(on_date)
|
13
|
+
if Time.now >= Time.parse(on_date)
|
14
|
+
message(on_date)
|
15
|
+
else
|
16
|
+
false
|
17
|
+
end
|
16
18
|
end
|
17
|
-
end
|
18
19
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
# @param on_date [String]
|
21
|
+
# @return [String]
|
22
|
+
def message(on_date)
|
23
|
+
"We are past the *#{on_date}* due date and your TODO is now ready to be addressed."
|
24
|
+
end
|
23
25
|
end
|
24
26
|
end
|
25
27
|
end
|
@@ -11,6 +11,11 @@ module SmartTodo
|
|
11
11
|
# If the Pull Request or Issue is on a private repository, exporting a token
|
12
12
|
# with the `repos` scope in the +SMART_TODO_GITHUB_TOKEN+ environment variable
|
13
13
|
# is required.
|
14
|
+
#
|
15
|
+
# You can also set a per-org or per-repo token by exporting more specific environment variables:
|
16
|
+
# +SMART_TODO_GITHUB_TOKEN__<ORG>+ and +SMART_TODO_GITHUB_TOKEN__<ORG>__<REPO>+
|
17
|
+
# The +<ORG>+ and +<REPO>+ parts should be uppercased and use underscores.
|
18
|
+
# For example, +Shopify/my-repo+ would become +SMART_TODO_GITHUB_TOKEN__SHOPIFY__MY_REPO=...+.
|
14
19
|
class IssueClose
|
15
20
|
TOKEN_ENV = "SMART_TODO_GITHUB_TOKEN"
|
16
21
|
|
@@ -78,8 +83,30 @@ module SmartTodo
|
|
78
83
|
# @return [Hash]
|
79
84
|
def default_headers
|
80
85
|
{ "Accept" => "application/vnd.github.v3+json" }.tap do |headers|
|
81
|
-
|
86
|
+
token = authorization_token
|
87
|
+
headers["Authorization"] = "token #{token}" if token
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# @return [String, nil]
|
92
|
+
def authorization_token
|
93
|
+
# Will look in order for:
|
94
|
+
# SMART_TODO_GITHUB_TOKEN__ORG__REPO
|
95
|
+
# SMART_TODO_GITHUB_TOKEN__ORG
|
96
|
+
# SMART_TODO_GITHUB_TOKEN
|
97
|
+
parts = [
|
98
|
+
TOKEN_ENV,
|
99
|
+
@organization.upcase.gsub(/[^A-Z0-9]/, "_"),
|
100
|
+
@repo.upcase.gsub(/[^A-Z0-9]/, "_"),
|
101
|
+
]
|
102
|
+
|
103
|
+
(parts.size - 1).downto(0).each do |i|
|
104
|
+
key = parts[0..i].join("__")
|
105
|
+
token = ENV[key]
|
106
|
+
return token unless token.nil? || token.empty?
|
82
107
|
end
|
108
|
+
|
109
|
+
nil
|
83
110
|
end
|
84
111
|
end
|
85
112
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SmartTodo
|
4
|
+
module Events
|
5
|
+
# An event that checks the currently installed ruby version.
|
6
|
+
# @example
|
7
|
+
# RubyVersion.new(['>= 2.3', '< 3'])
|
8
|
+
class RubyVersion
|
9
|
+
def initialize(requirements)
|
10
|
+
@requirements = Gem::Requirement.new(requirements)
|
11
|
+
end
|
12
|
+
|
13
|
+
# @param requirements [Array<String>] a list of version specifiers
|
14
|
+
# @return [String, false]
|
15
|
+
def met?
|
16
|
+
if @requirements.satisfied_by?(Gem::Version.new(installed_ruby_version))
|
17
|
+
message(installed_ruby_version)
|
18
|
+
else
|
19
|
+
false
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# @param installed_ruby_version [String], requirements [String]
|
24
|
+
# @return [String]
|
25
|
+
def message(installed_ruby_version)
|
26
|
+
"The currently installed version of Ruby #{installed_ruby_version} is #{@requirements}."
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def installed_ruby_version
|
32
|
+
RUBY_VERSION
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/smart_todo/events.rb
CHANGED
@@ -66,5 +66,13 @@ module SmartTodo
|
|
66
66
|
def pull_request_close(organization, repo, pr_number)
|
67
67
|
IssueClose.new(organization, repo, pr_number, type: "pulls").met?
|
68
68
|
end
|
69
|
+
|
70
|
+
# Check if the installed ruby version meets requirements.
|
71
|
+
#
|
72
|
+
# @param requirements [Array<String>] a list of version specifiers
|
73
|
+
# @return [false, String]
|
74
|
+
def ruby_version(*requirements)
|
75
|
+
RubyVersion.new(requirements).met?
|
76
|
+
end
|
69
77
|
end
|
70
78
|
end
|
@@ -18,10 +18,12 @@ module SmartTodo
|
|
18
18
|
|
19
19
|
# This class is used to parse the ruby TODO() comment.
|
20
20
|
class MetadataParser < Ripper
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
21
|
+
class << self
|
22
|
+
# @param source [String] the actual Ruby code
|
23
|
+
def parse(source)
|
24
|
+
sexp = new(source).parse
|
25
|
+
Visitor.new.tap { |v| v.process(sexp) }
|
26
|
+
end
|
25
27
|
end
|
26
28
|
|
27
29
|
# @return [Array] an Array of Array
|
@@ -35,7 +37,7 @@ module SmartTodo
|
|
35
37
|
# @param args [Array]
|
36
38
|
# @return [Array, MethodNode]
|
37
39
|
def on_method_add_arg(method, args)
|
38
|
-
if method
|
40
|
+
if method.start_with?(/TODO\W?/)
|
39
41
|
args
|
40
42
|
else
|
41
43
|
MethodNode.new(method, args)
|
@@ -78,11 +80,12 @@ module SmartTodo
|
|
78
80
|
end
|
79
81
|
|
80
82
|
class Visitor
|
81
|
-
attr_reader :events, :assignees
|
83
|
+
attr_reader :events, :assignees, :errors
|
82
84
|
|
83
85
|
def initialize
|
84
86
|
@events = []
|
85
87
|
@assignees = []
|
88
|
+
@errors = []
|
86
89
|
end
|
87
90
|
|
88
91
|
# Iterate over each tokens returned from the parser and call
|
@@ -104,9 +107,11 @@ module SmartTodo
|
|
104
107
|
# @param method_node [MethodNode]
|
105
108
|
# @return [void]
|
106
109
|
def on_todo_event(method_node)
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
+
if method_node.is_a?(MethodNode)
|
111
|
+
events << method_node
|
112
|
+
else
|
113
|
+
errors << "Incorrect `:on` event format: #{method_node}"
|
114
|
+
end
|
110
115
|
end
|
111
116
|
|
112
117
|
# @param assignee [String]
|
@@ -82,7 +82,7 @@ module SmartTodo
|
|
82
82
|
slack_response!(response)
|
83
83
|
end
|
84
84
|
|
85
|
-
#
|
85
|
+
# Check if the response to Slack was a 200 and the Slack API request was successful
|
86
86
|
#
|
87
87
|
# @param response [Net::HTTPResponse] a net Net::HTTPResponse subclass
|
88
88
|
# (Net::HTTPOK, Net::HTTPNotFound ...)
|
@@ -92,6 +92,7 @@ module SmartTodo
|
|
92
92
|
# @raise [SlackClient::Error] in case Slack returns a { ok: false } in the body
|
93
93
|
def slack_response!(response)
|
94
94
|
raise(Net::HTTPError.new("Request to slack failed", response)) unless response.code_type < Net::HTTPSuccess
|
95
|
+
|
95
96
|
body = JSON.parse(response.body)
|
96
97
|
|
97
98
|
if body["ok"]
|
data/lib/smart_todo/version.rb
CHANGED
data/lib/smart_todo.rb
CHANGED
@@ -18,6 +18,7 @@ module SmartTodo
|
|
18
18
|
autoload :GemBump, "smart_todo/events/gem_bump"
|
19
19
|
autoload :GemRelease, "smart_todo/events/gem_release"
|
20
20
|
autoload :IssueClose, "smart_todo/events/issue_close"
|
21
|
+
autoload :RubyVersion, "smart_todo/events/ruby_version"
|
21
22
|
end
|
22
23
|
|
23
24
|
module Dispatchers
|
data/lib/smart_todo_cop.rb
CHANGED
@@ -18,8 +18,12 @@ module RuboCop
|
|
18
18
|
def investigate(processed_source)
|
19
19
|
processed_source.comments.each do |comment|
|
20
20
|
next unless /^#\sTODO/ =~ comment.text
|
21
|
+
|
21
22
|
metadata = metadata(comment.text)
|
22
|
-
|
23
|
+
|
24
|
+
if metadata.errors.any?
|
25
|
+
add_offense(comment, message: "Invalid TODO format: #{metadata.errors.join(", ")}. #{HELP}")
|
26
|
+
elsif !smart_todo?(metadata)
|
23
27
|
add_offense(comment)
|
24
28
|
elsif (methods = invalid_event_methods(metadata.events)).any?
|
25
29
|
add_offense(comment, message: "Invalid event method(s): #{methods.join(", ")}. #{HELP}")
|
data/smart_todo.gemspec
CHANGED
@@ -24,6 +24,8 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.metadata["changelog_uri"] = spec.homepage + "/releases"
|
25
25
|
spec.metadata["allowed_push_host"] = "https://rubygems.org"
|
26
26
|
|
27
|
+
spec.required_ruby_version = ">= 3.0.0"
|
28
|
+
|
27
29
|
spec.files = Dir.chdir(File.expand_path("..", __FILE__)) do
|
28
30
|
%x(git ls-files -z).split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
29
31
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smart_todo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shopify
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-07-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rexml
|
@@ -91,6 +91,7 @@ executables:
|
|
91
91
|
extensions: []
|
92
92
|
extra_rdoc_files: []
|
93
93
|
files:
|
94
|
+
- ".devcontainer/devcontainer.json"
|
94
95
|
- ".github/workflows/build.yml"
|
95
96
|
- ".github/workflows/cla.yml"
|
96
97
|
- ".github/workflows/rubocop.yml"
|
@@ -117,6 +118,7 @@ files:
|
|
117
118
|
- lib/smart_todo/events/gem_bump.rb
|
118
119
|
- lib/smart_todo/events/gem_release.rb
|
119
120
|
- lib/smart_todo/events/issue_close.rb
|
121
|
+
- lib/smart_todo/events/ruby_version.rb
|
120
122
|
- lib/smart_todo/parser/comment_parser.rb
|
121
123
|
- lib/smart_todo/parser/metadata_parser.rb
|
122
124
|
- lib/smart_todo/parser/todo_node.rb
|
@@ -142,14 +144,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
142
144
|
requirements:
|
143
145
|
- - ">="
|
144
146
|
- !ruby/object:Gem::Version
|
145
|
-
version:
|
147
|
+
version: 3.0.0
|
146
148
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
147
149
|
requirements:
|
148
150
|
- - ">="
|
149
151
|
- !ruby/object:Gem::Version
|
150
152
|
version: '0'
|
151
153
|
requirements: []
|
152
|
-
rubygems_version: 3.
|
154
|
+
rubygems_version: 3.4.16
|
153
155
|
signing_key:
|
154
156
|
specification_version: 4
|
155
157
|
summary: Enhance todo's comments in your codebase.
|