semaph 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7db37cbca829e1b13372c7a8687b86080b1e4a579bbb7707e6cc207ebdcb4ba1
4
- data.tar.gz: 4b5015379f62ad0382991f26b525583d2a6e077889071e5bde58dc1399d69ada
3
+ metadata.gz: c17a30876e3fab18baefc8d5055a1c079f58711f03f70fbd9bc29ad45fc2733e
4
+ data.tar.gz: a30b3f23dc8d7f1111add796133b2d72bff6d3dbd7369f4a2923fc98f38a317f
5
5
  SHA512:
6
- metadata.gz: 243de9cc3425299a5d7a5a11d3a6e06a89e56ad22e0bab59fe4568544fc8e05f0a6e902363497d493811a00c30f84a95456a0679417fb7d4d39b10ad35ece692
7
- data.tar.gz: f1fd8d22e22885357f0b5c1ba962ac1edb91b61b6ab3b9e03cfec9aeda88197a40bfcfe2b047417d3d2629e5eb8f9fa3e32b9dde40e8feefeb09bae8e7e5527d
6
+ metadata.gz: 88d9f42701e59b2b93f004c6a51eed5ebed4b047556ddc0eb959075522afeeb499fcd0da29348b61a56359c167418bdf225af7bcf0a2e38425b91146a7df9fce
7
+ data.tar.gz: 8671942b1efd8e43106aaebc50bc096ae073961c21bd2b86287bb588bb22b5e82ca1c049e84fdd1cace3e713cd7cdfdd9024138ec3f491274ee62736ae2f94eb
data/.semaph ADDED
@@ -0,0 +1,9 @@
1
+ ---
2
+ :host: markryall.semaphoreci.com
3
+ :project:
4
+ spec:
5
+ repository:
6
+ url: git@github.com:markryall/semaph.git
7
+ metadata:
8
+ name: semaph
9
+ id: e75c6c57-2665-4e45-9cab-560508eb0b22
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- semaph (0.7.0)
4
+ semaph (0.8.0)
5
5
  faraday
6
6
  rainbow
7
7
  shell_shock
@@ -1,22 +1,57 @@
1
+ require "semaph/client"
2
+ require "semaph/model/project"
1
3
  require "semaph/version"
2
4
  require "semaph/shells/organisations/organisations_shell"
3
5
  require "semaph/shells/organisation/organisation_shell"
6
+ require "semaph/shells/project/project_shell"
4
7
  require "yaml"
5
8
 
6
9
  module Semaph
7
10
  class Error < StandardError; end
8
11
 
9
12
  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"]
13
+ organisations = load_organisations
14
+ config = load_config
15
15
 
16
- if contexts.count == 1
17
- Shells::Organisation::OrganisationShell.new(contexts.values.first).push
16
+ if config
17
+ console_with_config(organisations, config)
18
+ elsif organisations.count == 1
19
+ Shells::Organisation::OrganisationShell.new(organisations.first).push
18
20
  else
19
- Shells::Organisations::OrganisationsShell.new(contexts).push
21
+ Shells::Organisations::OrganisationsShell.new(organisations).push
22
+ end
23
+ end
24
+
25
+ def self.console_with_config(organisations, config)
26
+ organisation = organisations.find { |o| o["host"] == config[:host] }
27
+
28
+ Shells::Project::ProjectShell.new(
29
+ Model::Project.new(
30
+ ::Semaph::Client.new(
31
+ organisation["auth"]["token"],
32
+ organisation["host"],
33
+ ),
34
+ config[:project],
35
+ ),
36
+ ).push
37
+ end
38
+
39
+ def self.load_organisations
40
+ yaml_path = File.join(File.expand_path("~"), ".sem.yaml")
41
+
42
+ unless File.exist?(yaml_path)
43
+ unless organisations
44
+ puts "Please install the sem tool and authenticate to semaphoreci.com"
45
+ exit 1
46
+ end
20
47
  end
48
+
49
+ YAML.load_file(yaml_path)["contexts"].values
50
+ end
51
+
52
+ def self.load_config
53
+ return nil unless File.exist?(".semaph")
54
+
55
+ YAML.load_file(".semaph")
21
56
  end
22
57
  end
@@ -1,9 +1,10 @@
1
+ require "date"
1
2
  require "semaph/model/job"
2
3
 
3
4
  module Semaph
4
5
  module Model
5
6
  class JobCollection
6
- attr_reader :all, :pipeline
7
+ attr_reader :all, :pipeline, :stopping_at, :running_at, :queuing_at, :pending_at, :done_at, :created_at
7
8
 
8
9
  def initialize(pipeline)
9
10
  @pipeline = pipeline
@@ -12,7 +13,7 @@ module Semaph
12
13
  def reload
13
14
  workflow = @pipeline.workflow
14
15
  project = workflow.project
15
- @all = build_jobs(project.client.pipeline(@pipeline.id))
16
+ @all = parse_content(project.client.pipeline(@pipeline.id))
16
17
  end
17
18
 
18
19
  def incomplete
@@ -25,7 +26,8 @@ module Semaph
25
26
 
26
27
  private
27
28
 
28
- def build_jobs(content)
29
+ def parse_content(content)
30
+ parse_pipeline(content["pipeline"])
29
31
  result = []
30
32
  blocks = content.delete("blocks")
31
33
  blocks.each do |block|
@@ -35,6 +37,15 @@ module Semaph
35
37
  result
36
38
  end
37
39
 
40
+ def parse_pipeline(pipeline_content)
41
+ with_time(pipeline_content["stopping_at"]) { |time| @stopping_at = time }
42
+ with_time(pipeline_content["running_at"]) { |time| @running_at = time }
43
+ with_time(pipeline_content["queuing_at"]) { |time| @queuing_at = time }
44
+ with_time(pipeline_content["pending_at"]) { |time| @pending_at = time }
45
+ with_time(pipeline_content["done_at"]) { |time| @done_at = time }
46
+ with_time(pipeline_content["created_at"]) { |time| @created_at = time }
47
+ end
48
+
38
49
  def append_jobs(result, block, jobs)
39
50
  if jobs.count.positive?
40
51
  jobs.each { |job| result << Job.new(@pipeline, block, job) }
@@ -42,6 +53,11 @@ module Semaph
42
53
  result << Job.new(@pipeline, block, {})
43
54
  end
44
55
  end
56
+
57
+ def with_time(string)
58
+ time = DateTime.parse(string).to_time
59
+ yield time unless time.to_i.zero?
60
+ end
45
61
  end
46
62
  end
47
63
  end
@@ -10,8 +10,8 @@ module Semaph
10
10
  end
11
11
 
12
12
  def execute(_whatever)
13
- @organisations.each_key do |name|
14
- puts "#{name} (#{@organisations[name]['host']})"
13
+ @organisations.each do |organisation|
14
+ puts organisation["host"].split(".").first
15
15
  end
16
16
  end
17
17
  end
@@ -13,11 +13,13 @@ module Semaph
13
13
  end
14
14
 
15
15
  def completion(text)
16
- @organisations.keys.grep(/^#{text}/).sort
16
+ @organisations.map { |org| org["host"].split(".").first }.grep(/^#{text}/).sort
17
17
  end
18
18
 
19
19
  def execute(name)
20
- organisation = @organisations[name]
20
+ organisation = @organisations.find do |org|
21
+ org["host"].split(".").first == name
22
+ end
21
23
 
22
24
  unless organisation
23
25
  puts "There is no organisation called #{name}"
@@ -4,7 +4,7 @@ module Semaph
4
4
  module Shells
5
5
  module Pipeline
6
6
  class JobLogCommand
7
- attr_reader :usage, :help
7
+ attr_reader :usage, :help, :job_collection
8
8
 
9
9
  def initialize(job_collection)
10
10
  @job_collection = job_collection
@@ -13,23 +13,23 @@ module Semaph
13
13
  end
14
14
 
15
15
  def execute(index_string)
16
- base = "tmp/logs/pipeline/#{@job_collection.pipeline.id}"
17
- with_job(index_string) do |job|
18
- unless job.finished?
19
- puts "This job has not finished yet"
20
- return
21
- end
22
-
23
- system("less #{job.write_log(base)}")
24
- end
16
+ with_job(index_string) { |job| system(command(job)) }
25
17
  end
26
18
 
27
19
  private
28
20
 
21
+ def command(job)
22
+ base = "tmp/logs/pipeline/#{job_collection.pipeline.id}"
23
+
24
+ return "less #{job.write_log(base)}" if job.finished?
25
+
26
+ "open https://#{job_collection.pipeline.workflow.project.client.host}/jobs/#{job.id}"
27
+ end
28
+
29
29
  def with_job(index_string)
30
30
  index = index_string.to_i - 1
31
31
 
32
- job = @job_collection.all[index]
32
+ job = job_collection.all[index]
33
33
 
34
34
  unless job
35
35
  puts "There is no job at position #{index}"
@@ -21,8 +21,7 @@ module Semaph
21
21
  private
22
22
 
23
23
  def report_and_reload(period)
24
- report_incomplete(job_collection.incomplete)
25
- sleep period
24
+ period.times { report_incomplete }
26
25
  job_collection.reload
27
26
  end
28
27
 
@@ -36,10 +35,28 @@ module Semaph
36
35
  )
37
36
  end
38
37
 
39
- def report_incomplete(incomplete_jobs)
40
- puts "polling #{job_collection.pipeline.workflow.description}"
41
- puts "#{incomplete_jobs.count} incomplete jobs remaining:"
42
- incomplete_jobs.each { |job| puts job.description }
38
+ def report_incomplete
39
+ base = [nil, elapsed, report_ratio, job_collection.pipeline.workflow.description].join(" ")
40
+ erase base
41
+ end
42
+
43
+ def report_ratio
44
+ [
45
+ job_collection.incomplete.count.to_s.rjust(2, "0"),
46
+ job_collection.all.count.to_s.rjust(2, "0"),
47
+ ].join("/")
48
+ end
49
+
50
+ def elapsed
51
+ duration = Time.now.to_i - job_collection.created_at.to_i
52
+ mins = duration / 60
53
+ secs = duration % 60
54
+ [mins.to_s.rjust(2, "0"), secs.to_s.rjust(2, "0")].join(":")
55
+ end
56
+
57
+ def erase(string)
58
+ print string
59
+ print "\b" * string.length
43
60
  end
44
61
 
45
62
  def notify(title, message, failed)
@@ -1,5 +1,6 @@
1
1
  require "semaph/commands/reload_command"
2
2
  require "semaph/commands/visit_url_command"
3
+ require "semaph/shells/project/save_command"
3
4
  require "semaph/shells/project/workflows_list_command"
4
5
  require "semaph/shells/project/workflows_select_command"
5
6
  require "shell_shock/context"
@@ -28,6 +29,7 @@ module Semaph
28
29
  def add_commands
29
30
  add_github_command
30
31
  add_open_project_command
32
+ add_command SaveCommand.new(project), "save"
31
33
  @workflows_list_command = WorkflowsListCommand.new(workflow_collection)
32
34
  add_command @workflows_list_command, "list-workflows", "ls"
33
35
  add_command WorkflowsSelectCommand.new(workflow_collection), "select-workflow", "cd"
@@ -0,0 +1,26 @@
1
+ require "yaml"
2
+
3
+ module Semaph
4
+ module Shells
5
+ module Project
6
+ class SaveCommand
7
+ attr_reader :help, :project
8
+
9
+ def initialize(project)
10
+ @project = project
11
+ @help = "save current project as default for this folder"
12
+ end
13
+
14
+ def execute(_ignored)
15
+ config = {
16
+ host: project.client.host,
17
+ project: project.raw,
18
+ }
19
+ File.open(".semaph", "w") do |file|
20
+ file.puts config.to_yaml
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,3 +1,3 @@
1
1
  module Semaph
2
- VERSION = "0.7.0".freeze
2
+ VERSION = "0.8.0".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: semaph
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.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-06-16 00:00:00.000000000 Z
11
+ date: 2020-07-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -90,6 +90,7 @@ extra_rdoc_files: []
90
90
  files:
91
91
  - ".gitignore"
92
92
  - ".rubocop.yml"
93
+ - ".semaph"
93
94
  - ".semaphore/semaphore.yml"
94
95
  - ".tool-versions"
95
96
  - ".travis.yml"
@@ -137,6 +138,7 @@ files:
137
138
  - lib/semaph/shells/pipeline/promote_command.rb
138
139
  - lib/semaph/shells/pipeline/promotions_list_command.rb
139
140
  - lib/semaph/shells/project/project_shell.rb
141
+ - lib/semaph/shells/project/save_command.rb
140
142
  - lib/semaph/shells/project/workflows_list_command.rb
141
143
  - lib/semaph/shells/project/workflows_select_command.rb
142
144
  - lib/semaph/shells/workflow/pipelines_list_command.rb