Skip to content

Commit

Permalink
Ensure shard name from shard.yml is valid
Browse files Browse the repository at this point in the history
  • Loading branch information
straight-shoota committed Dec 18, 2020
1 parent 1d2cfc1 commit 09df2c6
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 9 deletions.
42 changes: 35 additions & 7 deletions spec/service/import_shard_spec.cr
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,19 @@ private def shard_categorizations(db)
end

describe Service::ImportShard do
mock_resolver = MockResolver.new
mock_resolver.register("0.1.0", Factory.build_revision_info, <<-SPEC)
name: test
description: test shard
version: 0.1.0
SPEC

it "creates new shard" do
repo_ref = Repo::Ref.new("git", "mock:test")

transaction do |db|
repo_id = Factory.create_repo(db, repo_ref, nil)

mock_resolver = MockResolver.new
mock_resolver.register("0.1.0", Factory.build_revision_info, <<-SPEC)
name: test
description: test shard
version: 0.1.0
SPEC

shard_id = Service::ImportShard.new(db,
db.get_repo(repo_id),
entry: Catalog::Entry.new(repo_ref, description: "foo description"),
Expand All @@ -52,12 +52,40 @@ describe Service::ImportShard do
end
end

it "normalizes shard name" do
repo_ref = Repo::Ref.new("git", "mock:test")

transaction do |db|
repo_id = Factory.create_repo(db, repo_ref, nil)

mock_resolver = MockResolver.new
mock_resolver.register("0.1.0", Factory.build_revision_info, <<-SPEC)
name: foo bar
version: 0.1.0
SPEC

shard_id = Service::ImportShard.new(db,
db.get_repo(repo_id),
resolver: Repo::Resolver.new(mock_resolver, repo_ref),
).perform

ShardsDBHelper.persisted_shards(db).empty?.should be_true
end
end

it "uses existing repo" do
repo_ref = Repo::Ref.new("git", "mock:https://example.com/git/test.git")

transaction do |db|
repo_id = Factory.create_repo(db, repo_ref, nil)

mock_resolver = MockResolver.new
mock_resolver.register("0.1.0", Factory.build_revision_info, <<-SPEC)
name: test
description: test shard
version: 0.1.0
SPEC

shard_id = Service::ImportShard.new(db,
db.get_repo(repo_id),
resolver: Repo::Resolver.new(mock_resolver, repo_ref),
Expand Down
Empty file removed spec/shards-toolbox_spec.cr
Empty file.
5 changes: 4 additions & 1 deletion src/db.cr
Original file line number Diff line number Diff line change
Expand Up @@ -283,13 +283,16 @@ class ShardsDB
end

def create_shard(shard : Shard)
shard_id = connection.query_one <<-SQL, shard.name, shard.qualifier, shard.description, shard.archived_at, as: Int64
connection.query_one <<-SQL, shard.name, shard.qualifier, shard.description, shard.archived_at, as: Int64
INSERT INTO shards
(name, qualifier, description, archived_at)
VALUES
($1, $2, $3, $4)
RETURNING id;
SQL

rescue exc : PQ::PQError
raise Error.new("create_shard #{shard.inspect}", cause: exc)
end

def create_repo(repo : Repo)
Expand Down
8 changes: 7 additions & 1 deletion src/service/import_shard.cr
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,13 @@ struct Service::ImportShard
spec = retrieve_spec
return unless spec

CreateShard.new(@db, @repo, spec.name, @entry).perform
shard_name = spec.name
unless Shard.valid_name?(shard_name)
Log.notice &.emit("invalid shard name", repo: @repo.ref.to_s, shard_name: shard_name)
return
end

CreateShard.new(@db, @repo, shard_name, @entry).perform
end

private def retrieve_spec
Expand Down
8 changes: 8 additions & 0 deletions src/shard.cr
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ class Shard
property archived_at : Time?
property merged_with : Int64?

def self.valid_name?(name : String) : Bool
name.matches?(/^[A-Za-z0-9_\-.]{1,100}$/)
end

def initialize(@name : String, @qualifier : String = "", @description : String? = nil, @archived_at : Time? = nil, @merged_with : Int64? = nil, @id : Int64? = nil)
end

Expand All @@ -27,6 +31,10 @@ class Shard
!archived_at.nil?
end

def inspect(io : IO)
to_s(io)
end

def to_s(io : IO)
io << "#<Shard @name="
@name.dump(io)
Expand Down

0 comments on commit 09df2c6

Please sign in to comment.