From 3f5caf947f277c7adf6641eba3c92a2bc82f116d Mon Sep 17 00:00:00 2001 From: Zsolt Tasnadi Date: Tue, 25 Aug 2026 23:50:11 +0200 Subject: [PATCH] advanced pipeline --- .rubocop.yml | 13 +++++++++++++ Gemfile | 1 + README.md | 12 +++++++++++- .../concerns/warp_engine/subject_authentication.rb | 1 - .../concerns/warp_engine/update_authentication.rb | 1 - .../warp_engine/api/auth/devices_controller.rb | 1 - .../warp_engine/api/auth/tokens_controller.rb | 1 - .../warp_engine/api/service_controller.rb | 1 - .../warp_engine/build/configs_controller.rb | 1 - app/models/warp_engine/device_grant.rb | 2 -- app/models/warp_engine/release.rb | 2 +- .../platforms/builds/build_linux_arm64.rb | 1 - app/services/warp_engine/device_grant_service.rb | 1 - app/services/warp_engine/download_service.rb | 1 - app/services/warp_engine/file_manager_service.rb | 1 - app/services/warp_engine/file_service.rb | 1 - app/services/warp_engine/publish_service.rb | 1 - lib/tasks/warp_engine_builds.rake | 2 +- lib/warp_engine.rb | 1 - lib/warp_engine/access.rb | 3 --- lib/warp_engine/ci.rb | 1 - lib/warp_engine/configuration.rb | 1 - lib/warp_engine/images.rb | 2 -- lib/warp_engine/storage.rb | 1 - lib/warp_engine/version.rb | 2 +- spec/ci/gitlab_client_spec.rb | 8 ++++---- spec/ci/woodpecker_client_spec.rb | 6 +++--- spec/models/platform_link_spec.rb | 13 +++++++------ spec/models/software_spec.rb | 2 +- spec/services/builds_service_spec.rb | 2 +- 30 files changed, 44 insertions(+), 42 deletions(-) create mode 100644 .rubocop.yml diff --git a/.rubocop.yml b/.rubocop.yml new file mode 100644 index 0000000..44c65a9 --- /dev/null +++ b/.rubocop.yml @@ -0,0 +1,13 @@ +inherit_gem: + rubocop-rails-omakase: rubocop.yml + +AllCops: + NewCops: enable + TargetRubyVersion: 3.2 + Exclude: + - "bin/**/*" + - "db/**/*" + - "config/**/*" + - "examples/**/*" + - "spec/dummy/**/*" + - "vendor/**/*" diff --git a/Gemfile b/Gemfile index 67d2226..9e49baf 100644 --- a/Gemfile +++ b/Gemfile @@ -10,4 +10,5 @@ group :development, :test do gem "shoulda-matchers", "~> 6.0" gem "webmock", "~> 3.0" gem "debug", platforms: %i[mri windows] + gem "rubocop-rails-omakase", require: false end diff --git a/README.md b/README.md index 78b1feb..e7ba595 100644 --- a/README.md +++ b/README.md @@ -761,6 +761,16 @@ bundle exec rspec ## Development This repository is a **read-only split mirror** — development happens in the -[`tools/teletypegames`](https://git.teletypegames.org/tools/teletypegames) +[`services/teletypegames`](https://git.teletypegames.org/services/teletypegames) monorepo under `libs/ruby/warp_engine`, and CI republishes the mirror on every change. Please do not open pull requests against the mirror. + +Two rules the monorepo's pipeline enforces before anything is mirrored or +published: + +- **Every commit that touches the engine raises `WarpEngine::VERSION`.** A + pre-commit hook checks it locally, the pipeline's first step checks it again + over the pushed commits, and a `warp_engine-v*` tag must name the version the + tree actually holds. +- **RuboCop is green** (`.rubocop.yml`, rubocop-rails-omakase), and the suite + passes — in that order, before the gem is built. diff --git a/app/controllers/concerns/warp_engine/subject_authentication.rb b/app/controllers/concerns/warp_engine/subject_authentication.rb index 04d62c7..4555cff 100644 --- a/app/controllers/concerns/warp_engine/subject_authentication.rb +++ b/app/controllers/concerns/warp_engine/subject_authentication.rb @@ -1,5 +1,4 @@ module WarpEngine - module SubjectAuthentication extend ActiveSupport::Concern diff --git a/app/controllers/concerns/warp_engine/update_authentication.rb b/app/controllers/concerns/warp_engine/update_authentication.rb index 978732d..6b9187d 100644 --- a/app/controllers/concerns/warp_engine/update_authentication.rb +++ b/app/controllers/concerns/warp_engine/update_authentication.rb @@ -1,5 +1,4 @@ module WarpEngine - module UpdateAuthentication extend ActiveSupport::Concern diff --git a/app/controllers/warp_engine/api/auth/devices_controller.rb b/app/controllers/warp_engine/api/auth/devices_controller.rb index 1bb2d35..b89b4db 100644 --- a/app/controllers/warp_engine/api/auth/devices_controller.rb +++ b/app/controllers/warp_engine/api/auth/devices_controller.rb @@ -1,5 +1,4 @@ module WarpEngine - class Api::Auth::DevicesController < ApiController before_action :ensure_identity_configured diff --git a/app/controllers/warp_engine/api/auth/tokens_controller.rb b/app/controllers/warp_engine/api/auth/tokens_controller.rb index ccab0da..2d49349 100644 --- a/app/controllers/warp_engine/api/auth/tokens_controller.rb +++ b/app/controllers/warp_engine/api/auth/tokens_controller.rb @@ -1,5 +1,4 @@ module WarpEngine - class Api::Auth::TokensController < ApiController resource_description do short "Client tokens" diff --git a/app/controllers/warp_engine/api/service_controller.rb b/app/controllers/warp_engine/api/service_controller.rb index e8b5d9f..3bb25fb 100644 --- a/app/controllers/warp_engine/api/service_controller.rb +++ b/app/controllers/warp_engine/api/service_controller.rb @@ -1,5 +1,4 @@ module WarpEngine - class Api::ServiceController < ApiController resource_description do short "Service descriptor" diff --git a/app/controllers/warp_engine/build/configs_controller.rb b/app/controllers/warp_engine/build/configs_controller.rb index d7834eb..3dad161 100644 --- a/app/controllers/warp_engine/build/configs_controller.rb +++ b/app/controllers/warp_engine/build/configs_controller.rb @@ -1,6 +1,5 @@ module WarpEngine module Build - class ConfigsController < ApiController resource_description do short "CI pipeline configs" diff --git a/app/models/warp_engine/device_grant.rb b/app/models/warp_engine/device_grant.rb index d814fd3..46bcbbc 100644 --- a/app/models/warp_engine/device_grant.rb +++ b/app/models/warp_engine/device_grant.rb @@ -1,5 +1,4 @@ module WarpEngine - class DeviceGrant < ApplicationRecord self.table_name = "device_grants" @@ -58,7 +57,6 @@ module WarpEngine end def self.generate_user_code - 10.times do candidate = Array.new(USER_CODE_LENGTH) { USER_CODE_ALPHABET.chars.sample }.join return candidate unless exists?(user_code: candidate) diff --git a/app/models/warp_engine/release.rb b/app/models/warp_engine/release.rb index 327c7af..09c7470 100644 --- a/app/models/warp_engine/release.rb +++ b/app/models/warp_engine/release.rb @@ -16,7 +16,7 @@ module WarpEngine validate :c64_cannot_be_web_playable def self.latest_non_dev(releases) - sorted = releases.sort_by { |r| [r.created_at || Time.at(0), r.id] }.reverse + sorted = releases.sort_by { |r| [ r.created_at || Time.at(0), r.id ] }.reverse candidates = sorted.reject { |r| r.version.to_s.start_with?("dev-") } candidates.empty? ? sorted.first : candidates.first end diff --git a/app/services/concerns/warp_engine/platforms/builds/build_linux_arm64.rb b/app/services/concerns/warp_engine/platforms/builds/build_linux_arm64.rb index 5508adf..d3c200d 100644 --- a/app/services/concerns/warp_engine/platforms/builds/build_linux_arm64.rb +++ b/app/services/concerns/warp_engine/platforms/builds/build_linux_arm64.rb @@ -1,7 +1,6 @@ module WarpEngine module Platforms module Builds - module BuildLinuxArm64 extend ActiveSupport::Concern diff --git a/app/services/warp_engine/device_grant_service.rb b/app/services/warp_engine/device_grant_service.rb index 29ec737..97ba4b6 100644 --- a/app/services/warp_engine/device_grant_service.rb +++ b/app/services/warp_engine/device_grant_service.rb @@ -1,5 +1,4 @@ module WarpEngine - class DeviceGrantService class NotConfigured < StandardError; end class UnknownCode < StandardError; end diff --git a/app/services/warp_engine/download_service.rb b/app/services/warp_engine/download_service.rb index 9870797..c106f9a 100644 --- a/app/services/warp_engine/download_service.rb +++ b/app/services/warp_engine/download_service.rb @@ -2,7 +2,6 @@ require "warp_engine/access_denied" module WarpEngine class DownloadService - Denied = WarpEngine::AccessDenied include AccessPolicyGuard diff --git a/app/services/warp_engine/file_manager_service.rb b/app/services/warp_engine/file_manager_service.rb index 25824bc..ecbc84a 100644 --- a/app/services/warp_engine/file_manager_service.rb +++ b/app/services/warp_engine/file_manager_service.rb @@ -1,6 +1,5 @@ module WarpEngine class FileManagerService - def base_path @base_path ||= Pathname.new(WarpEngine.config.file_container_path) end diff --git a/app/services/warp_engine/file_service.rb b/app/services/warp_engine/file_service.rb index 96a1dcf..8ff09a4 100644 --- a/app/services/warp_engine/file_service.rb +++ b/app/services/warp_engine/file_service.rb @@ -2,7 +2,6 @@ require "warp_engine/access_denied" module WarpEngine class FileService - include AccessPolicyGuard def show(input, subject: nil) diff --git a/app/services/warp_engine/publish_service.rb b/app/services/warp_engine/publish_service.rb index 90a6fec..57c7f81 100644 --- a/app/services/warp_engine/publish_service.rb +++ b/app/services/warp_engine/publish_service.rb @@ -1,6 +1,5 @@ module WarpEngine class PublishService - NOTIFICATION = "warp_engine.publish".freeze def publish(input) diff --git a/lib/tasks/warp_engine_builds.rake b/lib/tasks/warp_engine_builds.rake index d5be640..f751264 100644 --- a/lib/tasks/warp_engine_builds.rake +++ b/lib/tasks/warp_engine_builds.rake @@ -12,7 +12,7 @@ namespace :warp_engine do checklist = WarpEngine::AssetCoverageChecklist.new( coverage, only_missing: ENV["ONLY"] == "missing" ) - puts checklist.to_s + puts checklist if ENV["STRICT"] == "1" && coverage.totals[:missing].positive? abort "\nSTRICT: #{coverage.totals[:missing]} expected assets are missing." diff --git a/lib/warp_engine.rb b/lib/warp_engine.rb index 7d1694f..8778b3b 100644 --- a/lib/warp_engine.rb +++ b/lib/warp_engine.rb @@ -13,7 +13,6 @@ require "warp_engine/images" require "warp_engine/ci" module WarpEngine - def self.table_name_prefix "" end diff --git a/lib/warp_engine/access.rb b/lib/warp_engine/access.rb index 121d161..9faa2e6 100644 --- a/lib/warp_engine/access.rb +++ b/lib/warp_engine/access.rb @@ -1,7 +1,5 @@ module WarpEngine - module AccessPolicy - class Open def visible_software_scope(subject: nil) WarpEngine::Software.kept @@ -39,7 +37,6 @@ module WarpEngine end class Access - attr_reader :gated, :entitled, :price_cents, :currency, :purchase_url, :web_url def initialize(gated: false, entitled: true, price_cents: nil, currency: nil, diff --git a/lib/warp_engine/ci.rb b/lib/warp_engine/ci.rb index 06a6b32..2749fe6 100644 --- a/lib/warp_engine/ci.rb +++ b/lib/warp_engine/ci.rb @@ -1,5 +1,4 @@ module WarpEngine - module CI class Error < StandardError; end diff --git a/lib/warp_engine/configuration.rb b/lib/warp_engine/configuration.rb index f213c14..7573cce 100644 --- a/lib/warp_engine/configuration.rb +++ b/lib/warp_engine/configuration.rb @@ -1,6 +1,5 @@ module WarpEngine class Configuration - attr_accessor :site_url, :file_container_path, :update_secret, diff --git a/lib/warp_engine/images.rb b/lib/warp_engine/images.rb index e7d527f..58754b7 100644 --- a/lib/warp_engine/images.rb +++ b/lib/warp_engine/images.rb @@ -1,7 +1,5 @@ module WarpEngine - module Images - class HostModel URL_PREFIX = "/api/image".freeze diff --git a/lib/warp_engine/storage.rb b/lib/warp_engine/storage.rb index d7222eb..f536e49 100644 --- a/lib/warp_engine/storage.rb +++ b/lib/warp_engine/storage.rb @@ -1,5 +1,4 @@ module WarpEngine - module Storage Location = Struct.new(:kind, :path, :url, keyword_init: true) do def file? = kind == :file diff --git a/lib/warp_engine/version.rb b/lib/warp_engine/version.rb index 2829db1..ecd2034 100644 --- a/lib/warp_engine/version.rb +++ b/lib/warp_engine/version.rb @@ -1,5 +1,5 @@ module WarpEngine - VERSION = "0.9.0" + VERSION = "0.9.1" VERSION_HEADER = "WarpEngine-Version".freeze end diff --git a/spec/ci/gitlab_client_spec.rb b/spec/ci/gitlab_client_spec.rb index 0c1d3d2..f216a28 100644 --- a/spec/ci/gitlab_client_spec.rb +++ b/spec/ci/gitlab_client_spec.rb @@ -15,7 +15,7 @@ RSpec.describe WarpEngine::CI::Gitlab::Client do describe "repos" do it "lists repos" do - repos = [{ "id" => 1, "path" => "game1" }] + repos = [ { "id" => 1, "path" => "game1" } ] stub_gl(:get, "/api/v4/projects?membership=true&per_page=100&simple=true", body: repos) expect(client.list_repos).to eq(repos) @@ -39,7 +39,7 @@ RSpec.describe WarpEngine::CI::Gitlab::Client do describe "secrets (variables)" do it "lists variables" do - vars = [{ "key" => "application_token" }] + vars = [ { "key" => "application_token" } ] stub_gl(:get, "/api/v4/projects/1/variables", body: vars) expect(client.list_secrets(1)).to eq(vars) @@ -68,7 +68,7 @@ RSpec.describe WarpEngine::CI::Gitlab::Client do describe "pipelines" do it "lists pipelines" do - pipelines = [{ "id" => 1, "status" => "success" }] + pipelines = [ { "id" => 1, "status" => "success" } ] stub_gl(:get, "/api/v4/projects/42/pipelines?page=1&per_page=25", body: pipelines) expect(client.list_pipelines(42)).to eq(pipelines) @@ -76,7 +76,7 @@ RSpec.describe WarpEngine::CI::Gitlab::Client do it "gets latest pipeline" do pipeline = { "id" => 5, "status" => "running" } - stub_gl(:get, "/api/v4/projects/42/pipelines?per_page=1&sort=desc", body: [pipeline]) + stub_gl(:get, "/api/v4/projects/42/pipelines?per_page=1&sort=desc", body: [ pipeline ]) expect(client.latest_pipeline(42)).to eq(pipeline) end diff --git a/spec/ci/woodpecker_client_spec.rb b/spec/ci/woodpecker_client_spec.rb index 9210bfc..2d87289 100644 --- a/spec/ci/woodpecker_client_spec.rb +++ b/spec/ci/woodpecker_client_spec.rb @@ -15,7 +15,7 @@ RSpec.describe WarpEngine::CI::Woodpecker::Client do describe "repos" do it "lists repos" do - repos = [{ "id" => 1, "name" => "game1" }] + repos = [ { "id" => 1, "name" => "game1" } ] stub_wp(:get, "/api/repos", body: repos) expect(client.list_repos).to eq(repos) @@ -37,7 +37,7 @@ RSpec.describe WarpEngine::CI::Woodpecker::Client do describe "secrets" do it "lists secrets" do - secrets = [{ "name" => "application_token" }] + secrets = [ { "name" => "application_token" } ] stub_wp(:get, "/api/repos/1/secrets", body: secrets) expect(client.list_secrets(1)).to eq(secrets) @@ -66,7 +66,7 @@ RSpec.describe WarpEngine::CI::Woodpecker::Client do describe "pipelines" do it "lists pipelines" do - pipelines = [{ "number" => 1, "status" => "success" }] + pipelines = [ { "number" => 1, "status" => "success" } ] stub_wp(:get, "/api/repos/42/pipelines?page=1&perPage=25", body: pipelines) expect(client.list_pipelines(42)).to eq(pipelines) diff --git a/spec/models/platform_link_spec.rb b/spec/models/platform_link_spec.rb index 6e57f8a..99af235 100644 --- a/spec/models/platform_link_spec.rb +++ b/spec/models/platform_link_spec.rb @@ -20,12 +20,13 @@ RSpec.describe WarpEngine::PlatformLink, type: :model do end end - describe "default scope" do - it "excludes soft-deleted records" do - active = create(:platform_link) - create(:platform_link, deleted_at: Time.current) + describe "scopes" do + it "keeps soft-deleted records out of .kept, not out of .all" do + active = create(:platform_link) + deleted = create(:platform_link, deleted_at: Time.current) - expect(WarpEngine::PlatformLink.all).to eq([active]) + expect(WarpEngine::PlatformLink.kept).to eq([ active ]) + expect(WarpEngine::PlatformLink.all).to contain_exactly(active, deleted) end it "does not order: ordering is asked for, not inherited" do @@ -52,7 +53,7 @@ RSpec.describe WarpEngine::PlatformLink, type: :model do create(:platform_link, platform: "love") result = WarpEngine::PlatformLink.for_platform("tic80") - expect(result).to eq([tic80_link]) + expect(result).to eq([ tic80_link ]) end it "returns empty array for platform without links" do diff --git a/spec/models/software_spec.rb b/spec/models/software_spec.rb index af2b310..8042303 100644 --- a/spec/models/software_spec.rb +++ b/spec/models/software_spec.rb @@ -18,7 +18,7 @@ RSpec.describe WarpEngine::Software, type: :model do active = create(:software) create(:software, deleted_at: Time.current) - expect(WarpEngine::Software.kept).to eq([active]) + expect(WarpEngine::Software.kept).to eq([ active ]) end it "includes soft-deleted records without scope" do diff --git a/spec/services/builds_service_spec.rb b/spec/services/builds_service_spec.rb index a19f529..e0763fb 100644 --- a/spec/services/builds_service_spec.rb +++ b/spec/services/builds_service_spec.rb @@ -11,7 +11,7 @@ RSpec.describe WarpEngine::BuildsService do end it "returns c64 with only cartridge" do - expect(result[:platforms]["c64"][:kinds]).to eq(["cartridge"]) + expect(result[:platforms]["c64"][:kinds]).to eq([ "cartridge" ]) end it "returns allKinds matching WarpEngine::ReleaseAsset::KINDS" do