groundskeeper-bitcore 0.43.0 → 0.44.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: 9dd0b801a2e6f1fc101f7ca322be6dd82153be147e2c6ea58a378be946c2036a
4
- data.tar.gz: 9acdaf747584da2c4adaad7b42fe1e1ccf3228a2251199485f8ff39490aea4e3
3
+ metadata.gz: c37ebd4da35bf6574411e1008e0e8c4d246ce35cede710bc6b8812d9188763b1
4
+ data.tar.gz: f2f211e627fd7a6281ac0aff976041ce2726cc80e41097674149d32dc1c067a3
5
5
  SHA512:
6
- metadata.gz: ce128d4613f5a26d08555dbc3f80d52d685dbd2f407dcd9073edd6ef2c7624237d0bfe4665a644fb599a405e790a91e00370ab3e78857eef213b5287076914be
7
- data.tar.gz: ade501b9bea55fe1599a1f2c51a52d1d8518c40805a1d94db9d80295977be00fae9e0f7433122f9425c0bf61b2089eb4a09d417ec3c7aac9723af6a38cfa8fcd
6
+ metadata.gz: ff8eb49632a0b993392a4e950256f2e45227fe0467a51d06323dabb6d035b303cc9b2910083ba5d87ccb1fcc808852519c0017f10f12bb143893a17fa0bd4a06
7
+ data.tar.gz: 6e991c04dbdc52974b57a2d4a6dfdeea02bb4931e9d1b969452b2579bbf77259d0984bd3691443bad80aa05c434557d1460069e0b67d03be7c636ead0148e0a9
@@ -0,0 +1,26 @@
1
+ # Repository guidance
2
+
3
+ ## Build, test, and lint
4
+
5
+ - Run `bin/setup` to install the development dependencies.
6
+ - Run `bundle exec rake` for the CI-equivalent default task: it runs the test suite and RuboCop.
7
+ - Run just the tests with `bundle exec rake test`.
8
+ - Run one test file with `bundle exec ruby -Itest test/groundskeeper/git_test.rb`; add `-n /test_name/` to run a single Minitest method, for example `-n /test_status/`.
9
+ - Run lint alone with `bundle exec rake rubocop` (or `bundle exec rubocop`).
10
+ - Build the gem with `bundle exec rake build`.
11
+
12
+ ## Architecture
13
+
14
+ Groundskeeper is a Ruby gem that provides the `ground` Thor CLI for Rails release and deployment workflows. `lib/groundskeeper/application.rb` defines the CLI commands; `lib/groundskeeper/commands.rb` coordinates release/deploy steps and connects collaborators for Git, Rails version files, project metadata, and external services.
15
+
16
+ Most individual `lib/groundskeeper/*.rb` classes wrap one concern or integration. `lib/groundskeeper.rb` loads the library. `Commands.build` assembles the real collaborators; the commands object also accepts collaborators through its initializer so workflow behavior can be tested without making real service calls.
17
+
18
+ `RailsVersion` reads and updates the target Rails app's module version file. `Project` reads per-repository and server configuration from `~/.project_details/projects.yml` and `servers.yml`; deployment tasks live in `config/deploy.rb` and related config files and are run through Mina. The `stage` environment variable selects production; otherwise workflows default to staging.
19
+
20
+ ## Repository conventions
21
+
22
+ - Keep external-service and command-line integration behind the existing focused wrappers (for example, `Git`, `Jira`, `Sentry`, and `Executable`); coordinate workflow sequencing in `Commands`.
23
+ - Follow the existing dependency-injection pattern: build real dependencies at the application boundary, and pass mocks or small test doubles into the classes under test.
24
+ - Tests use Minitest, are named `*_test.rb` under `test/`, and share `test/test_helper.rb`. SimpleCov enforces 100% coverage, so exercise new branches and methods in tests.
25
+ - Ruby files use frozen string literals and double-quoted strings. RuboCop settings and project-specific exclusions are in `.rubocop.yml`; the gem targets Ruby 3.0 or newer.
26
+ - `README.md` documents CLI usage, supported integrations, and their required environment configuration; consult it when changing release or deployment behavior.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- groundskeeper-bitcore (0.43.0)
4
+ groundskeeper-bitcore (0.44.0)
5
5
  activesupport
6
6
  jira-ruby (~> 3.0)
7
7
  mina (~> 1.2)
data/README.md CHANGED
@@ -52,14 +52,6 @@ projects. Clone it as follows:
52
52
  git clone git@github.com:NU-CBITS/project_details.git ~/.project_details
53
53
  ```
54
54
 
55
- To integrate with Slack, set the following environment variables:
56
-
57
- ```bash
58
- SLACK_WORKSPACE
59
- SLACK_CHANNEL
60
- SLACK_TOKEN
61
- ```
62
-
63
55
  ## Usage
64
56
 
65
57
  To display tag/release information about a Rails project, use the `info`
@@ -33,7 +33,6 @@ module Groundskeeper
33
33
  project_name: project.sentry_project,
34
34
  version_prefix: repository.name
35
35
  )
36
- slack = Slack.build
37
36
  ssh = Ssh.build(SSH_USERNAME, project.full_dns(stage))
38
37
 
39
38
  new(
@@ -45,7 +44,6 @@ module Groundskeeper
45
44
  repository: repository,
46
45
  rubygems: Rubygems,
47
46
  sentry: sentry,
48
- slack: slack,
49
47
  ssh: ssh,
50
48
  version_file: RailsVersion.build,
51
49
  website: website
@@ -67,7 +65,6 @@ module Groundskeeper
67
65
  repository: nil,
68
66
  rubygems: nil,
69
67
  sentry: nil,
70
- slack: nil,
71
68
  ssh: nil,
72
69
  website: nil
73
70
  )
@@ -79,7 +76,6 @@ module Groundskeeper
79
76
  @repository = repository
80
77
  @rubygems = rubygems
81
78
  @sentry = sentry
82
- @slack = slack
83
79
  @ssh = ssh
84
80
  @website = website
85
81
  @version_file = version_file
@@ -153,7 +149,6 @@ module Groundskeeper
153
149
  return unrecognized_tag unless tag_present_in_git?(ENV[TAG])
154
150
  return missing_jira_credentials unless jira.credentials?
155
151
  return missing_sentry_credentials unless sentry.credentials?
156
- return missing_slack_credentials unless slack.credentials?
157
152
  return groundskeeper_outdated unless check_groundskeeper_version
158
153
  return unable_to_ssh unless ssh.can_connect?
159
154
 
@@ -174,7 +169,7 @@ module Groundskeeper
174
169
 
175
170
  # collaborators
176
171
  attr_reader :remote_version_control, :console, :git, :jira, :project,
177
- :repository, :rubygems, :sentry, :slack, :ssh, :version_file,
172
+ :repository, :rubygems, :sentry, :ssh, :version_file,
178
173
  :website
179
174
  # state
180
175
  attr_reader :current_step, :did_push_to_remote, :next_version,
@@ -358,13 +353,6 @@ module Groundskeeper
358
353
  )
359
354
  end
360
355
 
361
- def missing_slack_credentials
362
- console.say(
363
- "Please configure your Slack environment variables.",
364
- :red
365
- )
366
- end
367
-
368
356
  def unable_to_ssh
369
357
  console.say(
370
358
  "Unable to SSH to the server, are you signed into VPN?",
@@ -399,14 +387,14 @@ module Groundskeeper
399
387
  )
400
388
 
401
389
  begin
402
- deployed_version = SemanticVersion.new(website.version)
390
+ deployed_version_name = website.version.strip
391
+ deployed_version = SemanticVersion.new(deployed_version_name)
403
392
  current_version = SemanticVersion.new(version_file.current_version)
404
393
 
405
394
  raise VersionError unless deployed_version.version == ENV[TAG]
406
395
 
407
396
  console.say("# deployment successful", :green)
408
397
  transition_remote_issues(deployed_version, current_version)
409
- announce_in_slack deployed_version.version
410
398
  rescue VersionError
411
399
  tries += 1
412
400
  sleep 5
@@ -453,13 +441,6 @@ module Groundskeeper
453
441
  end
454
442
  # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
455
443
 
456
- def announce_in_slack(deployed_version)
457
- slack.send_message(
458
- "#{project.project_name} version #{deployed_version} deployed to " +
459
- self.class.stage
460
- )
461
- end
462
-
463
444
  def announce_step(message)
464
445
  console.say(">>>", :magenta)
465
446
  console.say(">>> #{@current_step}. #{message}", :magenta)
@@ -9,7 +9,7 @@ module Groundskeeper
9
9
  SEMANTIC_RELEASE_TYPE = { M: MAJOR, m: MINOR, p: PATCH }.freeze
10
10
  WORD_NUMBER_PATTERN = /^([a-zA-Z]+)-(\d+)$/
11
11
 
12
- attr_reader :major, :minor, :patch
12
+ attr_reader :major, :minor, :patch, :version
13
13
 
14
14
  # :nocov:
15
15
  def self.build(version)
@@ -20,6 +20,8 @@ module Groundskeeper
20
20
  # :nocov:
21
21
 
22
22
  def initialize(version)
23
+ @version = version
24
+
23
25
  if version.match(WORD_NUMBER_PATTERN)
24
26
  @word = ::Regexp.last_match(1)
25
27
  @number = ::Regexp.last_match(2).to_i
@@ -59,9 +61,5 @@ module Groundskeeper
59
61
 
60
62
  minor == other_minor && patch > other_version.patch
61
63
  end
62
-
63
- def version
64
- "#{major}.#{minor}.#{patch}"
65
- end
66
64
  end
67
65
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Groundskeeper
4
- VERSION = "0.43.0"
4
+ VERSION = "0.44.0"
5
5
  end
data/lib/groundskeeper.rb CHANGED
@@ -18,7 +18,6 @@ require "groundskeeper/repository"
18
18
  require "groundskeeper/rubygems"
19
19
  require "groundskeeper/semantic_version"
20
20
  require "groundskeeper/sentry"
21
- require "groundskeeper/slack"
22
21
  require "groundskeeper/ssh"
23
22
  require "groundskeeper/string_utils"
24
23
  require "groundskeeper/version"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: groundskeeper-bitcore
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.43.0
4
+ version: 0.44.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - RADD
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-10-20 00:00:00.000000000 Z
11
+ date: 2026-11-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jira-ruby
@@ -200,6 +200,7 @@ executables:
200
200
  extensions: []
201
201
  extra_rdoc_files: []
202
202
  files:
203
+ - ".github/copilot-instructions.md"
203
204
  - ".github/workflows/test_ci.yml"
204
205
  - ".gitignore"
205
206
  - ".rubocop.yml"
@@ -238,7 +239,6 @@ files:
238
239
  - lib/groundskeeper/rubygems.rb
239
240
  - lib/groundskeeper/semantic_version.rb
240
241
  - lib/groundskeeper/sentry.rb
241
- - lib/groundskeeper/slack.rb
242
242
  - lib/groundskeeper/ssh.rb
243
243
  - lib/groundskeeper/string_utils.rb
244
244
  - lib/groundskeeper/version.rb
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Groundskeeper
4
- # Posts to the RADD #general channel.
5
- class Slack
6
- COMMAND = "curl"
7
- SLACK_WORKSPACE_KEY = "SLACK_WORKSPACE"
8
- SLACK_CHANNEL_KEY = "SLACK_CHANNEL"
9
- SLACK_TOKEN_KEY = "SLACK_TOKEN"
10
- URL = "https://hooks.slack.com/services/" \
11
- "%<workspace>s/%<channel>s/%<token>s"
12
- SEND_MESSAGE = "-X POST -H 'Content-type: application/json' " \
13
- "--data '{\"text\":\"%<message>s\"}' #{URL}".freeze
14
-
15
- attr_reader :slack
16
-
17
- def self.build
18
- new Executable.new(COMMAND)
19
- end
20
-
21
- def initialize(slack)
22
- @slack = slack
23
- end
24
-
25
- def send_message(message)
26
- slack.execute(format(SEND_MESSAGE,
27
- message: message,
28
- workspace: ENV.fetch(SLACK_WORKSPACE_KEY, nil),
29
- channel: ENV.fetch(SLACK_CHANNEL_KEY, nil),
30
- token: ENV.fetch(SLACK_TOKEN_KEY, nil)))
31
- end
32
-
33
- def credentials?
34
- !ENV.fetch(SLACK_WORKSPACE_KEY, "").empty? &&
35
- !ENV.fetch(SLACK_CHANNEL_KEY, "").empty? &&
36
- !ENV.fetch(SLACK_TOKEN_KEY, "").empty?
37
- end
38
- end
39
- end