semaph 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/.rubocop.yml +18 -0
  4. data/.semaphore/semaphore.yml +19 -0
  5. data/.tool-versions +1 -0
  6. data/Gemfile +1 -1
  7. data/Gemfile.lock +35 -0
  8. data/Rakefile +1 -1
  9. data/exe/semaph +5 -0
  10. data/lib/semaph.rb +17 -1
  11. data/lib/semaph/api.rb +61 -0
  12. data/lib/semaph/commands/reload_command.rb +16 -0
  13. data/lib/semaph/commands/visit_url_command.rb +16 -0
  14. data/lib/semaph/formatting.rb +9 -0
  15. data/lib/semaph/model/job.rb +40 -0
  16. data/lib/semaph/model/job_collection.rb +34 -0
  17. data/lib/semaph/model/pipeline.rb +22 -0
  18. data/lib/semaph/model/pipeline_collection.rb +21 -0
  19. data/lib/semaph/model/project.rb +34 -0
  20. data/lib/semaph/model/project_collection.rb +20 -0
  21. data/lib/semaph/model/workflow.rb +24 -0
  22. data/lib/semaph/model/workflow_collection.rb +20 -0
  23. data/lib/semaph/shells/organisation/organisation_shell.rb +29 -0
  24. data/lib/semaph/shells/organisation/projects_list_command.rb +20 -0
  25. data/lib/semaph/shells/organisation/projects_select_command.rb +26 -0
  26. data/lib/semaph/shells/organisations/organisations_list_command.rb +20 -0
  27. data/lib/semaph/shells/organisations/organisations_select_command.rb +25 -0
  28. data/lib/semaph/shells/organisations/organisations_shell.rb +20 -0
  29. data/lib/semaph/shells/pipeline/jobs_list_command.rb +33 -0
  30. data/lib/semaph/shells/pipeline/pipeline_shell.rb +25 -0
  31. data/lib/semaph/shells/project/project_shell.rb +48 -0
  32. data/lib/semaph/shells/project/workflows_list_command.rb +38 -0
  33. data/lib/semaph/shells/project/workflows_select_command.rb +24 -0
  34. data/lib/semaph/shells/workflow/pipelines_list_command.rb +20 -0
  35. data/lib/semaph/shells/workflow/pipelines_select_command.rb +24 -0
  36. data/lib/semaph/shells/workflow/workflow_shell.rb +64 -0
  37. data/lib/semaph/version.rb +1 -1
  38. data/semaph.gemspec +11 -7
  39. metadata +92 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4f49ea8741a162ab91ff18cb0b66618afe8eb462af876706b2d9707607f8c6be
4
- data.tar.gz: cd248141014a077dfaa4f6e7a2ffc2a209e2f96b343986bef2dfcece3e681fdd
3
+ metadata.gz: b22217dbedbfa234279e494e23d64af812563e6fa8d57e2e2b14f185b3fbe52c
4
+ data.tar.gz: 36c3a0944ef6408730c18b2f147f734616300023792e9e82b0c5ebc0956bab05
5
5
  SHA512:
6
- metadata.gz: 7ebec8bbd45b6db77176c1e24934d5f5f7d50df018a00126d27b6fe3f5081768c9723e95cce8edab6ed8a0ad2d7abe1c1cacb9439b9343b68cfe6df03fa72408
7
- data.tar.gz: f49f85257c58f82060c4082b59eb2d2b9698c2db8bd92188974c3f969620a73880e377ca7c8bb1b73aee3d02de2652bbdcfc37355047f0c119c399d1892c8ca7
6
+ metadata.gz: 4fdda4999337920b39947b2c2fe09ea2cf62830998f948fed2d835dd74f5436172276dace4d59f0e493f14381aae349aaa0aafaa123b5f452ab4ed6a1fba0db0
7
+ data.tar.gz: c5f969a3450d98f8a9b7a9eeb66d134856558e0376259070206ad0a8e76d4e3c38e6a12e3b27312aa272a48cc08af50288e99b443983ffc1d374d5401f82eb85
data/.gitignore CHANGED
@@ -1,3 +1,5 @@
1
+ .DS_Store
2
+
1
3
  /.bundle/
2
4
  /.yardoc
3
5
  /_yardoc/
@@ -5,4 +7,4 @@
5
7
  /doc/
6
8
  /pkg/
7
9
  /spec/reports/
8
- /tmp/
10
+ /tmp/
@@ -0,0 +1,18 @@
1
+ Style/Documentation:
2
+ Enabled: false
3
+
4
+ Style/FrozenStringLiteralComment:
5
+ EnforcedStyle: never
6
+
7
+ Style/StringLiterals:
8
+ EnforcedStyle: double_quotes
9
+
10
+ Style/TrailingCommaInArguments:
11
+ EnforcedStyleForMultiline: consistent_comma
12
+
13
+ Style/TrailingCommaInArrayLiteral:
14
+ EnforcedStyleForMultiline: consistent_comma
15
+
16
+ Style/TrailingCommaInHashLiteral:
17
+ EnforcedStyleForMultiline: consistent_comma
18
+
@@ -0,0 +1,19 @@
1
+ version: v1.0
2
+ name: "Main Build"
3
+ agent:
4
+ machine:
5
+ type: e1-standard-2
6
+ os_image: ubuntu1804
7
+
8
+ auto_cancel:
9
+ queued:
10
+ when: true
11
+
12
+ blocks:
13
+ - name: "Build"
14
+ task:
15
+ jobs:
16
+ - name: Build
17
+ commands:
18
+ - checkout
19
+ - echo "done"
@@ -0,0 +1 @@
1
+ ruby 2.7.1
data/Gemfile CHANGED
@@ -3,5 +3,5 @@ source "https://rubygems.org"
3
3
  # Specify your gem's dependencies in semaph.gemspec
4
4
  gemspec
5
5
 
6
- gem "rake", "~> 12.0"
7
6
  gem "minitest", "~> 5.0"
7
+ gem "rake", "~> 12.0"
@@ -0,0 +1,35 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ semaph (0.1.0)
5
+ faraday
6
+ rainbow
7
+ shell_shock
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ coderay (1.1.2)
13
+ faraday (1.0.1)
14
+ multipart-post (>= 1.2, < 3)
15
+ method_source (1.0.0)
16
+ minitest (5.14.1)
17
+ multipart-post (2.1.1)
18
+ pry (0.13.1)
19
+ coderay (~> 1.1)
20
+ method_source (~> 1.0)
21
+ rainbow (3.0.0)
22
+ rake (12.3.3)
23
+ shell_shock (0.0.5)
24
+
25
+ PLATFORMS
26
+ ruby
27
+
28
+ DEPENDENCIES
29
+ minitest (~> 5.0)
30
+ pry
31
+ rake (~> 12.0)
32
+ semaph!
33
+
34
+ BUNDLED WITH
35
+ 2.1.4
data/Rakefile CHANGED
@@ -7,4 +7,4 @@ Rake::TestTask.new(:test) do |t|
7
7
  t.test_files = FileList["test/**/*_test.rb"]
8
8
  end
9
9
 
10
- task :default => :test
10
+ task default: :test
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), "..", "lib")
4
+ require "semaph"
5
+ Semaph.console
@@ -1,6 +1,22 @@
1
1
  require "semaph/version"
2
+ require "semaph/shells/organisations/organisations_shell"
3
+ require "semaph/shells/organisation/organisation_shell"
4
+ require "yaml"
2
5
 
3
6
  module Semaph
4
7
  class Error < StandardError; end
5
- # Your code goes here...
8
+
9
+ def self.console
10
+ yaml_path = File.join(File.expand_path("~"), ".sem.yaml")
11
+ raise "Please install the sem tool and authenticate to semaphoreci.com" unless File.exist?(yaml_path)
12
+
13
+ sem_config = YAML.load_file(yaml_path)
14
+ contexts = sem_config["contexts"]
15
+
16
+ if contexts.count == 1
17
+ Shells::Organisation::OrganisationShell.new(contexts.values.first).push
18
+ else
19
+ Shells::Organisations::OrganisationsShell.new(contexts).push
20
+ end
21
+ end
6
22
  end
@@ -0,0 +1,61 @@
1
+ require "faraday"
2
+ require "json"
3
+
4
+ module Semaph
5
+ # Refer to https://docs.semaphoreci.com/reference/api-v1alpha/
6
+ class Api
7
+ attr_reader :host
8
+
9
+ def initialize(token, host)
10
+ @token = token
11
+ @host = host
12
+ @base = "https://#{host}/api/v1alpha"
13
+ end
14
+
15
+ def projects
16
+ get "projects"
17
+ end
18
+
19
+ def workflows(project_id)
20
+ get "plumber-workflows", { project_id: project_id }
21
+ end
22
+
23
+ def pipelines(options)
24
+ get "pipelines", options
25
+ end
26
+
27
+ def pipeline(id)
28
+ get "pipelines/#{id}", { detailed: true }
29
+ end
30
+
31
+ def job(id)
32
+ get "jobs/#{id}"
33
+ end
34
+
35
+ private
36
+
37
+ def get(path, params = {})
38
+ url = "#{@base}/#{path}"
39
+ puts url if ENV["SEMAPH_DEBUG"]
40
+ response = Faraday.get(url, params, headers)
41
+ check_response(response, url).tap do |hash|
42
+ pp hash if ENV["SEMAPH_DEBUG"]
43
+ end
44
+ end
45
+
46
+ def headers
47
+ {
48
+ "Authorization" => "Token #{@token}",
49
+ "Content-Type" => "application/json",
50
+ "Accept" => "application/json",
51
+ }
52
+ end
53
+
54
+ def check_response(response, url)
55
+ return JSON.parse(response.body) if response.status == 200
56
+
57
+ puts "http response #{response.status} received for #{url}:\n#{response.body}"
58
+ exit 1
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,16 @@
1
+ module Semaph
2
+ module Commands
3
+ class ReloadCommand
4
+ attr_reader :help
5
+
6
+ def initialize(entity, help)
7
+ @entity = entity
8
+ @help = help
9
+ end
10
+
11
+ def execute(_whatever)
12
+ @entity.reload
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module Semaph
2
+ module Commands
3
+ class VisitUrlCommand
4
+ attr_reader :help
5
+
6
+ def initialize(url, help)
7
+ @url = url
8
+ @help = help
9
+ end
10
+
11
+ def execute(_whatever)
12
+ system("open #{@url}")
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,9 @@
1
+ module Semaph
2
+ module Formatting
3
+ TIME_FORMAT = "%Y-%m-%d %H:%M:%S".freeze
4
+
5
+ def self.time(time)
6
+ time.strftime(TIME_FORMAT)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,40 @@
1
+ module Semaph
2
+ module Model
3
+ class Job
4
+ attr_reader(
5
+ :pipeline,
6
+ :id,
7
+ :name,
8
+ :status,
9
+ :result,
10
+ :block_name,
11
+ :block_state,
12
+ :block_result,
13
+ )
14
+
15
+ def initialize(pipeline, raw_block, raw_job)
16
+ @pipeline = pipeline
17
+ @raw_block = raw_block
18
+ @raw_job = raw_job
19
+ assign_from_job(raw_job)
20
+ assign_from_block(raw_block)
21
+ end
22
+
23
+ private
24
+
25
+ def assign_from_job(raw)
26
+ @id = raw["job_id"]
27
+ @status = raw["status"]
28
+ @name = raw["name"]
29
+ @result = raw["result"]
30
+ end
31
+
32
+ def assign_from_block(raw)
33
+ @block_name = raw["name"]
34
+ @block_state = raw["state"]
35
+ @block_result = raw["result"]
36
+ end
37
+ end
38
+ end
39
+ end
40
+
@@ -0,0 +1,34 @@
1
+ require "semaph/model/job"
2
+
3
+ module Semaph
4
+ module Model
5
+ class JobCollection
6
+ attr_reader :all
7
+
8
+ def initialize(pipeline)
9
+ @pipeline = pipeline
10
+ reload
11
+ end
12
+
13
+ def reload
14
+ workflow = @pipeline.workflow
15
+ project = workflow.project
16
+ @all = build_jobs(project.client.pipeline(@pipeline.id))
17
+ end
18
+
19
+ private
20
+
21
+ def build_jobs(content)
22
+ result = []
23
+ blocks = content.delete("blocks")
24
+ blocks.each do |block|
25
+ jobs = block.delete("jobs").sort_by { |job| job["index"] }
26
+ jobs.each do |job|
27
+ result << Job.new(@pipeline, block, job)
28
+ end
29
+ end
30
+ result
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,22 @@
1
+ require "semaph/model/job_collection"
2
+
3
+ module Semaph
4
+ module Model
5
+ class Pipeline
6
+ attr_reader :workflow, :raw, :id, :yaml, :state, :result
7
+
8
+ def initialize(workflow, raw)
9
+ @workflow = workflow
10
+ @raw = raw
11
+ @id = raw["ppl_id"]
12
+ @yaml = raw["yaml_file_name"]
13
+ @state = raw["state"]
14
+ @result = raw["result"]
15
+ end
16
+
17
+ def job_collection
18
+ JobCollection.new(self)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,21 @@
1
+ require "semaph/model/pipeline"
2
+
3
+ module Semaph
4
+ module Model
5
+ class PipelineCollection
6
+ attr_reader :all
7
+
8
+ def initialize(workflow)
9
+ @workflow = workflow
10
+ reload
11
+ end
12
+
13
+ def reload
14
+ project = @workflow.project
15
+ @all = project.client.pipelines({ wf_id: @workflow.id }).map do |content|
16
+ Pipeline.new @workflow, content
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,34 @@
1
+ require "semaph/model/workflow_collection"
2
+
3
+ module Semaph
4
+ module Model
5
+ class Project
6
+ GITHUB_REGGEXP = %r{git@github.com:(.*)/(.*).git}.freeze
7
+
8
+ attr_reader :client, :raw, :id, :name
9
+
10
+ def initialize(client, raw)
11
+ @client = client
12
+ @raw = raw
13
+ @id = raw["metadata"]["id"]
14
+ @name = raw["metadata"]["name"]
15
+ repo = raw["spec"]["repository"]["url"]
16
+ match = GITHUB_REGGEXP.match(repo)
17
+ return unless match
18
+
19
+ @repo_owner = match[1]
20
+ @repo_name = match[2]
21
+ end
22
+
23
+ def github_url
24
+ return nil unless @repo_owner && @repo_name
25
+
26
+ "https://github.com/#{@repo_owner}/#{@repo_name}"
27
+ end
28
+
29
+ def workflow_collection
30
+ WorkflowCollection.new(self)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,20 @@
1
+ require "semaph/model/project"
2
+
3
+ module Semaph
4
+ module Model
5
+ class ProjectCollection
6
+ attr_reader :all
7
+
8
+ def initialize(client)
9
+ @client = client
10
+ reload
11
+ end
12
+
13
+ def reload
14
+ @all = @client.projects.map do |content|
15
+ Project.new @client, content
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,24 @@
1
+ require "semaph/model/pipeline_collection"
2
+
3
+ module Semaph
4
+ module Model
5
+ class Workflow
6
+ attr_reader :project, :raw, :id, :sha, :branch, :branch_id, :created_at
7
+
8
+ def initialize(project, raw)
9
+ @project = project
10
+ @raw = raw
11
+ @id = raw["wf_id"]
12
+ @sha = raw["commit_sha"]
13
+ @created_at = Time.at(raw["created_at"]["seconds"].to_i)
14
+ @branch = raw["branch_name"]
15
+ @branch_id = raw["branch_id"]
16
+ # @summary = `git log -n 1 --format="%h %an %ci %s" #{sha}`
17
+ end
18
+
19
+ def pipeline_collection
20
+ PipelineCollection.new(self)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,20 @@
1
+ require "semaph/model/workflow"
2
+
3
+ module Semaph
4
+ module Model
5
+ class WorkflowCollection
6
+ attr_reader :all
7
+
8
+ def initialize(project)
9
+ @project = project
10
+ reload
11
+ end
12
+
13
+ def reload
14
+ @all = @project.client.workflows(@project.id).map do |content|
15
+ Workflow.new @project, content
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,29 @@
1
+ require "semaph/api"
2
+ require "semaph/commands/reload_command"
3
+ require "semaph/model/project_collection"
4
+ require "semaph/shells/organisation/projects_list_command"
5
+ require "semaph/shells/organisation/projects_select_command"
6
+ require "shell_shock/context"
7
+
8
+ module Semaph
9
+ module Shells
10
+ module Organisation
11
+ class OrganisationShell
12
+ include ShellShock::Context
13
+
14
+ def initialize(organisation)
15
+ host = organisation["host"]
16
+ @prompt = "🏗 #{host} > "
17
+ client = ::Semaph::Api.new(organisation["auth"]["token"], host)
18
+ project_collection = ::Semaph::Model::ProjectCollection.new(client)
19
+ add_command ProjectsListCommand.new(project_collection), "list-projects"
20
+ add_command ProjectsSelectCommand.new(project_collection), "select-project"
21
+ add_command(
22
+ ::Semaph::Commands::ReloadCommand.new(project_collection, "reload projects"),
23
+ "reload-projects",
24
+ )
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,20 @@
1
+ module Semaph
2
+ module Shells
3
+ module Organisation
4
+ class ProjectsListCommand
5
+ attr_reader :usage, :help
6
+
7
+ def initialize(project_collection)
8
+ @project_collection = project_collection
9
+ @help = "list available projects"
10
+ end
11
+
12
+ def execute(_whatever)
13
+ @project_collection.all.each do |project|
14
+ puts project.name
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,26 @@
1
+ require "semaph/shells/project/project_shell"
2
+
3
+ module Semaph
4
+ module Shells
5
+ module Organisation
6
+ class ProjectsSelectCommand
7
+ attr_reader :usage, :help
8
+
9
+ def initialize(project_collection)
10
+ @project_collection = project_collection
11
+ @usage = "<project>"
12
+ @help = "choose project"
13
+ end
14
+
15
+ def completion(text)
16
+ @project_collection.all.map(&:name).grep(/^#{text}/).sort
17
+ end
18
+
19
+ def execute(name)
20
+ selected_project = @project_collection.all.find { |project| project.name == name }
21
+ ::Semaph::Shells::Project::ProjectShell.new(selected_project).push
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,20 @@
1
+ module Semaph
2
+ module Shells
3
+ module Organisations
4
+ class OrganisationsListCommand
5
+ attr_reader :usage, :help
6
+
7
+ def initialize(organisations)
8
+ @organisations = organisations
9
+ @help = "list available organisations"
10
+ end
11
+
12
+ def execute(_whatever)
13
+ @organisations.each_key do |name|
14
+ puts "#{name} (#{@organisations[name]['host']})"
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,25 @@
1
+ require "semaph/shells/organisation/organisation_shell"
2
+
3
+ module Semaph
4
+ module Shells
5
+ module Organisations
6
+ class OrganisationsSelectCommand
7
+ attr_reader :usage, :help
8
+
9
+ def initialize(organisations)
10
+ @organisations = organisations
11
+ @usage = "<organisation>"
12
+ @help = "choose organisation"
13
+ end
14
+
15
+ def completion(text)
16
+ @organisations.keys.grep(/^#{text}/).sort
17
+ end
18
+
19
+ def execute(name)
20
+ ::Semaph::Shells::Organisation::OrganisationShell.new(@organisations[name]).push
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,20 @@
1
+ require "semaph/shells/organisations/organisations_list_command"
2
+ require "semaph/shells/organisations/organisations_select_command"
3
+ require "shell_shock/context"
4
+
5
+ module Semaph
6
+ module Shells
7
+ module Organisations
8
+ class OrganisationsShell
9
+ include ShellShock::Context
10
+
11
+ def initialize(organisations)
12
+ @organisations = organisations
13
+ @prompt = "🏗 > "
14
+ add_command OrganisationsListCommand.new(organisations), "list-organisations"
15
+ add_command OrganisationsSelectCommand.new(organisations), "select-organisation"
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,33 @@
1
+ module Semaph
2
+ module Shells
3
+ module Pipeline
4
+ class JobsListCommand
5
+ attr_reader :usage, :help
6
+
7
+ def initialize(job_collection)
8
+ @job_collection = job_collection
9
+ @help = "list jobs"
10
+ end
11
+
12
+ def execute(_whatever)
13
+ @job_collection.all.each do |job|
14
+ puts description(job)
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def description(job)
21
+ [
22
+ job.block_name,
23
+ job.block_state,
24
+ job.block_result,
25
+ job.name,
26
+ job.status,
27
+ job.result,
28
+ ].join(" ")
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,25 @@
1
+ require "semaph/shells/pipeline/jobs_list_command"
2
+ require "shell_shock/context"
3
+
4
+ module Semaph
5
+ module Shells
6
+ module Pipeline
7
+ class PipelineShell
8
+ include ShellShock::Context
9
+
10
+ def initialize(pipeline)
11
+ @pipeline = pipeline
12
+ workflow = pipeline.workflow
13
+ project = workflow.project
14
+ @prompt = "🏗 #{project.client.host} #{project.name} #{workflow.id} #{pipeline.yaml} > "
15
+ job_collection = pipeline.job_collection
16
+ add_command(
17
+ ::Semaph::Commands::ReloadCommand.new(job_collection, "reload jobs"),
18
+ "reload-jobs",
19
+ )
20
+ add_command JobsListCommand.new(job_collection), "list-jobs"
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,48 @@
1
+ require "semaph/commands/visit_url_command"
2
+ require "semaph/commands/reload_command"
3
+ require "semaph/shells/project/workflows_list_command"
4
+ require "semaph/shells/project/workflows_select_command"
5
+ require "shell_shock/context"
6
+
7
+ module Semaph
8
+ module Shells
9
+ module Project
10
+ class ProjectShell
11
+ include ShellShock::Context
12
+
13
+ def initialize(project)
14
+ @prompt = "🏗 #{project.client.host} #{project.name} > "
15
+ workflow_collection = project.workflow_collection
16
+ add_github_command(project)
17
+ add_command(
18
+ ::Semaph::Commands::ReloadCommand.new(workflow_collection, "reload workflows"),
19
+ "reload-workflows",
20
+ )
21
+ add_command(
22
+ ::Semaph::Commands::VisitUrlCommand.new(
23
+ "https://#{project.client.host}/projects/#{project.name}",
24
+ "browse to project",
25
+ ),
26
+ "open-project",
27
+ )
28
+ add_command WorkflowsListCommand.new(workflow_collection), "list-workflows"
29
+ add_command WorkflowsSelectCommand.new(workflow_collection), "select-workflow"
30
+ end
31
+
32
+ private
33
+
34
+ def add_github_command(project)
35
+ return unless project.github_url
36
+
37
+ add_command(
38
+ ::Semaph::Commands::VisitUrlCommand.new(
39
+ project.github_url,
40
+ "browse to github project",
41
+ ),
42
+ "open-github",
43
+ )
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,38 @@
1
+ module Semaph
2
+ module Shells
3
+ module Project
4
+ class WorkflowsListCommand
5
+ TIME_FORMAT = "%Y-%m-%d %H:%M:%S".freeze
6
+
7
+ attr_reader :usage, :help
8
+
9
+ def initialize(workflow_collection)
10
+ @workflow_collection = workflow_collection
11
+ @usage = "<branch>"
12
+ @help = "list available workflows"
13
+ end
14
+
15
+ def execute(branch)
16
+ @workflow_collection.all.each_with_index do |workflow, index|
17
+ next unless workflow.branch.include?(branch)
18
+
19
+ puts description(index, workflow)
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def description(index, workflow)
26
+ [
27
+ index + 1,
28
+ workflow.created_at.strftime(TIME_FORMAT),
29
+ "SHA",
30
+ workflow.sha,
31
+ "on branch",
32
+ workflow.branch,
33
+ ].join(" ")
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,24 @@
1
+ require "semaph/shells/workflow/workflow_shell"
2
+
3
+ module Semaph
4
+ module Shells
5
+ module Project
6
+ class WorkflowsSelectCommand
7
+ attr_reader :usage, :help
8
+
9
+ def initialize(workflow_collection)
10
+ @workflow_collection = workflow_collection
11
+ @usage = "<workflow index>"
12
+ @help = "choose workflow by index"
13
+ end
14
+
15
+ def execute(index_string)
16
+ index = index_string.to_i - 1
17
+ ::Semaph::Shells::Workflow::WorkflowShell.new(
18
+ @workflow_collection.all[index],
19
+ ).push
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,20 @@
1
+ module Semaph
2
+ module Shells
3
+ module Workflow
4
+ class PipelinesListCommand
5
+ attr_reader :usage, :help
6
+
7
+ def initialize(pipeline_collection)
8
+ @pipeline_collection = pipeline_collection
9
+ @help = "list pipelines"
10
+ end
11
+
12
+ def execute(_whatever)
13
+ @pipeline_collection.all.each_with_index do |pipeline, index|
14
+ puts "#{index + 1} #{pipeline.yaml} #{pipeline.state} #{pipeline.result}"
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,24 @@
1
+ require "semaph/shells/pipeline/pipeline_shell"
2
+
3
+ module Semaph
4
+ module Shells
5
+ module Workflow
6
+ class PipelinesSelectCommand
7
+ attr_reader :usage, :help
8
+
9
+ def initialize(pipeline_collection)
10
+ @pipeline_collection = pipeline_collection
11
+ @usage = "<pipeline index>"
12
+ @help = "choose pipeline by index"
13
+ end
14
+
15
+ def execute(index_string)
16
+ index = index_string.to_i - 1
17
+ ::Semaph::Shells::Pipeline::PipelineShell.new(
18
+ @pipeline_collection.all[index],
19
+ ).push
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,64 @@
1
+ require "semaph/commands/visit_url_command"
2
+ require "semaph/commands/reload_command"
3
+ require "semaph/shells/workflow/pipelines_list_command"
4
+ require "semaph/shells/workflow/pipelines_select_command"
5
+ require "shell_shock/context"
6
+
7
+ module Semaph
8
+ module Shells
9
+ module Workflow
10
+ class WorkflowShell
11
+ include ShellShock::Context
12
+
13
+ def initialize(workflow)
14
+ @workflow = workflow
15
+ project = @workflow.project
16
+ @prompt = "🏗 #{project.client.host} #{project.name} #{workflow.id} > "
17
+ pipeline_collection = workflow.pipeline_collection
18
+ add_command PipelinesListCommand.new(pipeline_collection), "list-pipelines"
19
+ add_command PipelinesSelectCommand.new(pipeline_collection), "select-pipeline"
20
+ add_command(
21
+ ::Semaph::Commands::VisitUrlCommand.new(
22
+ "https://#{project.client.host}/workflows/#{workflow.id}",
23
+ "browse to workflow",
24
+ ),
25
+ "open-workflow",
26
+ )
27
+ add_command(
28
+ ::Semaph::Commands::VisitUrlCommand.new(
29
+ "https://#{project.client.host}/branches/#{workflow.branch_id}",
30
+ "browse to branch in semaphore",
31
+ ),
32
+ "open-branch",
33
+ )
34
+ add_github_commands(workflow)
35
+ add_command(
36
+ ::Semaph::Commands::ReloadCommand.new(pipeline_collection, "reload pipelines"),
37
+ "reload-pipelines",
38
+ )
39
+ end
40
+
41
+ private
42
+
43
+ def add_github_commands(workflow)
44
+ return unless workflow.project.github_url
45
+
46
+ add_command(
47
+ ::Semaph::Commands::VisitUrlCommand.new(
48
+ "#{workflow.project.github_url}/tree/#{workflow.branch}",
49
+ "browse to the branch in github",
50
+ ),
51
+ "open-github-branch",
52
+ )
53
+ add_command(
54
+ ::Semaph::Commands::VisitUrlCommand.new(
55
+ "#{workflow.project.github_url}/commit/#{workflow.sha}",
56
+ "browse to the commit in github",
57
+ ),
58
+ "open-github-commit",
59
+ )
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -1,3 +1,3 @@
1
1
  module Semaph
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0".freeze
3
3
  end
@@ -1,4 +1,4 @@
1
- require_relative 'lib/semaph/version'
1
+ require_relative "lib/semaph/version"
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = "semaph"
@@ -6,8 +6,8 @@ Gem::Specification.new do |spec|
6
6
  spec.authors = ["Mark Ryall"]
7
7
  spec.email = ["mark@ryall.name"]
8
8
 
9
- spec.summary = %q{client for semaphore 2}
10
- spec.description = %q{api client and shell for api}
9
+ spec.summary = "client for semaphore 2"
10
+ spec.description = "api client and shell for api"
11
11
  spec.homepage = "http://github.com/markryall/semaph"
12
12
  spec.license = "MIT"
13
13
  spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
@@ -16,12 +16,16 @@ Gem::Specification.new do |spec|
16
16
  spec.metadata["source_code_uri"] = spec.homepage
17
17
  spec.metadata["changelog_uri"] = spec.homepage
18
18
 
19
- # Specify which files should be added to the gem when it is released.
20
- # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
21
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
22
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
19
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
20
+ f.match(%r{^(test|spec|features)/})
23
21
  end
24
22
  spec.bindir = "exe"
25
23
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
26
24
  spec.require_paths = ["lib"]
25
+
26
+ spec.add_dependency "faraday"
27
+ spec.add_dependency "rainbow"
28
+ spec.add_dependency "shell_shock"
29
+
30
+ spec.add_development_dependency "pry"
27
31
  end
metadata CHANGED
@@ -1,32 +1,120 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: semaph
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Ryall
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-05-29 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2020-05-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rainbow
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: shell_shock
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
13
69
  description: api client and shell for api
14
70
  email:
15
71
  - mark@ryall.name
16
- executables: []
72
+ executables:
73
+ - semaph
17
74
  extensions: []
18
75
  extra_rdoc_files: []
19
76
  files:
20
77
  - ".gitignore"
78
+ - ".rubocop.yml"
79
+ - ".semaphore/semaphore.yml"
80
+ - ".tool-versions"
21
81
  - ".travis.yml"
22
82
  - CODE_OF_CONDUCT.md
23
83
  - Gemfile
84
+ - Gemfile.lock
24
85
  - LICENSE.txt
25
86
  - README.md
26
87
  - Rakefile
27
88
  - bin/console
28
89
  - bin/setup
90
+ - exe/semaph
29
91
  - lib/semaph.rb
92
+ - lib/semaph/api.rb
93
+ - lib/semaph/commands/reload_command.rb
94
+ - lib/semaph/commands/visit_url_command.rb
95
+ - lib/semaph/formatting.rb
96
+ - lib/semaph/model/job.rb
97
+ - lib/semaph/model/job_collection.rb
98
+ - lib/semaph/model/pipeline.rb
99
+ - lib/semaph/model/pipeline_collection.rb
100
+ - lib/semaph/model/project.rb
101
+ - lib/semaph/model/project_collection.rb
102
+ - lib/semaph/model/workflow.rb
103
+ - lib/semaph/model/workflow_collection.rb
104
+ - lib/semaph/shells/organisation/organisation_shell.rb
105
+ - lib/semaph/shells/organisation/projects_list_command.rb
106
+ - lib/semaph/shells/organisation/projects_select_command.rb
107
+ - lib/semaph/shells/organisations/organisations_list_command.rb
108
+ - lib/semaph/shells/organisations/organisations_select_command.rb
109
+ - lib/semaph/shells/organisations/organisations_shell.rb
110
+ - lib/semaph/shells/pipeline/jobs_list_command.rb
111
+ - lib/semaph/shells/pipeline/pipeline_shell.rb
112
+ - lib/semaph/shells/project/project_shell.rb
113
+ - lib/semaph/shells/project/workflows_list_command.rb
114
+ - lib/semaph/shells/project/workflows_select_command.rb
115
+ - lib/semaph/shells/workflow/pipelines_list_command.rb
116
+ - lib/semaph/shells/workflow/pipelines_select_command.rb
117
+ - lib/semaph/shells/workflow/workflow_shell.rb
30
118
  - lib/semaph/version.rb
31
119
  - semaph.gemspec
32
120
  homepage: http://github.com/markryall/semaph