hephaestus 0.0.1 → 0.1.1

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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/CHANGELOG.md +16 -0
  4. data/README.md +6 -4
  5. data/bin/hephaestus +19 -6
  6. data/lib/hephaestus/app_builder.rb +7 -1
  7. data/lib/hephaestus/generators/base.rb +4 -0
  8. data/lib/hephaestus/generators/config_generator.rb +3 -3
  9. data/lib/hephaestus/generators/core_generator.rb +1 -2
  10. data/lib/hephaestus/generators/lib_generator.rb +5 -0
  11. data/lib/hephaestus/generators/sorbet_generator.rb +1 -0
  12. data/lib/hephaestus/version.rb +1 -1
  13. data/templates/.env.test +4 -0
  14. data/templates/.github/actions/license/action.yml +11 -0
  15. data/templates/.github/actions/setup/action.yml +10 -0
  16. data/templates/.github/actions/sisyphus/action.yml +11 -0
  17. data/templates/.github/actions/sorbet/action.yml +19 -0
  18. data/templates/.github/dependabot.yml +22 -0
  19. data/templates/.github/workflows/automerge.yml +97 -0
  20. data/templates/.github/workflows/licenses.yml +43 -0
  21. data/templates/.github/workflows/lint.yml +52 -0
  22. data/templates/.github/workflows/security.yml +38 -0
  23. data/templates/.github/workflows/sorbet.yml +49 -0
  24. data/templates/.github/workflows/test.yml +53 -0
  25. data/templates/.licensed.yml +33 -0
  26. data/templates/.rubocop.yml +5 -0
  27. data/templates/.vscode/extensions.json +9 -0
  28. data/templates/.vscode/launch.json +13 -0
  29. data/templates/.vscode/settings.json +52 -0
  30. data/templates/app/lib/plug_app/middleware/tracing_attributes.rb +6 -1
  31. data/templates/config/initializers/environment.rb +1 -1
  32. data/templates/lib/plug_app/schemas/api/2023-03-06/components/schemas/yetto.json +167 -1
  33. data/templates/lib/plug_app/schemas/api/2023-03-06/openapi.json +3 -0
  34. data/templates/lib/plug_app/schemas/api/2023-03-06/paths/plug.json +4 -5
  35. data/templates/lib/plug_app/schemas/api/2023-03-06/paths/yetto/after_create_message.json +11 -1
  36. data/templates/lib/plug_app/schemas/api/2023-03-06/paths/yetto/after_create_plug_installation.json +10 -0
  37. data/templates/script/typecheck +2 -0
  38. data/templates/test/controllers/settings_controller_test.rb +1 -1
  39. data/templates/test/controllers/yetto_controller_test.rb +0 -1
  40. data/templates/test/fixtures/files/.keep +0 -0
  41. data/templates/test/integration/.keep +0 -0
  42. data/templates/test/mailers/.keep +0 -0
  43. data/templates/test/support/api.rb +1 -1
  44. data/templates/test/support/rails.rb +6 -5
  45. metadata +26 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 371b5a8acd1794fe2317f9f6e6c94de073e3790198d3f9f5871b149df137602e
4
- data.tar.gz: ba0f8d0dfe79c043782610058fcebbe74f8c05d2c3edc472200841b769aeaf6a
3
+ metadata.gz: 91109351951b2ac1514f251751c9311dd55028f4fdcfa8e0140fc2c4efa014c9
4
+ data.tar.gz: 452d4065cdfb605092c41c5677e87b85fe4070c6b21d2c28d8cd4649cadbfbb4
5
5
  SHA512:
6
- metadata.gz: a3b51205a5048ca0c67d5121fa477bb3b5053125968c0c31dd04386f5b224016e3a02dd08f5fcd74390b87f0dccbb253304e13f6c8da0f79584b137aa988231d
7
- data.tar.gz: 1d59384fc58c249d0b964a1dbe0d26a3c29109febaebd2ba12f9cea745c34d889fe674a992bfb42611c6a27b9b5fef6226b827399d65c7a75e128367684c2bce
6
+ metadata.gz: 31f32e5f396ae5b519bde7f6c30b7b796ae26f0db150e6ed1717eb2aaf153079f1755b0d8da36312bb3e5c151f2c7534fbfcf81c8d9efcf11e6f7769b2a5f2cd
7
+ data.tar.gz: d1b3456db78f30e7d62c20731cd1fcb3925bc39e1e8653fff9a2bfa693b8b38db0a6c48fffc1df86d8417a50098a4f195570f63387f412ba22b4b88855d29507
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.1.1
1
+ 3.2.1
data/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## [v0.1.1](https://github.com/yettoapp/hephaestus/tree/v0.1.1) (2023-03-15)
4
+
5
+ [Full Changelog](https://github.com/yettoapp/hephaestus/compare/v0.1.0...v0.1.1)
6
+
7
+ ## [v0.1.0](https://github.com/yettoapp/hephaestus/tree/v0.1.0) (2023-03-15)
8
+
9
+ [Full Changelog](https://github.com/yettoapp/hephaestus/compare/v0.0.2...v0.1.0)
10
+
11
+ **Merged pull requests:**
12
+
13
+ - Various updates [\#2](https://github.com/yettoapp/hephaestus/pull/2) ([gjtorikian](https://github.com/gjtorikian))
14
+
15
+ ## [v0.0.2](https://github.com/yettoapp/hephaestus/tree/v0.0.2) (2023-03-01)
16
+
17
+ [Full Changelog](https://github.com/yettoapp/hephaestus/compare/v0.0.1...v0.0.2)
18
+
3
19
  ## [v0.0.1](https://github.com/yettoapp/hephaestus/tree/v0.0.1) (2023-02-28)
4
20
 
5
21
  [Full Changelog](https://github.com/yettoapp/hephaestus/compare/b33ebb8ab3188b8689b10d4649d3f29ea7ca1f2a...v0.0.1)
data/README.md CHANGED
@@ -1,17 +1,19 @@
1
1
  # Hephaestus
2
2
 
3
- A plug template for Yetto.
3
+ A plug template for Yetto. Use this to quickly spin up new plugs with a set of defaults.
4
4
 
5
5
  ## Usage
6
6
 
7
7
  ```
8
- rails new plug-app --api -m hephaestus/template.rb
8
+ gem install hephaestus
9
+
10
+ hephaestus plug-app
9
11
  ```
10
12
 
11
- If you're working on updating this locally, you'll also probably want:
13
+ If you're working on updating this locally, you may also probably want:
12
14
 
13
15
  ```
14
- rm -rf plug-app && DEBUG=1 rails new plug-app --api -m hephaestus/template.rb
16
+ rm -rf plug-app && DEBUG=1 hephaestus/bin/hephaestus plug-app
15
17
  ```
16
18
 
17
19
  ## Acknowledgements
data/bin/hephaestus CHANGED
@@ -1,7 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
- require 'pathname'
2
+ # frozen_string_literal: true
3
3
 
4
- source_path = (Pathname.new(__FILE__).dirname + '../lib').expand_path
4
+ require "pathname"
5
+
6
+ source_path = (Pathname.new(__FILE__).dirname + "../lib").expand_path
5
7
  $LOAD_PATH << source_path
6
8
 
7
9
  activate_rails_version = ->(rails_version) do
@@ -10,7 +12,7 @@ activate_rails_version = ->(rails_version) do
10
12
  $LOAD_PATH.unshift(rails_path)
11
13
  end
12
14
 
13
- if str = ARGV.first
15
+ if (str = ARGV.first)
14
16
  str = str.b[/\A_(.*)_\z/, 1]
15
17
 
16
18
  if str && Gem::Version.correct?(str)
@@ -20,7 +22,7 @@ if str = ARGV.first
20
22
  begin
21
23
  activate_rails_version.call(rails_version)
22
24
  rescue Gem::GemNotFoundException
23
- abort "Hephaestus error: Unable to find Rails version #{rails_version}"
25
+ abort("Hephaestus error: Unable to find Rails version #{rails_version}")
24
26
  end
25
27
  else
26
28
  require "hephaestus/version"
@@ -38,13 +40,24 @@ if ARGV.empty?
38
40
  puts
39
41
  puts "See --help for more info"
40
42
  exit 0
41
- elsif ["-v", "--version"].include? ARGV[0]
43
+ elsif ["-v", "--version"].include?(ARGV[0])
42
44
  puts Hephaestus::VERSION
43
45
  exit 0
44
46
  end
45
47
 
48
+ path = ARGV.first
49
+ if File.exist?(path)
50
+ puts "The directory #{path} already exists."
51
+ exit 1
52
+ end
53
+
54
+ unless path.start_with?("plug-")
55
+ puts "The directory name must start with 'plug-'"
56
+ exit 1
57
+ end
58
+
46
59
  templates_root = File.expand_path(File.join("..", "templates"), File.dirname(__FILE__))
47
- Hephaestus::AppGenerator.source_root templates_root
60
+ Hephaestus::AppGenerator.source_root(templates_root)
48
61
  Hephaestus::AppGenerator.source_paths << Rails::Generators::AppGenerator.source_root << templates_root
49
62
 
50
63
  ARGV.push("--minimal")
@@ -6,6 +6,7 @@ require "forwardable"
6
6
  module Hephaestus
7
7
  class AppBuilder < ::Rails::AppBuilder
8
8
  include Hephaestus::Actions
9
+
9
10
  extend Forwardable
10
11
 
11
12
  def readme
@@ -138,7 +139,8 @@ module Hephaestus
138
139
  end
139
140
 
140
141
  def replace_generic_variables
141
- replace_in_files(destination_root, "${APP}", app_name.titlecase)
142
+ replace_in_files(destination_root, "${APP}", short_appname.capitalize)
143
+ replace_in_files(destination_root, "${app}", short_appname.downcase)
142
144
  replace_in_files(destination_root, "PlugApp", app_name.underscore.camelcase)
143
145
  replace_in_files(destination_root, "plug-app", app_name.dasherize)
144
146
  replace_in_files(destination_root, "PLUG_APP", app_name.underscore.upcase)
@@ -147,6 +149,10 @@ module Hephaestus
147
149
 
148
150
  private
149
151
 
152
+ def short_appname
153
+ app_name.split("_").last
154
+ end
155
+
150
156
  def root_path
151
157
  @root_path ||= Pathname(__dir__).join("..", "..").expand_path
152
158
  end
@@ -37,6 +37,10 @@ module Hephaestus
37
37
  Rails.app_class.module_parent_name.demodulize.underscore.dasherize
38
38
  end
39
39
 
40
+ def short_appname
41
+ app_name.sub(/plug-/i, "")
42
+ end
43
+
40
44
  def empty_directory_with_keep_file(destination)
41
45
  empty_directory(destination, {})
42
46
  keep_file(destination)
@@ -35,10 +35,10 @@ module Hephaestus
35
35
 
36
36
  Rails.root.glob("app/lib/#{app_name.underscore}/middleware/*.{rb}").each { |file| require_relative file }
37
37
 
38
- config.middleware.insert(0, PlugEmail::Middleware::TracingAttributes)
39
- config.middleware.insert(0, PlugEmail::Middleware::MalformedRequest)
38
+ config.middleware.insert(0, PlugApp::Middleware::TracingAttributes)
39
+ config.middleware.insert(0, PlugApp::Middleware::MalformedRequest)
40
40
 
41
- config.middleware.use(PlugEmail::Middleware::OpenapiValidation)
41
+ config.middleware.use(PlugApp::Middleware::OpenapiValidation)
42
42
 
43
43
  GIT_SHA = %x(git rev-parse HEAD).chomp
44
44
  CONFIG
@@ -23,9 +23,8 @@ module Hephaestus
23
23
  end
24
24
 
25
25
  def libs
26
- bare_app_name = app_name.split("-").last
27
26
  copy_file("app/lib/body_parameter/yetto_parameters.rb", "app/lib/body_parameter/yetto_parameters.rb")
28
- copy_file("app/lib/constants/app.rb", "app/lib/constants/#{bare_app_name}.rb")
27
+ copy_file("app/lib/constants/app.rb", "app/lib/constants/#{app_name}.rb")
29
28
  copy_file("app/lib/headers/yetto.rb", "app/lib/headers/yetto.rb")
30
29
  copy_file("app/lib/path_parameter/yetto_parameters.rb", "app/lib/path_parameter/yetto_parameters.rb")
31
30
  directory("app/lib/plug_app", "app/lib/#{app_name.underscore}")
@@ -12,5 +12,10 @@ module Hephaestus
12
12
  def lib_tasks
13
13
  directory("lib/tasks", "lib/tasks")
14
14
  end
15
+
16
+ def plug_schema
17
+ copy_file("lib/plug_app/schemas/api/2023-03-06/paths/plug.json", "lib/#{app_name.underscore}/schemas/api/2023-03-06/paths/#{short_appname.underscore}.json")
18
+ remove_file("lib/#{app_name.underscore}/schemas/api/2023-03-06/paths/plug.json") # cleanup
19
+ end
15
20
  end
16
21
  end
@@ -9,6 +9,7 @@ module Hephaestus
9
9
  copy_file("sorbet/custom.rbi", "sorbet/custom.rbi")
10
10
  Bundler.with_unbundled_env do
11
11
  run("bundle exec tapioca init")
12
+ run("bundle exec tapioca require")
12
13
  run("script/typecheck --update")
13
14
  end
14
15
  end
@@ -2,7 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Hephaestus
5
- VERSION = "0.0.1"
5
+ VERSION = "0.1.1"
6
6
  RAILS_VERSION = "~> 7.0.0"
7
7
  RUBY_VERSION = File
8
8
  .read("#{File.dirname(__FILE__)}/../../.ruby-version")
@@ -0,0 +1,4 @@
1
+ PLUG_APP_URL="plug-app.ngrok.io"
2
+ YETTO_API_VERSION_TLD="yetto.ngrok.io/api"
3
+
4
+ SLACK_LOG_URL=http://slack.com/the_log_room
@@ -0,0 +1,11 @@
1
+ name: "Run License Check"
2
+ description: "Validates that all the licenses are up to date."
3
+
4
+ runs:
5
+ using: "composite"
6
+ steps:
7
+ - uses: ./.github/actions/setup
8
+
9
+ - name: Run license check
10
+ shell: bash
11
+ run: script/licenses --update
@@ -0,0 +1,10 @@
1
+ name: "Set up Plug"
2
+ description: "Do whatever is necessary to setup the plug."
3
+
4
+ runs:
5
+ using: "composite"
6
+ steps:
7
+ - uses: ruby/setup-ruby@v1
8
+ with:
9
+ bundler-cache: true
10
+ rubygems: latest
@@ -0,0 +1,11 @@
1
+ name: "Configure git"
2
+ description: "Sets up Git creds for Sisyphus"
3
+
4
+ runs:
5
+ using: "composite"
6
+ steps:
7
+ - name: Run git config
8
+ shell: bash
9
+ run: |
10
+ git config --local user.email "sisyphus@yetto.app"
11
+ git config --local user.name "Sisyphus"
@@ -0,0 +1,19 @@
1
+ name: "Run Sorbet Check"
2
+ description: "Validates that all the Sorbet types are up to date."
3
+
4
+ inputs:
5
+ gh_token:
6
+ description: 'A GitHub PAT'
7
+ required: true
8
+
9
+ runs:
10
+ using: "composite"
11
+ steps:
12
+ - uses: ./.github/actions/setup
13
+
14
+ - name: Update RBI files
15
+ shell: bash
16
+ id: update
17
+ env:
18
+ GITHUB_TOKEN: ${{ inputs.gh_token }}
19
+ run: script/typecheck --update
@@ -0,0 +1,22 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "github-actions"
4
+ directory: "/"
5
+ schedule:
6
+ interval: daily
7
+ time: "09:00"
8
+ timezone: "Etc/UTC"
9
+ open-pull-requests-limit: 10
10
+
11
+ - package-ecosystem: bundler
12
+ directory: "/"
13
+ schedule:
14
+ interval: daily
15
+ time: "09:00"
16
+ timezone: "Etc/UTC"
17
+ open-pull-requests-limit: 10
18
+ allow:
19
+ - dependency-name: "*"
20
+ dependency-type: "production"
21
+ - dependency-name: "sorbet*"
22
+ dependency-type: "all"
@@ -0,0 +1,97 @@
1
+ name: PR auto-{approve,merge}
2
+
3
+ on:
4
+ pull_request_target:
5
+
6
+ permissions:
7
+ pull-requests: write
8
+ contents: write
9
+
10
+ jobs:
11
+ dependabot:
12
+ name: Dependabot
13
+ runs-on: ubuntu-latest
14
+
15
+ env:
16
+ RAILS_ENV: test
17
+ REDIS_URL: redis://localhost:6379/0
18
+ RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
19
+ SLACK_LOG_URL: http://slack.com/the_log_room
20
+
21
+ # Service containers to run; note that this is duplicated
22
+ # in test.yml due to a limitation in GitHub Actions
23
+ # (services can only be defined per job)
24
+ services:
25
+ redis:
26
+ # Docker Hub image name
27
+ image: redis:6.2-alpine
28
+ ports: ["6379:6379"]
29
+ # Set health checks to wait until redis has started
30
+ options: >-
31
+ --health-cmd "redis-cli ping" --health-interval 10s --health-timeout
32
+ 5s --health-retries 5
33
+
34
+ if: ${{ github.event.pull_request.user.login == 'dependabot[bot]' }}
35
+ steps:
36
+ - name: Fetch Dependabot metadata
37
+ id: dependabot-metadata
38
+ uses: dependabot/fetch-metadata@v1
39
+ with:
40
+ github-token: "${{ secrets.GITHUB_TOKEN }}"
41
+
42
+ - uses: actions/checkout@v3
43
+ with:
44
+ ref: ${{ github.head_ref }}
45
+
46
+ - uses: ./.github/actions/sisyphus
47
+
48
+ - uses: ./.github/actions/license
49
+
50
+ - name: Commit licenses
51
+ run: |
52
+ git add .
53
+ git commit -m "[auto-license]: Update license information" || true
54
+ git push
55
+
56
+ - uses: ./.github/actions/sorbet
57
+
58
+ - name: Commit Sorbet
59
+ run: |
60
+ git add .
61
+ git commit -m "[auto-rbi]: Update RBI files" || true
62
+ git push
63
+
64
+ - name: Approve Dependabot PR
65
+ if: ${{steps.dependabot-metadata.outputs.update-type != 'version-update:semver-major'}}
66
+ run: gh pr review --approve "$PR_URL"
67
+ env:
68
+ PR_URL: ${{github.event.pull_request.html_url}}
69
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
70
+
71
+ - name: Merge Dependabot PR
72
+ run: gh pr merge --auto --squash "$PR_URL"
73
+ env:
74
+ PR_URL: ${{ github.event.pull_request.html_url }}
75
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
76
+
77
+ sisyphusbot:
78
+ name: Automated PRs
79
+ runs-on: ubuntu-latest
80
+
81
+ if: ${{ github.event.pull_request.user.login == 'sisyphusbot' }}
82
+ steps:
83
+ - uses: actions/checkout@v3
84
+
85
+ - name: Approve Automated PR
86
+ if: startsWith(github.event.pull_request.title, '[auto')
87
+ run: gh pr review --approve "$PR_URL"
88
+ env:
89
+ PR_URL: ${{ github.event.pull_request.html_url }}
90
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
91
+
92
+ - name: Merge Automated PR
93
+ if: startsWith(github.event.pull_request.title, '[auto')
94
+ run: gh pr merge --auto --squash "$PR_URL"
95
+ env:
96
+ PR_URL: ${{ github.event.pull_request.html_url }}
97
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -0,0 +1,43 @@
1
+ name: Update licenses
2
+
3
+ on:
4
+ push:
5
+ paths:
6
+ - "**/Gemfile.lock"
7
+ branches:
8
+ - production
9
+ - staging
10
+ workflow_dispatch:
11
+
12
+ permissions:
13
+ contents: write
14
+ pull-requests: write
15
+
16
+ jobs:
17
+ license-cache:
18
+ runs-on: ubuntu-latest
19
+
20
+ steps:
21
+ - uses: actions/checkout@v3
22
+ with:
23
+ ref: ${{ github.ref }}
24
+
25
+ - uses: ./.github/actions/license
26
+
27
+ - name: Create Pull Request
28
+ uses: peter-evans/create-pull-request@v4
29
+ with:
30
+ token: ${{ secrets.GH_SISYPHUS_YETTO_REPO_TOKEN }}
31
+ commit-message: "[auto-license] Update license information"
32
+ title: "[auto-license] Update license information"
33
+ body: |
34
+ - Update license information
35
+
36
+ Auto-generated by [create-pull-request][1]
37
+
38
+ [1]: https://github.com/peter-evans/create-pull-request
39
+ branch: update-licenses
40
+ committer: Sisyphus <sisyphus@yetto.app>
41
+ author: Sisyphus <sisyphus@yetto.app>
42
+ delete-branch: true
43
+ labels: 'chore, github action'
@@ -0,0 +1,52 @@
1
+ name: Linting
2
+
3
+ on:
4
+ pull_request:
5
+
6
+ env:
7
+ RAILS_ENV: test
8
+
9
+ jobs:
10
+ rubocop:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v3
14
+
15
+ # reads from .ruby-version
16
+ - uses: ruby/setup-ruby@v1
17
+ with:
18
+ bundler-cache: true
19
+ rubygems: latest
20
+
21
+ - name: Rubocop
22
+ run: bundle exec rake rubocop
23
+
24
+ ruby-types:
25
+ runs-on: ubuntu-latest
26
+ steps:
27
+ - uses: actions/checkout@v3
28
+
29
+ # reads from .ruby-version
30
+ - uses: ruby/setup-ruby@v1
31
+ with:
32
+ bundler-cache: true
33
+ rubygems: latest
34
+
35
+ - name: Sorbet
36
+ id: sorbet_tc
37
+ run: bundle exec srb tc
38
+
39
+ - name: Provide error message
40
+ if: failure() && steps.sorbet_tc.outcome == 'failure'
41
+ run: |
42
+ echo "Run 'bundle exec srb tc -a' to auto-correct Sorbet checks."
43
+
44
+ - name: Verifying Tapioca
45
+ id: tapioca_verify
46
+ run: script/typecheck --verify
47
+
48
+ - name: Provide error message
49
+ if: failure() && steps.tapioca_verify.outcome == 'failure'
50
+ run: |
51
+ echo "Run 'script/typecheck --update' to update Tapioca's RBI files."
52
+ echo "Run 'script/typecheck --verify' to verify that Tapioca's RBI files are up-to-date."
@@ -0,0 +1,38 @@
1
+ name: Security
2
+
3
+ on:
4
+ pull_request:
5
+
6
+ env:
7
+ RAILS_ENV: test
8
+ BUNDLE_WITH: "ci"
9
+
10
+ jobs:
11
+ bundle-audit:
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@v3
15
+ - uses: ruby/setup-ruby@v1
16
+ with:
17
+ bundler-cache: true
18
+ rubygems: latest
19
+
20
+ # Patch-level verification for bundler.
21
+ - name: Run bundle-audit
22
+ run: |
23
+ script/security_checks/bundle-audit
24
+
25
+ brakeman: # A static analysis security vulnerability scanner for Ruby on Rails applications
26
+ runs-on: ubuntu-latest
27
+ steps:
28
+ - uses: actions/checkout@v3
29
+
30
+ - uses: ruby/setup-ruby@v1
31
+ with:
32
+ bundler-cache: true
33
+ rubygems: latest
34
+
35
+ - name: brakeman report
36
+ run: |
37
+ script/security_checks/brakeman
38
+ cat security-results.json
@@ -0,0 +1,49 @@
1
+ name: Update Sorbet files
2
+
3
+ on:
4
+ pull_request:
5
+ paths:
6
+ - '**.rb'
7
+
8
+ permissions:
9
+ contents: write
10
+ pull-requests: write
11
+
12
+ jobs:
13
+ trigger_tapioca_pr:
14
+ runs-on: ubuntu-latest
15
+
16
+ env:
17
+ RAILS_ENV: test
18
+ REDIS_URL: redis://localhost:6379/0
19
+ RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
20
+ SLACK_LOG_URL: http://slack.com/the_log_room
21
+
22
+ # Service containers to run; note that this is duplicated
23
+ # in test.yml due to a limitation in GitHub Actions
24
+ # (services can only be defined per job)
25
+ services:
26
+ redis:
27
+ # Docker Hub image name
28
+ image: redis:6.2-alpine
29
+ ports: ["6379:6379"]
30
+ # Set health checks to wait until redis has started
31
+ options: >-
32
+ --health-cmd "redis-cli ping" --health-interval 10s --health-timeout
33
+ 5s --health-retries 5
34
+
35
+ if: ${{ github.event.pull_request.user.login != 'dependabot[bot]' }}
36
+ steps:
37
+ - uses: actions/checkout@v3
38
+ with:
39
+ ref: ${{ github.head_ref }}
40
+
41
+ - uses: ./.github/actions/sisyphus
42
+
43
+ - uses: ./.github/actions/sorbet
44
+
45
+ - name: Commit Sorbet
46
+ run: |
47
+ git add .
48
+ git commit -m "[auto-rbi]: Update RBI files" || true
49
+ git push
@@ -0,0 +1,53 @@
1
+ name: Test
2
+
3
+ on:
4
+ pull_request:
5
+
6
+ jobs:
7
+ test:
8
+ runs-on: ubuntu-latest
9
+
10
+ env:
11
+ RAILS_ENV: test
12
+ REDIS_URL: redis://localhost:6379/0
13
+ RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
14
+ SLACK_LOG_URL: http://slack.com/the_log_room
15
+
16
+ # Service containers to run; note that this is duplicated
17
+ # in sorbet.yml due to a limitation in GitHub Actions
18
+ # (services can only be defined per job)
19
+ services:
20
+ redis:
21
+ # Docker Hub image name
22
+ image: redis:6.2-alpine
23
+ ports: ["6379:6379"]
24
+ # Set health checks to wait until redis has started
25
+ options: >-
26
+ --health-cmd "redis-cli ping" --health-interval 10s --health-timeout
27
+ 5s --health-retries 5
28
+
29
+ steps:
30
+ - uses: actions/checkout@v3
31
+ with:
32
+ ref: ${{github.ref}} # checkout branch not SHA
33
+ fetch-depth: 0
34
+
35
+ - uses: ./.github/actions/setup
36
+
37
+ - name: Run tests
38
+ run: |
39
+ script/ci
40
+
41
+ test-licenses:
42
+ needs: test
43
+ runs-on: ubuntu-latest
44
+
45
+ if: ${{ github.event.pull_request.user.login != 'dependabot[bot]' }}
46
+ steps:
47
+ - uses: actions/checkout@v3
48
+
49
+ - uses: ./.github/actions/setup
50
+
51
+ - name: Verifying licenses
52
+ run: script/licenses --verify
53
+
@@ -0,0 +1,33 @@
1
+ cache_path: vendor/.licenses
2
+
3
+ allowed:
4
+ - apache-2.0
5
+ - bsd-2-clause
6
+ - bsd-3-clause
7
+ - isc
8
+ - mit
9
+ - cc0-1.0
10
+ - unlicense
11
+
12
+ ignored:
13
+ bundler:
14
+ - bundler-audit # GPL-3.0; but also, only used in CI/test
15
+ - ruby2_keywords # BSD-2-Clause; ignored because of custom LICENSE text
16
+ - sidekiq # LGPL-3.0; ignored because of custom LICENSE text
17
+
18
+ reviewed:
19
+ bundler:
20
+ - activerecord # MIT
21
+ - brakeman # BRAKEMAN PUBLIC USE LICENSE
22
+ - concurrent-ruby # MIT
23
+ - date # BSD-2-Clause
24
+ - dry-transformer # MIT
25
+ - json # BSD-2-Clause
26
+ - net-imap # BSD-2-Clause
27
+ - net-pop # BSD-2-Clause
28
+ - net-protocol # BSD-2-Clause
29
+ - net-smtp # BSD-2-Clause
30
+ - racc # BSD-2-Clause
31
+ - timeout # BSD-2-Clause
32
+ - websocket-driver # Apache-2.0
33
+ - websocket-extensions # Apache-2.0
@@ -0,0 +1,5 @@
1
+ inherit_gem:
2
+ rubocop-standard:
3
+ - config/default.yml
4
+ - config/minitest.yml
5
+ - config/rails.yml
@@ -0,0 +1,9 @@
1
+ {
2
+ "recommendations": [
3
+ "shopify.ruby-extensions-pack",
4
+ "bradlc.vscode-tailwindcss",
5
+ "johnpapa.vscode-peacock",
6
+ "manuelpuyol.erb-linter",
7
+ "esbenp.prettier-vscode"
8
+ ]
9
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ // Use IntelliSense to learn about possible attributes.
3
+ // Hover to view descriptions of existing attributes.
4
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5
+ "version": "0.2.0",
6
+ "configurations": [
7
+ {
8
+ "type": "rdbg",
9
+ "name": "Attach rdbg",
10
+ "request": "attach"
11
+ },
12
+ ]
13
+ }
@@ -0,0 +1,52 @@
1
+ {
2
+ "files.associations": {
3
+ "*.css": "tailwindcss",
4
+ "*.rbi": "ruby",
5
+ "*.rbupdated": "ruby",
6
+ "*.rbedited": "ruby"
7
+ },
8
+ "tailwindCSS.includeLanguages": {
9
+ "plaintext": "html"
10
+ },
11
+ "tailwindCSS.emmetCompletions": true,
12
+ "rubyLsp.enabledFeatures": {
13
+ "documentHighlights": true,
14
+ "documentLink": true,
15
+ "documentSymbols": true,
16
+ "foldingRanges": true,
17
+ "selectionRanges": true,
18
+ "semanticHighlighting": true,
19
+ "formatting": true,
20
+ "diagnostics": true,
21
+ "codeActions": true,
22
+ "onTypeFormatting": true
23
+ },
24
+ "[javascript]": {
25
+ "editor.codeActionsOnSave": {
26
+ "source.fixAll.eslint": true
27
+ }
28
+ },
29
+ "[ruby]": {
30
+ "editor.defaultFormatter": "Shopify.ruby-lsp",
31
+ },
32
+ "peacock.color": "#26FF9A",
33
+ "workbench.colorCustomizations": {
34
+ "activityBar.activeBackground": "#59ffb2",
35
+ "activityBar.background": "#59ffb2",
36
+ "activityBar.foreground": "#15202b",
37
+ "activityBar.inactiveForeground": "#15202b99",
38
+ "activityBarBadge.background": "#c480ff",
39
+ "activityBarBadge.foreground": "#15202b",
40
+ "commandCenter.border": "#15202b99",
41
+ "sash.hoverBorder": "#59ffb2",
42
+ "statusBar.background": "#26ff9a",
43
+ "statusBar.foreground": "#15202b",
44
+ "statusBarItem.hoverBackground": "#00f281",
45
+ "statusBarItem.remoteBackground": "#26ff9a",
46
+ "statusBarItem.remoteForeground": "#15202b",
47
+ "titleBar.activeBackground": "#26ff9a",
48
+ "titleBar.activeForeground": "#15202b",
49
+ "titleBar.inactiveBackground": "#26ff9a99",
50
+ "titleBar.inactiveForeground": "#15202b99"
51
+ }
52
+ }
@@ -13,6 +13,7 @@ module PlugApp
13
13
  attr_reader :app
14
14
 
15
15
  HTTP_REQUEST_BODY = "http.request.body"
16
+ PLUG_APP_PATH_PREFIX = "/${app}/"
16
17
 
17
18
  sig { params(app: T.untyped).void }
18
19
  def initialize(app)
@@ -35,7 +36,11 @@ module PlugApp
35
36
 
36
37
  def filtered_params(request)
37
38
  params = request.params
38
- @filterer.filter(params).to_json
39
+ if request.path.starts_with?(PLUG_APP_PATH_PREFIX)
40
+ {}
41
+ else
42
+ @filterer.filter(params)
43
+ end.to_json
39
44
  end
40
45
  end
41
46
  end
@@ -1,7 +1,7 @@
1
1
  # typed: false
2
2
  # frozen_string_literal: true
3
3
 
4
- PLUG_APP_URL = ENV.fetch("PLUG_APP_URL", "yetto.email")
4
+ PLUG_APP_URL = ENV.fetch("PLUG_APP_URL", "")
5
5
 
6
6
  YETTO_URL = if Rails.env.production?
7
7
  "yetto.app"
@@ -1 +1,167 @@
1
- {}
1
+ {
2
+ "Create${APP}Message": {
3
+ "type": "object",
4
+ "required": [
5
+ "plug_installation",
6
+ "message",
7
+ "inbox"
8
+ ],
9
+ "properties": {
10
+ "plug_installation": {
11
+ "type": "object",
12
+ "required": [
13
+ "id",
14
+ "settings"
15
+ ],
16
+ "properties": {
17
+ "id": {
18
+ "type": "string",
19
+ "pattern": "^(?:pli)_[A-Z0-9]{26}$"
20
+ },
21
+ "settings": {
22
+ "type": "object",
23
+ "required": [],
24
+ "properties": {}
25
+ }
26
+ }
27
+ },
28
+ "inbox": {
29
+ "type": "object",
30
+ "required": [
31
+ "id",
32
+ "organization"
33
+ ],
34
+ "properties": {
35
+ "id": {
36
+ "type": "string",
37
+ "pattern": "^(?:ibx)_[A-Z0-9]{26}$"
38
+ },
39
+ "organization": {
40
+ "type": "object",
41
+ "required": [
42
+ "id",
43
+ "status"
44
+ ],
45
+ "properties": {
46
+ "id": {
47
+ "type": "string",
48
+ "pattern": "^(?:org)_[A-Z0-9]{26}$"
49
+ },
50
+ "status": {
51
+ "type": "string"
52
+ }
53
+ }
54
+ }
55
+ }
56
+ },
57
+ "message": {
58
+ "type": "object",
59
+ "required": [
60
+ "id",
61
+ "conversation",
62
+ "text_content",
63
+ "metadata"
64
+ ],
65
+ "properties": {
66
+ "id": {
67
+ "type": "string",
68
+ "pattern": "^(?:msg)_[A-Z0-9]{26}$"
69
+ },
70
+ "text_content": {
71
+ "type": "string"
72
+ },
73
+ "metadata": {
74
+ "type": "object"
75
+ },
76
+ "conversation": {
77
+ "type": "object",
78
+ "required": [
79
+ "id",
80
+ "title",
81
+ "metadata"
82
+ ],
83
+ "properties": {
84
+ "id": {
85
+ "type": "string",
86
+ "pattern": "^(?:cnv)_[A-Z0-9]{26}$"
87
+ },
88
+ "title": {
89
+ "type": "string"
90
+ },
91
+ "metadata": {
92
+ "type": "object"
93
+ }
94
+ }
95
+ }
96
+ }
97
+ }
98
+ },
99
+ "additionalProperties": false
100
+ },
101
+ "Create${APP}": {
102
+ "type": "object",
103
+ "required": [
104
+ "plug_installation",
105
+ "organization",
106
+ "plug",
107
+ "inbox"
108
+ ],
109
+ "properties": {
110
+ "plug_installation": {
111
+ "type": "object",
112
+ "required": [
113
+ "id",
114
+ "settings"
115
+ ],
116
+ "properties": {
117
+ "id": {
118
+ "type": "string",
119
+ "pattern": "^(?:pli)_[A-Z0-9]{26}$"
120
+ },
121
+ "settings": {
122
+ "type": "object",
123
+ "required": [],
124
+ "properties": {}
125
+ }
126
+ }
127
+ },
128
+ "organization": {
129
+ "type": "object",
130
+ "required": [
131
+ "id"
132
+ ],
133
+ "properties": {
134
+ "id": {
135
+ "type": "string",
136
+ "pattern": "^(?:org)_[A-Z0-9]{26}$"
137
+ }
138
+ }
139
+ },
140
+ "plug": {
141
+ "type": "object",
142
+ "required": [
143
+ "id"
144
+ ],
145
+ "properties": {
146
+ "id": {
147
+ "type": "string",
148
+ "pattern": "^(?:plg)_[A-Z0-9]{26}$"
149
+ }
150
+ }
151
+ },
152
+ "inbox": {
153
+ "type": "object",
154
+ "required": [
155
+ "id"
156
+ ],
157
+ "properties": {
158
+ "id": {
159
+ "type": "string",
160
+ "pattern": "^(?:ibx)_[A-Z0-9]{26}$"
161
+ }
162
+ }
163
+ }
164
+ },
165
+ "additionalProperties": false
166
+ }
167
+ }
@@ -22,6 +22,9 @@
22
22
  },
23
23
  "/api/2023-03-06/after_create/message": {
24
24
  "$ref": "paths/yetto/after_create_message.json"
25
+ },
26
+ "/${app}/2023-03-06/{plugInstallationId}": {
27
+ "$ref": "paths/${app}.json"
25
28
  }
26
29
  }
27
30
  }
@@ -23,11 +23,10 @@
23
23
  "message": {
24
24
  "text_content": "Hello _World_",
25
25
  "is_public": true,
26
- "metadata": {
27
- "author": {
28
- "name": "John Doe"
29
- }
30
- }
26
+ "author": {
27
+ "name": "John Doe"
28
+ },
29
+ "metadata": {}
31
30
  },
32
31
  "creator": {
33
32
  "id": "usr_1234567890"
@@ -4,7 +4,17 @@
4
4
  "Yetto"
5
5
  ],
6
6
  "description": "After a message is created in Yetto, this delivers it.",
7
- "operationId": "Create a new email",
7
+ "operationId": "Create a new ${APP}",
8
+ "requestBody": {
9
+ "required": true,
10
+ "content": {
11
+ "application/json": {
12
+ "schema": {
13
+ "$ref": "../../components/schemas/yetto.json#/Create${APP}Message"
14
+ }
15
+ }
16
+ }
17
+ },
8
18
  "responses": {
9
19
  "204": {
10
20
  "description": "No Content",
@@ -5,6 +5,16 @@
5
5
  ],
6
6
  "description": "After a plug installation is created, this executes",
7
7
  "operationId": "Post a thing",
8
+ "requestBody": {
9
+ "required": true,
10
+ "content": {
11
+ "application/json": {
12
+ "schema": {
13
+ "$ref": "../../components/schemas/yetto.json#/Create${APP}"
14
+ }
15
+ }
16
+ }
17
+ },
8
18
  "responses": {
9
19
  "204": {
10
20
  "description": "No Content",
@@ -25,6 +25,8 @@ while [ "$1" != "" ]; do
25
25
  bin/tapioca todo
26
26
  ;;
27
27
  -v | --verify)
28
+ echo "Verify Sorbet types..."
29
+ bin/bundle exec srb tc
28
30
  echo "Verify gem RBIs are up-to-date ..."
29
31
  bin/tapioca gem --verify
30
32
  echo "Verify duplicates in shims ..."
@@ -22,6 +22,6 @@ class SettingsControllerTest < ActionDispatch::IntegrationTest
22
22
  settings = settings_json["settings"]
23
23
 
24
24
  assert_equal "2023-03-06", settings_json["version"]
25
- assert_equal 3, settings.length
25
+ assert_equal 2, settings.length
26
26
  end
27
27
  end
@@ -14,7 +14,6 @@ class YettoControllerTest < ActionDispatch::IntegrationTest
14
14
  plug_installation: {
15
15
  id: @plug_installation_id,
16
16
  settings: {
17
- from_name: "it me",
18
17
  from_email: "new@from.company",
19
18
  reply_to_email: "new@from.company",
20
19
  },
File without changes
File without changes
File without changes
@@ -60,7 +60,7 @@ module API
60
60
  end
61
61
 
62
62
  def prepend_plug_path(version, path)
63
- "/plug/#{version}#{path}"
63
+ "/${app}/#{version}#{path}"
64
64
  end
65
65
 
66
66
  def prepend_api_path(version, path)
@@ -26,12 +26,13 @@ module ActiveSupport
26
26
 
27
27
  def assert_expected_args(expected_args)
28
28
  lambda do |job_args_arr|
29
- expected_args.each do |expected_arg|
30
- key = expected_arg.first
31
- value = expected_arg.second
32
- expected_value = job_args_arr.first[key]
29
+ job_args_arr.first.each do |actual_args|
30
+ actual_key = actual_args.first
31
+ actual_value = actual_args.second
33
32
 
34
- assert_equal(expected_value, value)
33
+ expected_value = expected_args[actual_key]
34
+
35
+ assert_equal(expected_value, actual_value)
35
36
  end
36
37
  end
37
38
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hephaestus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Garen Torikian
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-02-28 00:00:00.000000000 Z
11
+ date: 2023-03-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -113,6 +113,23 @@ files:
113
113
  - lib/hephaestus/generators/rubocop_generator.rb
114
114
  - lib/hephaestus/generators/sorbet_generator.rb
115
115
  - lib/hephaestus/version.rb
116
+ - templates/.env.test
117
+ - templates/.github/actions/license/action.yml
118
+ - templates/.github/actions/setup/action.yml
119
+ - templates/.github/actions/sisyphus/action.yml
120
+ - templates/.github/actions/sorbet/action.yml
121
+ - templates/.github/dependabot.yml
122
+ - templates/.github/workflows/automerge.yml
123
+ - templates/.github/workflows/licenses.yml
124
+ - templates/.github/workflows/lint.yml
125
+ - templates/.github/workflows/security.yml
126
+ - templates/.github/workflows/sorbet.yml
127
+ - templates/.github/workflows/test.yml
128
+ - templates/.licensed.yml
129
+ - templates/.rubocop.yml
130
+ - templates/.vscode/extensions.json
131
+ - templates/.vscode/launch.json
132
+ - templates/.vscode/settings.json
116
133
  - templates/Gemfile.erb
117
134
  - templates/Procfile.debug
118
135
  - templates/Procfile.dev
@@ -175,7 +192,10 @@ files:
175
192
  - templates/test/controllers/root_controller_test.rb
176
193
  - templates/test/controllers/settings_controller_test.rb
177
194
  - templates/test/controllers/yetto_controller_test.rb
195
+ - templates/test/fixtures/files/.keep
196
+ - templates/test/integration/.keep
178
197
  - templates/test/jobs/update_yetto_job_test.rb
198
+ - templates/test/mailers/.keep
179
199
  - templates/test/support/api.rb
180
200
  - templates/test/support/rails.rb
181
201
  - templates/test/support/webmocks.rb
@@ -195,14 +215,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
195
215
  requirements:
196
216
  - - ">="
197
217
  - !ruby/object:Gem::Version
198
- version: 3.1.1
218
+ version: 3.2.1
199
219
  required_rubygems_version: !ruby/object:Gem::Requirement
200
220
  requirements:
201
- - - "~>"
221
+ - - ">="
202
222
  - !ruby/object:Gem::Version
203
- version: '3.0'
223
+ version: 3.4.7
204
224
  requirements: []
205
- rubygems_version: 3.3.7
225
+ rubygems_version: 3.4.8
206
226
  signing_key:
207
227
  specification_version: 4
208
228
  summary: Generate a Rails app that can be used to create plugs for Yetto.