chores_kit 0.2.4 → 0.2.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 19ec873d34bb484993376797e28863ff73d6c94cb05620dfcc30cc4e0d87b0cc
4
- data.tar.gz: b62cf334ae1f2bbe2b67c545ebda1a58c780a9c2796db50b76f17d4e470956c0
3
+ metadata.gz: 898c280b6ba9f1f1941b188b33063553c00361f133b771d6aaa7d23b6bce38e6
4
+ data.tar.gz: 1e50353fb4cdf45b6d997cee856fd8805ded75c11d30d7e6e65dd0c8bf3bfee2
5
5
  SHA512:
6
- metadata.gz: 4b487d0884cabbb4d686dbc8728bb7b4bfb87035c6493daad774322d158b6bf4595f30e20de0087b817a994430eef84a1f20ab58308e712233b831611c5253bc
7
- data.tar.gz: 8751c3ad24e492571dec91d7300c6b5799aa8168e0b915f61d2aab005c4191ea2d42c439e43ebcf468ccef6beb126a4d987f984c152bdebb86da4eec637df377
6
+ metadata.gz: 2d1b9d31c713f4139776773da148968d6a2130d1f80c10430d97f7dd6bd638a481b9a9cd67f403498b5d1b4d12744debbdf734a997596cd9c2af2b47d8754fa6
7
+ data.tar.gz: bf1d11e5a66d39b7bd73caf3373e574373ba3f82ed21ed100ee8f6d3f6628d7471a9cb09ae0d0ce6f3570ca3c09ac58283c7c2307a45ecc63d1d2cc8894249bb
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- chores_kit (0.2.4)
4
+ chores_kit (0.2.5)
5
5
  as-duration (~> 0.1.1)
6
6
  dag (~> 0.0.9)
7
7
 
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+ require 'chores_kit'
6
+
7
+ filename = ARGV[0]
8
+
9
+ unless filename
10
+ puts 'Error: Expecting filename to run passed as parameter'
11
+ exit(1)
12
+ end
13
+
14
+ chore = Chores.load(filename)
15
+ chore.run!
@@ -15,8 +15,7 @@ Gem::Specification.new do |spec|
15
15
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
16
16
  f.match(%r{^(test|spec|features)/})
17
17
  end
18
- spec.bindir = 'exe'
19
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
18
+ spec.executables << 'chores'
20
19
  spec.require_paths = ['lib']
21
20
 
22
21
  spec.required_ruby_version = '>= 2.2.0'
@@ -0,0 +1,42 @@
1
+ require 'net/http'
2
+
3
+ Chores.define :rubygems do
4
+ schedule at: '2018-03-12', every: 1.week
5
+
6
+ task :download do
7
+ uri = URI('https://s3-us-west-2.amazonaws.com/rubygems-dumps/?prefix=production/public_postgresql')
8
+ index = Net::HTTP.get(uri)
9
+
10
+ matches = index.match(/.*<Key>(.*)<\/Key>.*/)
11
+ filename = matches.captures.first
12
+ url = "https://s3-us-west-2.amazonaws.com/rubygems-dumps/#{filename}"
13
+
14
+ sh "curl -o rubygems.tar -L #{url}"
15
+ end
16
+
17
+ task :drop_db do
18
+ sh 'dropdb -U postgres --if-exists rubygems'
19
+ end
20
+
21
+ task :create_db do
22
+ sh 'createdb -U postgres rubygems'
23
+ end
24
+
25
+ task :create_extension do
26
+ sh 'psql -q -U postgres -d rubygems -c "CREATE EXTENSION IF NOT EXISTS hstore;"'
27
+ end
28
+
29
+ task :unpack do
30
+ sh 'tar xOf rubygems.tar public_postgresql/databases/PostgreSQL.sql.gz | gunzip > rubygems.sql'
31
+ end
32
+
33
+ task :load do
34
+ sh 'psql -U postgres -d rubygems < rubygems.sql'
35
+ end
36
+
37
+ run :download, triggers: :drop_db
38
+ run :drop_db, triggers: :create_db
39
+ run :create_db, triggers: :create_extension
40
+ run :create_extension, triggers: :unpack
41
+ run :unpack, triggers: :load
42
+ end
@@ -1,9 +1,9 @@
1
- require 'chores_kit/dag/dag'
2
-
3
1
  require 'chores_kit/chore'
2
+ require 'chores_kit/chore/dag'
4
3
  require 'chores_kit/chore/embedded_task'
5
4
  require 'chores_kit/chore/notification'
6
5
  require 'chores_kit/chore/task'
6
+ require 'chores_kit/executors/shell'
7
7
  require 'chores_kit/definition_proxy'
8
8
  require 'chores_kit/chores'
9
9
  require 'chores_kit/version'
@@ -83,7 +83,7 @@ module ChoresKit
83
83
  # Set explicit root task and skip further processing if the Chore has
84
84
  # just one task defined or if only one of its tasks is set to run
85
85
  if tasks.one? || from == to
86
- @dag.root = @dag.find_by(name: from)
86
+ @dag.root!(@dag.find_by(name: from))
87
87
  return
88
88
  end
89
89
 
@@ -91,7 +91,6 @@ module ChoresKit
91
91
  v2 = @dag.vertices.detect { |vertex| vertex[:name] == to }
92
92
 
93
93
  @dag.add_edge(from: v1, to: v2)
94
- @dag.root = v1
95
94
  end
96
95
  # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
97
96
 
@@ -109,5 +108,9 @@ module ChoresKit
109
108
  @notifications[condition] = notification
110
109
  end
111
110
  end
111
+
112
+ def run!
113
+ @dag.root.run
114
+ end
112
115
  end
113
116
  end
@@ -3,15 +3,17 @@ require 'dag'
3
3
  module ChoresKit
4
4
  class DAG < ::DAG
5
5
  def root
6
- @root ||= @vertices.detect { |v| v.ancestors.empty? }
7
- end
6
+ return @vertices.first if @root.nil? && @edges.empty?
8
7
 
9
- def find_by(name:)
10
- @vertices.detect { |v| v.name == name }
8
+ @root || @vertices.detect { |v| v.ancestors.empty? && v.successors.any? }
11
9
  end
12
10
 
13
- def root=(vertex)
11
+ def root!(vertex)
14
12
  @root = vertex
15
13
  end
14
+
15
+ def find_by(name:)
16
+ @vertices.detect { |v| v.name == name }
17
+ end
16
18
  end
17
19
  end
@@ -1,3 +1,5 @@
1
+ require 'benchmark'
2
+
1
3
  module ChoresKit
2
4
  class Task
3
5
  attr_reader :name
@@ -7,8 +9,25 @@ module ChoresKit
7
9
  @args = args
8
10
  end
9
11
 
12
+ def run
13
+ raise "Task doesn't have any executors" if @callable.nil?
14
+
15
+ puts "Running #{@callable.friendly_name} executor with command #{@callable.command} at #{Time.now}"
16
+
17
+ duration = Benchmark.realtime do
18
+ @callable.run!
19
+ end
20
+
21
+ puts "Took #{Integer(duration * 1000)}ms to run\n\n"
22
+ end
23
+
10
24
  # rubocop:disable Style/MethodMissing
11
25
  def method_missing(name, *args)
26
+ attributes = { callable: args, callee: self }
27
+
28
+ if name == :sh
29
+ @callable = Executors::Shell.new(name, attributes)
30
+ end
12
31
  end
13
32
  # rubocop:enable Style/MethodMissing
14
33
  end
@@ -1,7 +1,29 @@
1
- module Chores
1
+ class Chores
2
+ attr_reader :chore
3
+
2
4
  def self.define(name, &block)
3
5
  proxy = ChoresKit::DefinitionProxy.new(name)
4
6
  proxy.instance_eval(&block) if block_given?
5
7
  proxy.chore
6
8
  end
9
+
10
+ def initialize(filename)
11
+ @chore = instance_eval(File.read(filename))
12
+ end
13
+
14
+ def self.load(filename)
15
+ new(filename).chore
16
+ end
17
+
18
+ def self.load_all
19
+ tasks = Pathname.glob('tasks/**/*.rb')
20
+
21
+ tasks.each do |task_file|
22
+ load(Pathname.pwd + task_file)
23
+ end
24
+ end
25
+
26
+ def run
27
+ @chore.run!
28
+ end
7
29
  end
@@ -0,0 +1,29 @@
1
+ require 'open3'
2
+
3
+ module ChoresKit
4
+ module Executors
5
+ class Shell
6
+ attr_reader :name
7
+
8
+ def initialize(name, attributes)
9
+ @name = name
10
+ @callee = attributes.fetch(:callee)
11
+ @callable = attributes.fetch(:callable)
12
+ end
13
+
14
+ def friendly_name
15
+ 'Shell'
16
+ end
17
+
18
+ def command
19
+ @callable.join(' ')
20
+ end
21
+
22
+ def run!
23
+ output, status = Open3.capture2e(*@callable)
24
+
25
+ raise "Running #{friendly_name} '#{@callable}' failed with status #{status.exitstatus}. Error message: #{output}" unless status.success?
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,3 +1,3 @@
1
1
  module ChoresKit
2
- VERSION = '0.2.4'.freeze
2
+ VERSION = '0.2.5'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chores_kit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lennard Timm
8
8
  autorequire:
9
- bindir: exe
9
+ bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-18 00:00:00.000000000 Z
11
+ date: 2018-04-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: as-duration
@@ -111,7 +111,8 @@ dependencies:
111
111
  description:
112
112
  email:
113
113
  - hi@lenn4rd.io
114
- executables: []
114
+ executables:
115
+ - chores
115
116
  extensions: []
116
117
  extra_rdoc_files: []
117
118
  files:
@@ -124,20 +125,23 @@ files:
124
125
  - LICENSE.txt
125
126
  - README.md
126
127
  - Rakefile
128
+ - bin/chores
127
129
  - bin/console
128
130
  - bin/rake
129
131
  - bin/rspec
130
132
  - bin/rubocop
131
133
  - bin/setup
132
134
  - chores_kit.gemspec
135
+ - examples/rubygems.rb
133
136
  - lib/chores_kit.rb
134
137
  - lib/chores_kit/chore.rb
138
+ - lib/chores_kit/chore/dag.rb
135
139
  - lib/chores_kit/chore/embedded_task.rb
136
140
  - lib/chores_kit/chore/notification.rb
137
141
  - lib/chores_kit/chore/task.rb
138
142
  - lib/chores_kit/chores.rb
139
- - lib/chores_kit/dag/dag.rb
140
143
  - lib/chores_kit/definition_proxy.rb
144
+ - lib/chores_kit/executors/shell.rb
141
145
  - lib/chores_kit/version.rb
142
146
  homepage: https://github.com/lenn4rd/chores_kit
143
147
  licenses: