local_ci 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 6da45961cab3661dd38b4c4c8df3317eb9ddd6b995f6dfa95e5d4083f704c3d1
4
+ data.tar.gz: a9545621f1d8baaf69730bc631a6f73f8c261e1740613f763348aae2233c2c8e
5
+ SHA512:
6
+ metadata.gz: fb9e176666f22257c6ac55dfa8991ed056acd330656312b61d9569c6bd764f0c9caf28064dbfb5252b4e30751c7026c22f5b20577da38b3de5995a3b760fcd1f
7
+ data.tar.gz: cdced51659d21eb82e050297a9267e8441e563eed6d2277f763c5bc1e5f3c2b530c2ee69cb6f26e24bbc75d2bf45e8a98c9467f475f703ccdc6c3d56516ebc5f
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ *.log
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source "https://rubygems.org"
2
+ gemspec
3
+
4
+ group :development do
5
+ gem "standardrb"
6
+ end
7
+
8
+ group :test do
9
+ gem "neospec"
10
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,84 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ local_ci (0.0.1)
5
+ logger
6
+ pastel
7
+ rake
8
+ tty-command
9
+ tty-spinner
10
+
11
+ GEM
12
+ remote: https://rubygems.org/
13
+ specs:
14
+ ast (2.4.3)
15
+ json (2.16.0)
16
+ language_server-protocol (3.17.0.5)
17
+ lint_roller (1.1.0)
18
+ logger (1.7.0)
19
+ neospec (0.0.1)
20
+ parallel (1.27.0)
21
+ parser (3.3.10.0)
22
+ ast (~> 2.4.1)
23
+ racc
24
+ pastel (0.8.0)
25
+ tty-color (~> 0.5)
26
+ prism (1.6.0)
27
+ racc (1.8.1)
28
+ rainbow (3.1.1)
29
+ rake (13.3.1)
30
+ regexp_parser (2.11.3)
31
+ rubocop (1.81.7)
32
+ json (~> 2.3)
33
+ language_server-protocol (~> 3.17.0.2)
34
+ lint_roller (~> 1.1.0)
35
+ parallel (~> 1.10)
36
+ parser (>= 3.3.0.2)
37
+ rainbow (>= 2.2.2, < 4.0)
38
+ regexp_parser (>= 2.9.3, < 3.0)
39
+ rubocop-ast (>= 1.47.1, < 2.0)
40
+ ruby-progressbar (~> 1.7)
41
+ unicode-display_width (>= 2.4.0, < 4.0)
42
+ rubocop-ast (1.48.0)
43
+ parser (>= 3.3.7.2)
44
+ prism (~> 1.4)
45
+ rubocop-performance (1.25.0)
46
+ lint_roller (~> 1.1)
47
+ rubocop (>= 1.75.0, < 2.0)
48
+ rubocop-ast (>= 1.38.0, < 2.0)
49
+ ruby-progressbar (1.13.0)
50
+ standard (1.52.0)
51
+ language_server-protocol (~> 3.17.0.2)
52
+ lint_roller (~> 1.0)
53
+ rubocop (~> 1.81.7)
54
+ standard-custom (~> 1.0.0)
55
+ standard-performance (~> 1.8)
56
+ standard-custom (1.0.2)
57
+ lint_roller (~> 1.0)
58
+ rubocop (~> 1.50)
59
+ standard-performance (1.8.0)
60
+ lint_roller (~> 1.1)
61
+ rubocop-performance (~> 1.25.0)
62
+ standardrb (1.0.1)
63
+ standard
64
+ tty-color (0.6.0)
65
+ tty-command (0.10.1)
66
+ pastel (~> 0.8)
67
+ tty-cursor (0.7.1)
68
+ tty-spinner (0.9.3)
69
+ tty-cursor (~> 0.7)
70
+ unicode-display_width (3.2.0)
71
+ unicode-emoji (~> 4.1)
72
+ unicode-emoji (4.1.0)
73
+
74
+ PLATFORMS
75
+ ruby
76
+ x86_64-linux
77
+
78
+ DEPENDENCIES
79
+ local_ci!
80
+ neospec
81
+ standardrb
82
+
83
+ BUNDLED WITH
84
+ 2.7.2
data/Rakefile ADDED
@@ -0,0 +1,35 @@
1
+ require "local_ci"
2
+
3
+ CHUNK = 15
4
+
5
+ desc "Run the CI suite locally"
6
+ task :local_ci
7
+
8
+ LocalCI.flow(:linting, "Linting") do
9
+ job "StandardRB" do
10
+ run "bundle exec standardrb"
11
+ end
12
+ end
13
+
14
+ LocalCI.flow(:build, "Build") do
15
+ CHUNK.times do |i|
16
+ job "build-#{i}" do
17
+ run "sleep 1"
18
+ end
19
+ end
20
+ end
21
+
22
+ LocalCI.flow(:lint, "Lint") do
23
+ CHUNK.times do |i|
24
+ job "lint-#{i}" do
25
+ run "sleep 1"
26
+ run "echo 'hi'"
27
+ end
28
+ end
29
+ end
30
+
31
+ namespace :standardrb do
32
+ task :fix do
33
+ `bundle exec standardrb --fix-unsafely`
34
+ end
35
+ end
@@ -0,0 +1,16 @@
1
+ module LocalCI
2
+ class Failure
3
+ def pastel = @pastel ||= Pastel.new
4
+
5
+ def initialize(job:, message:)
6
+ @job = job
7
+ @message = message
8
+ end
9
+
10
+ def display
11
+ puts "#{pastel.bold.red("FAIL:")} #{@job}"
12
+ puts @message
13
+ puts
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,64 @@
1
+ module LocalCI
2
+ class Flow
3
+ attr_reader :heading, :job_spinner
4
+
5
+ def pastel = @pastel ||= Pastel.new
6
+ def runner = @runner ||= TTY::Command.new(output: Logger.new("ci.log"))
7
+
8
+ def initialize(task:, heading:, parallel:, block:)
9
+ @failures = []
10
+ @task = task
11
+ @heading = heading
12
+ @job_spinner = TTY::Spinner::Multi.new(
13
+ "[:spinner] #{pastel.bold.blue(heading)}",
14
+ format: :classic,
15
+ success_mark: pastel.green("✓"),
16
+ error_mark: pastel.red("✗"),
17
+ style: {
18
+ top: "",
19
+ middle: " ",
20
+ bottom: " "
21
+ }
22
+ )
23
+
24
+ klass = parallel ? Rake::MultiTask : Rake::Task
25
+ @flow = klass.define_task(task) do
26
+ @failures.each do |failure|
27
+ failure.display
28
+ end
29
+
30
+ abort pastel.red("#{@heading} failed, see CI.log for more.") if @failures.any?
31
+ end
32
+
33
+ @flow.comment = heading
34
+ Rake::Task[:local_ci].prerequisites << @task
35
+
36
+ instance_exec(&block)
37
+ end
38
+
39
+ def job(title, &block)
40
+ task = "#{@task}:#{title}"
41
+ spinner = job_spinner.register("[:spinner] #{title}")
42
+
43
+ Rake::Task.define_task(task) do
44
+ spinner.auto_spin
45
+ start = Time.now
46
+ instance_exec(&block)
47
+ took = Time.now - start
48
+ spinner.success("(#{took.round(2)}s)")
49
+ rescue TTY::Command::ExitError => e
50
+ spinner.error
51
+ @failures << LocalCI::Failure.new(
52
+ job: title,
53
+ message: e.message
54
+ )
55
+ end
56
+
57
+ @flow.prerequisites << task
58
+ end
59
+
60
+ def run(command)
61
+ runner.run command
62
+ end
63
+ end
64
+ end
data/lib/local_ci.rb ADDED
@@ -0,0 +1,13 @@
1
+ require "logger"
2
+ require "tty-command"
3
+ require "tty-spinner"
4
+ require "pastel"
5
+
6
+ require "local_ci/failure"
7
+ require "local_ci/flow"
8
+
9
+ module LocalCI
10
+ def self.flow(task, heading, parallel: true, &block)
11
+ LocalCI::Flow.new(task: task, heading: heading, parallel: parallel, block: block)
12
+ end
13
+ end
data/local_ci.gemspec ADDED
@@ -0,0 +1,18 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "local_ci"
3
+ s.version = "0.0.1"
4
+ s.summary = "Run CI locally"
5
+ s.description = "A way to run CI locally but also able to run easily on your hosted CI"
6
+ s.authors = ["Sean Earle"]
7
+ s.email = "sean.r.earle@gmail.com"
8
+ s.files = `git ls-files`.split($\)
9
+ s.executables = []
10
+ s.homepage = "https://github.com/HellRok/local_ci"
11
+ s.license = "MIT"
12
+
13
+ s.add_dependency "logger"
14
+ s.add_dependency "pastel"
15
+ s.add_dependency "rake"
16
+ s.add_dependency "tty-command"
17
+ s.add_dependency "tty-spinner"
18
+ end
metadata ADDED
@@ -0,0 +1,117 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: local_ci
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Sean Earle
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: logger
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: pastel
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: rake
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: tty-command
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: tty-spinner
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ description: A way to run CI locally but also able to run easily on your hosted CI
83
+ email: sean.r.earle@gmail.com
84
+ executables: []
85
+ extensions: []
86
+ extra_rdoc_files: []
87
+ files:
88
+ - ".gitignore"
89
+ - Gemfile
90
+ - Gemfile.lock
91
+ - Rakefile
92
+ - lib/local_ci.rb
93
+ - lib/local_ci/failure.rb
94
+ - lib/local_ci/flow.rb
95
+ - local_ci.gemspec
96
+ homepage: https://github.com/HellRok/local_ci
97
+ licenses:
98
+ - MIT
99
+ metadata: {}
100
+ rdoc_options: []
101
+ require_paths:
102
+ - lib
103
+ required_ruby_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ required_rubygems_version: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ requirements: []
114
+ rubygems_version: 3.6.9
115
+ specification_version: 4
116
+ summary: Run CI locally
117
+ test_files: []