bard 1.3.9 → 1.4.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: 4786eaeab7a9790f644eebe54fe86e3c03e829a9e1d2bc149e612c6b125d9687
4
- data.tar.gz: ce9ba38f2f0e4e1897997d31f6f687cf2256978f928bcd3399555e1b7bdbc200
3
+ metadata.gz: cb512a4a019bd8b6c275c56d5f18107756dbd9f9792747e96b13435c5fb67257
4
+ data.tar.gz: 54f9674d14d7ec28ec98024fdde5c33b3869808e144beb9c49f19b6ac8c0f526
5
5
  SHA512:
6
- metadata.gz: 54b835052687d6356ffc0f06d62413f1cbdb4f9fd606fe4047849d3556069d871e3432b5c79ff5d84bab829293fb0ad2333ef0b7671232ca8ea39d8f27d46c9e
7
- data.tar.gz: cd14da902d7b39bc7dc665164a0019225ca23436122498d1dae2cd78966cece12acea9346f6345e8cf3a141a35130813c63c8af726559b25fe43bcc518589464
6
+ metadata.gz: 4df00ef514149aa70765c4998c62c5bbbbe21e4e40990979fe7fcf99005ee20b362ec6f8bc2dc78112afd8b0e25a7e5874d2761f14ba89488da0ced2a2c87c89
7
+ data.tar.gz: 1c32f9fd761e8723798d0d87b2b748a0d5befc716555907561fc0924b921fe8d1ca280f3ee48377c47e35129b6fbd9eb29b7262c9e13c1923ac72ef6b478dce3
data/bard.gemspec CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
20
20
  spec.add_dependency "thor", ">= 0.19.0"
21
21
  spec.add_dependency "rvm"
22
22
  spec.add_dependency "term-ansicolor", ">= 1.0.3"
23
+ spec.add_dependency "rbnacl"
23
24
 
24
25
  spec.add_development_dependency "byebug"
25
26
  spec.add_development_dependency "rspec"
data/lib/bard/cli/new.rb CHANGED
@@ -40,7 +40,8 @@ class Bard::CLI::New < Bard::CLI::Command
40
40
  end
41
41
 
42
42
  def push_to_github
43
- Bard::Github.new(project_name).create_repo
43
+ api = Bard::Github.new(project_name)
44
+ api.create_repo
44
45
  run! <<~BASH
45
46
  cd ../#{project_name}
46
47
  git init -b master
@@ -49,6 +50,8 @@ class Bard::CLI::New < Bard::CLI::Command
49
50
  git remote add origin git@github.com:botandrosedesign/#{project_name}
50
51
  git push -u origin master
51
52
  BASH
53
+ api.add_master_key File.read("../#{project_name}/config/master.key")
54
+ api.add_master_branch_protection
52
55
  end
53
56
 
54
57
  def stage
@@ -21,6 +21,9 @@ file ".gitignore", <<~GITIGNORE
21
21
  # Ignore master key for decrypting credentials and more.
22
22
  /config/master.key
23
23
 
24
+ # ignore coverage reports
25
+ /coverage
26
+
24
27
  # Ignore database dumps
25
28
  /db/data.*
26
29
 
@@ -39,24 +42,25 @@ file "Gemfile", <<~RUBY
39
42
 
40
43
  gem "bootsnap", require: false
41
44
  gem "rails", "~>8.0.0"
45
+ gem "solid_cache"
46
+ gem "solid_queue"
47
+ gem "solid_cable"
42
48
  gem "bard-rails"
43
49
  gem "sqlite3"
50
+ gem "image_processing"
51
+ gem "puma"
52
+ gem "exception_notification"
44
53
 
54
+ # css
45
55
  gem "sprockets-rails"
46
56
  gem "dartsass-sprockets"
47
57
  gem "bard-sass"
48
58
 
59
+ # js
49
60
  gem "importmap-rails"
50
61
  gem "turbo-rails"
51
62
  gem "stimulus-rails"
52
63
 
53
- gem "solid_cache"
54
- gem "solid_queue"
55
- gem "solid_cable"
56
-
57
- gem "image_processing"
58
- gem "puma"
59
-
60
64
  group :development do
61
65
  gem "web-console"
62
66
  end
@@ -83,6 +87,64 @@ file "Gemfile", <<~RUBY
83
87
  end
84
88
  RUBY
85
89
 
90
+ file "config/initializers/exception_notification.rb", <<~RUBY
91
+ require "exception_notification/rails"
92
+
93
+ ExceptionNotification.configure do |config|
94
+ config.ignored_exceptions = []
95
+
96
+ # Adds a condition to decide when an exception must be ignored or not.
97
+ # The ignore_if method can be invoked multiple times to add extra conditions.
98
+ config.ignore_if do |exception, options|
99
+ not Rails.env.production?
100
+ end
101
+
102
+ config.ignore_if do |exception, options|
103
+ %w[
104
+ ActiveRecord::RecordNotFound
105
+ AbstractController::ActionNotFound
106
+ ActionController::RoutingError
107
+ ActionController::InvalidAuthenticityToken
108
+ ActionView::MissingTemplate
109
+ ActionController::BadRequest
110
+ ActionDispatch::Http::Parameters::ParseError
111
+ ActionDispatch::Http::MimeNegotiation::InvalidType
112
+ ].include?(exception.class.to_s)
113
+ end
114
+
115
+ config.add_notifier :email, {
116
+ email_prefix: "[\#{File.basename(Dir.pwd)}] ",
117
+ exception_recipients: "micah@botandrose.com",
118
+ smtp_settings: Rails.application.credentials.exception_notification_smtp_settings,
119
+ }
120
+ end
121
+
122
+ if defined?(Rake::Application)
123
+ Rake::Application.prepend Module.new {
124
+ def display_error_message error
125
+ ExceptionNotifier.notify_exception(error)
126
+ super
127
+ end
128
+
129
+ def invoke_task task_name
130
+ super
131
+ rescue RuntimeError => exception
132
+ if exception.message.starts_with?("Don't know how to build task")
133
+ ExceptionNotifier.notify_exception(exception)
134
+ end
135
+ raise exception
136
+ end
137
+ }
138
+ end
139
+
140
+ ActionController::Live.prepend Module.new {
141
+ def log_error exception
142
+ ExceptionNotifier.notify_exception exception, env: request.env
143
+ super
144
+ end
145
+ }
146
+ RUBY
147
+
86
148
  file "app/assets/config/manifest.js", <<~RUBY
87
149
  //= link_tree ../images
88
150
  //= link_directory ../stylesheets .css
@@ -110,6 +172,18 @@ insert_into_file "config/database.yml", <<~YAML, after: "database: storage/test.
110
172
  database: storage/staging.sqlite3
111
173
  YAML
112
174
 
175
+ insert_into_file "config/database.yml", <<-YAML, after: "# database: path/to/persistent/storage/production.sqlite3"
176
+
177
+ cable:
178
+ <<: *default
179
+ # database: path/to/persistent/storage/production_cable.sqlite3
180
+ migrations_paths: db/cable_migrate
181
+ queue:
182
+ <<: *default
183
+ # database: path/to/persistent/storage/production_queue.sqlite3
184
+ migrations_paths: db/queue_migrate
185
+ YAML
186
+
113
187
  gsub_file "config/environments/production.rb", / (config\.logger.+STDOUT.*)$/, ' # \1'
114
188
 
115
189
  after_bundle do
data/lib/bard/git.rb CHANGED
@@ -20,7 +20,9 @@ module Bard
20
20
  end
21
21
 
22
22
  def sha_of ref
23
- `git rev-parse #{ref}`.chomp
23
+ sha = `git rev-parse #{ref} 2>/dev/null`.chomp
24
+ return sha if $?.success?
25
+ nil # Branch doesn't exist
24
26
  end
25
27
  end
26
28
  end
data/lib/bard/github.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require "net/http"
2
2
  require "json"
3
3
  require "base64"
4
+ require "rbnacl"
4
5
 
5
6
  module Bard
6
7
  class Github < Struct.new(:project_name)
@@ -19,6 +20,14 @@ module Bard
19
20
  end
20
21
  end
21
22
 
23
+ def put path, params={}
24
+ request(path) do |uri|
25
+ Net::HTTP::Put.new(uri).tap do |r|
26
+ r.body = JSON.dump(params)
27
+ end
28
+ end
29
+ end
30
+
22
31
  def delete path, params={}
23
32
  request(path) do |uri|
24
33
  Net::HTTP::Delete.new(uri).tap do |r|
@@ -36,6 +45,38 @@ module Bard
36
45
  post("keys", title:, key:)
37
46
  end
38
47
 
48
+ def add_master_key master_key
49
+ response = get("actions/secrets/public-key")
50
+ public_key, public_key_id = response.values_at("key", "key_id")
51
+
52
+ def encrypt_secret(encoded_public_key, secret)
53
+ decoded_key = Base64.decode64(encoded_public_key)
54
+ public_key = RbNaCl::PublicKey.new(decoded_key)
55
+ box = RbNaCl::Boxes::Sealed.from_public_key(public_key)
56
+ encrypted_secret = box.encrypt(secret)
57
+ Base64.strict_encode64(encrypted_secret)
58
+ end
59
+
60
+ encrypted_master_key = encrypt_secret(public_key, master_key)
61
+
62
+ put("actions/secrets/RAILS_MASTER_KEY", {
63
+ encrypted_value: encrypted_master_key,
64
+ key_id: public_key_id,
65
+ })
66
+ end
67
+
68
+ def add_master_branch_protection
69
+ put("branches/master/protection", {
70
+ required_status_checks: {
71
+ strict: false,
72
+ contexts: [],
73
+ },
74
+ enforce_admins: nil,
75
+ required_pull_request_reviews: nil,
76
+ restrictions: nil,
77
+ })
78
+ end
79
+
39
80
  def create_repo
40
81
  post("https://api.github.com/orgs/botandrosedesign/repos", {
41
82
  name: project_name,
@@ -92,9 +92,7 @@ module Bard
92
92
  end
93
93
 
94
94
  def get_parent_commit
95
- sha = Git.sha_of("#{@branch}^{commit}")
96
- return sha if $?.success?
97
- nil # Branch doesn't exist yet
95
+ Git.sha_of("#{@branch}^{commit}")
98
96
  end
99
97
 
100
98
  def commit_and_push commit_sha
data/lib/bard/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Bard
2
- VERSION = "1.3.9"
2
+ VERSION = "1.4.0"
3
3
  end
4
4
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bard
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.9
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Micah Geisel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-01-17 00:00:00.000000000 Z
11
+ date: 2025-01-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: 1.0.3
55
+ - !ruby/object:Gem::Dependency
56
+ name: rbnacl
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: byebug
57
71
  requirement: !ruby/object:Gem::Requirement