Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Normalize extension versions #306

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions app/controllers/api/v1/extension_versions_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ class Api::V1::ExtensionVersionsController < Api::V1Controller
#
def show
@extension = Extension.with_name(params[:extension]).first!
@extension_version = @extension.get_version!(params[:version])
@extension_version = @extension.get_version!(SemverNormalizer.call(params[:version]))
end

#
Expand All @@ -20,7 +20,7 @@ def show
#
def download
@extension = Extension.with_name(params[:extension]).first!
@extension_version = @extension.get_version!(params[:version])
@extension_version = @extension.get_version!(SemverNormalizer.call(params[:version]))

ExtensionVersion.increment_counter(:api_download_count, @extension_version.id)
Extension.increment_counter(:api_download_count, @extension.id)
Expand Down
8 changes: 4 additions & 4 deletions app/controllers/api/v1/release_assets_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ class Api::V1::ReleaseAssetsController < Api::V1Controller
example "GET https://#{ENV['HOST']}/api/v1/assets/sensu/sensu-email-handler/0.2.0/release_asset_builds"
def index
extension = Extension.with_owner_and_lowercase_name(owner_name: params[:username], lowercase_name: params[:id])
@version = extension.extension_versions.find_by!(version: params[:version])
@version = extension.extension_versions.find_by!(version: SemverNormalizer.call(params[:version]))
end

api! <<~EOD
Retrieve #{I18n.t('indefinite_articles.extension')} #{I18n.t('nouns.extension')}'s build-specific details, suitable for consumption by the sensu tool.
EOD
Expand All @@ -23,10 +23,10 @@ def index
param :platform, String, required: true, desc: "target platform"
param :arch, String, required: true, desc: "target architecture"
example "GET https://#{ENV['HOST']}/api/v1/assets/demillir/sensu-asset-playground/0.1.1-20181030/linux/aarch64/release_asset"

def show
extension = Extension.with_owner_and_lowercase_name(owner_name: params[:username], lowercase_name: params[:id])
version = extension.extension_versions.find_by!(version: params[:version])
version = extension.extension_versions.find_by!(version: SemverNormalizer.call(params[:version]))
@release_asset = version.release_assets.find_by(platform: params[:platform], arch: params[:arch])
raise ActiveRecord::RecordNotFound unless @release_asset
end
Expand Down
2 changes: 2 additions & 0 deletions app/controllers/extension_versions_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ def create
authorize! extension, :add_hosted_extension_version?

@extension_version = extension.extension_versions.build(extension_version_params)
@extension_version.tag = @extension_version.version
@extension_version.version = SemverNormalizer.call(@extension_version.version)

if @extension_version.save
ExtensionNotifyWorker.perform_async(@extension_version.id)
Expand Down
6 changes: 3 additions & 3 deletions app/controllers/release_assets_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ class ReleaseAssetsController < ApplicationController
def download

extension = Extension.with_owner_and_lowercase_name(owner_name: params[:username], lowercase_name: params[:extension_id])
version = extension.extension_versions.find_by!(version: params[:version])
version = extension.extension_versions.find_by!(version: SemverNormalizer.call(params[:version]))
@release_asset = version.release_assets.find_by(platform: params[:platform], arch: params[:arch])

if !@release_asset || !@release_asset.viable?
raise ActiveRecord::RecordNotFound
raise ActiveRecord::RecordNotFound
end

raise ActiveRecord::RecordNotFound if extension.hosted? && !params[:acknowledge]
Expand Down Expand Up @@ -44,7 +44,7 @@ def sha_file

def send_file_content(filename_method)
extension = Extension.with_owner_and_lowercase_name(owner_name: params[:username], lowercase_name: params[:extension_id])
version = extension.extension_versions.find_by!(version: params[:version])
version = extension.extension_versions.find_by!(version: SemverNormalizer.call(params[:version]))
raise ActiveRecord::RecordNotFound unless version.source_file.attached?

release_asset = version.release_assets.find_by(platform: params[:platform], arch: params[:arch])
Expand Down
13 changes: 7 additions & 6 deletions app/models/extension.rb
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class Extension < ApplicationRecord
has_many :taggings, as: :taggable, dependent: :destroy
has_many :tags, through: :taggings
has_many :forks, class_name: 'Extension', foreign_key: :parent_id
has_many :extension_collections, dependent: :destroy
has_many :extension_collections, dependent: :destroy
has_many :collections, through: :extension_collections

# HACK: +Extension+ objects don't really have a source_file attachment or version attribute.
Expand Down Expand Up @@ -158,7 +158,7 @@ class Extension < ApplicationRecord
message: ': upload file must be a compressed archive type'
}, if: ->(record) { record.tmp_source_file&.attachment }

class << self
class << self

def with_owner_and_lowercase_name(owner_name:, lowercase_name:)
Extension.find_by!(owner_name: owner_name, lowercase_name: lowercase_name)
Expand Down Expand Up @@ -200,9 +200,9 @@ def sorted_extension_versions
REGEXP_REPLACE(
REGEXP_REPLACE(
REGEXP_REPLACE(
extension_versions.version,
extension_versions.version,
E'[-](.*)', ''
),
),
E'[\+](.*)', ''
),
E'V|v|master', ''
Expand Down Expand Up @@ -340,7 +340,7 @@ def get_version!(version)
if version == 'latest'
latest_extension_version
else
extension_versions.find_by!(version: version)
extension_versions.find_by!(version: SemverNormalizer.call(version))
end
end

Expand Down Expand Up @@ -380,7 +380,8 @@ def publish_version!(params)
extension: self,
description: metadata.description,
license: metadata.license,
version: metadata.version,
tag: metadata.version,
version: SemverNormalizer.call(metadata.version),
tarball: tarball,
readme: readme.contents,
readme_extension: readme.extension,
Expand Down
3 changes: 2 additions & 1 deletion app/workers/extract_extension_version_worker.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ def perform(extension_id, tag, compatible_platforms)

readme_body, readme_ext = fetch_readme

version = @extension.extension_versions.first_or_create(version: tag)
normalized_version = SemverNormalizer.call(tag)
version = @extension.extension_versions.first_or_create(version: normalized_version, tag: tag)

version.update_attributes(
readme: readme_body,
Expand Down
4 changes: 3 additions & 1 deletion config/environments/production.rb
Original file line number Diff line number Diff line change
Expand Up @@ -92,9 +92,11 @@
config.logger = ActiveSupport::TaggedLogging.new(logger)
end

redis_url = ENV.fetch("REDIS_URL", "redis://127.0.0.1:6379")

# cache store in production.
config.cache_store = :redis_cache_store, {
url: "#{ENV['REDIS_URL']}/0",
url: "#{redis_url}/0",
network_timeout: 1,
namespace: "cache",
}
Expand Down
9 changes: 5 additions & 4 deletions config/initializers/redis.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@

REDIS_POOL = ConnectionPool.new(size: 10) { Redis.new(url: "#{ENV['REDIS_URL']}/0", network_timeout: 5) }

Redis.current = Redis.new(url: "#{ENV['REDIS_URL']}/1", network_timeout: 5)
redis_url = ENV.fetch("REDIS_URL", "redis://127.0.0.1:6379")

REDIS_POOL = ConnectionPool.new(size: 10) { Redis.new(url: "#{redis_url}/0", network_timeout: 5) }

Redis.current = Redis.new(url: "#{redis_url}/1", network_timeout: 5)
4 changes: 3 additions & 1 deletion config/initializers/rollout.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ def Object.const_missing(const)
if const == :ROLLOUT
require 'redis'

redis_url = ENV.fetch("REDIS_URL", "redis://127.0.0.1:6379")

#redis_connect = {}.tap { |h| h[:host] = ENV["REDIS_HOST"] if ENV["REDIS_HOST"] }
redis = Redis.new(:url => "#{ENV['REDIS_URL']}/1")
redis = Redis.new(:url => "#{redis_url}/1")

Object.const_set('ROLLOUT', Rollout.new(redis))

Expand Down
5 changes: 3 additions & 2 deletions config/initializers/sidekiq.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@

Sidekiq.configure_server do |config|
config.redis = REDIS_POOL
Redis.current = Redis.new(url: "#{ENV['REDIS_URL']}/1", network_timeout: 5)
redis_url = ENV.fetch("REDIS_URL", "redis://127.0.0.1:6379")
Redis.current = Redis.new(url: "#{redis_url}/1", network_timeout: 5)
Sidekiq::Status.configure_server_middleware config, expiration: 7.days
Sidekiq::Status.configure_client_middleware config, expiration: 7.days
end
Expand All @@ -19,4 +20,4 @@
Sidekiq::Status.configure_client_middleware config, expiration: 30.minutes
end

Sidekiq::Extensions.enable_delay!
Sidekiq::Extensions.enable_delay!
20 changes: 20 additions & 0 deletions db/migrate/20200213205500_add_tag_to_extension_version.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
class AddTagToExtensionVersion < ActiveRecord::Migration[5.2]
def up
add_column :extension_versions, :tag, :string

ExtensionVersion.all.each do |extension_version|
extension_version.tag = extension_version.version
extension_version.version = SemverNormalizer.call(extension_version.version)
extension_version.save
end
end

def down
ExtensionVersion.all.each do |extension_version|
extension_version.version = extension_version.tag
extension_version.save
end

remove_column :extension_versions, :tag
end
end
3 changes: 2 additions & 1 deletion db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema.define(version: 2020_01_13_232729) do
ActiveRecord::Schema.define(version: 2020_02_13_205500) do

# These are extensions that must be enabled in order to support this database
enable_extension "pg_stat_statements"
Expand Down Expand Up @@ -328,6 +328,7 @@
t.jsonb "config", default: {}
t.string "compilation_error"
t.text "annotations"
t.string "tag"
t.index ["config"], name: "index_extension_versions_on_config", using: :gin
t.index ["legacy_id"], name: "index_extension_versions_on_legacy_id", unique: true
t.index ["version", "extension_id"], name: "index_extension_versions_on_version_and_extension_id", unique: true
Expand Down
4 changes: 2 additions & 2 deletions spec/workers/extract_extension_version_worker_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
{ name: "README.md", content: Base64.encode64("Hello world!") }
end

expect(versions).to receive(:first_or_create).with(version: "1.0")
expect(versions).to receive(:first_or_create).with(tag: "1.0", version: "1.0")
expect(version).to receive(:update_attributes).with(readme: "Hello world!",
readme_extension: "md",
yml_line_count: 0,
Expand All @@ -48,7 +48,7 @@
it "creates a default README if one is missing" do
allow(octokit).to receive(:readme).with("cvincent/test", ref: "1.0").and_raise(Octokit::NotFound)

expect(versions).to receive(:first_or_create).with(version: "1.0")
expect(versions).to receive(:first_or_create).with(tag: "1.0", version: "1.0")
expect(version).to receive(:update_attributes).with(readme: "There is no README file for this asset.",
readme_extension: "txt",
yml_line_count: 0,
Expand Down