sweatshop_gears 1.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
+ SHA1:
3
+ metadata.gz: 448c3c917aedf3ea48cea05f90de4007d5f5f96d
4
+ data.tar.gz: a99624061b1511eaeed4cc0b0102bd69af3c74c2
5
+ SHA512:
6
+ metadata.gz: 4e11957930ea0dc7d77cc9e34bba6cfd81338a9eeb133eb2c733fe203c07f5c249aafe3fd600ef2b10369e1b15aea9195ba3cebe9346300c103c98d774576442
7
+ data.tar.gz: b062a744d236c815a0404b3a60c8748c8f896d6ee4558f42027bcc35c7f6a3be132654ba0f259bf47edab782a21da27b8b2cb694474e66346a428c72470c96bc
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ *.gem
2
+ jobs/*.yaml
3
+
4
+ .bundle
5
+ vendor
6
+ coverage
7
+
8
+ .robot_sweatshop
9
+ .test
data/.rubocop.yml ADDED
@@ -0,0 +1,13 @@
1
+ AllCops:
2
+ Exclude:
3
+ - test/**/*
4
+ - vendor/**/*
5
+
6
+ Style/Encoding:
7
+ Enabled: false
8
+
9
+ Metrics/LineLength:
10
+ Max: 80
11
+
12
+ Style/FileName:
13
+ Enabled: false
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'http://rubygems.org'
2
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,111 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ robot_sweatshop-gears (0.0.1)
5
+ bundler
6
+ commander
7
+ contracts
8
+ erubis
9
+ git
10
+ robot_sweatshop
11
+ terminal-announce
12
+
13
+ GEM
14
+ remote: http://rubygems.org/
15
+ specs:
16
+ celluloid (0.15.2)
17
+ timers (~> 1.1.0)
18
+ celluloid-io (0.15.0)
19
+ celluloid (>= 0.15.0)
20
+ nio4r (>= 0.5.0)
21
+ colorize (0.7.7)
22
+ commander (4.3.4)
23
+ highline (~> 1.7.2)
24
+ configatron (4.5.0)
25
+ contracts (0.9)
26
+ daybreak (0.3.0)
27
+ docile (1.1.5)
28
+ erubis (2.7.0)
29
+ exponential-backoff (0.0.2)
30
+ eye (0.6.4)
31
+ celluloid (~> 0.15.0)
32
+ celluloid-io (~> 0.15.0)
33
+ sigar (~> 0.7.2)
34
+ state_machine
35
+ thor
36
+ ezmq (0.4.4)
37
+ ffi-rzmq (~> 2.0)
38
+ faker (1.4.3)
39
+ i18n (~> 0.5)
40
+ ffi (1.9.8)
41
+ ffi-rzmq (2.0.4)
42
+ ffi-rzmq-core (>= 1.0.1)
43
+ ffi-rzmq-core (1.0.3)
44
+ ffi (~> 1.9)
45
+ git (1.2.9.1)
46
+ highline (1.7.2)
47
+ i18n (0.7.0)
48
+ json (1.8.3)
49
+ moneta (0.8.0)
50
+ nio4r (1.1.0)
51
+ oj (2.12.9)
52
+ rack (1.6.1)
53
+ rack-protection (1.5.3)
54
+ rack
55
+ rainbow (2.0.0)
56
+ rake (10.4.2)
57
+ redislike (0.2.5)
58
+ moneta (~> 0.8)
59
+ riot (0.12.7)
60
+ rr
61
+ robot_sweatshop (0.4.3)
62
+ bundler
63
+ colorize
64
+ commander
65
+ configatron
66
+ contracts
67
+ exponential-backoff
68
+ eye
69
+ ezmq
70
+ faker
71
+ oj
72
+ sinatra
73
+ sinatra-cross_origin
74
+ stubborn_queue
75
+ rr (1.1.2)
76
+ sigar (0.7.3)
77
+ simplecov (0.10.0)
78
+ docile (~> 1.1.0)
79
+ json (~> 1.8)
80
+ simplecov-html (~> 0.10.0)
81
+ simplecov-html (0.10.0)
82
+ sinatra (1.4.6)
83
+ rack (~> 1.4)
84
+ rack-protection (~> 1.4)
85
+ tilt (>= 1.3, < 3)
86
+ sinatra-cross_origin (0.3.2)
87
+ state_machine (1.2.0)
88
+ stubborn_queue (1.1.0)
89
+ bundler
90
+ daybreak
91
+ moneta
92
+ redislike
93
+ terminal-announce (1.0.0)
94
+ bundler
95
+ contracts
96
+ rainbow
97
+ thor (0.19.1)
98
+ tilt (2.0.1)
99
+ timers (1.1.0)
100
+
101
+ PLATFORMS
102
+ ruby
103
+
104
+ DEPENDENCIES
105
+ rake
106
+ riot
107
+ robot_sweatshop-gears!
108
+ simplecov
109
+
110
+ BUNDLED WITH
111
+ 1.10.2
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Justin Scott
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
data/README.md ADDED
@@ -0,0 +1,10 @@
1
+ # sweatshop-gears-cli
2
+
3
+ Package management for [Robot Sweatshop](https://github.com/JScott/robot_sweatshop) scripts.
4
+
5
+ `sweatshop gears <package-name>`
6
+
7
+ ## Future
8
+
9
+ - More metadata (author, description)
10
+ - Source from custom repo
data/Rakefile ADDED
@@ -0,0 +1,23 @@
1
+ require 'rake'
2
+
3
+ task :test do
4
+ `sweatshop stop`
5
+ $stdout.sync = true
6
+ puts "sweatshop-gears"
7
+ IO.popen "bats #{__dir__}/test --pretty" do |file|
8
+ until file.eof?
9
+ puts file.gets
10
+ end
11
+ end
12
+ end
13
+
14
+ task :build do
15
+ print 'Building and installing local gem..'
16
+ `gem build sweatshop-gears.gemspec --force`
17
+ print '.'
18
+ `gem install robot_sweatshop-gears-*.gem`
19
+ puts 'Done.'
20
+ end
21
+
22
+ task :default => :test
23
+ task :test => :build
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+ require 'yaml'
3
+ require 'commander/import'
4
+ require 'robot_sweatshop/gears'
5
+
6
+ program :name, 'Sweatshop Gears'
7
+ program :version, '1.0.1'
8
+ program :description, 'Package management for Robot Sweatshop'
9
+ program :help, 'Author', 'Justin Scott <jvscott@gmail.com>'
10
+
11
+ default_command :help
12
+
13
+ command :init do |c|
14
+ c.syntax = 'sweatshop-gears init'
15
+ c.description = 'Makes the Gears packages available to Robot Sweatshop'
16
+ c.option '--path STRING', String, 'The working path for downloading packages'
17
+ c.action do |args, options|
18
+ options.default :path => '/opt/gears'
19
+ Gears.download to_path: options.path
20
+ Gears::Dependencies.install from_path: options.path
21
+ Gears::Binaries.expose from_path: options.path
22
+ Gears::Services.load from_path: options.path
23
+ end
24
+ end
@@ -0,0 +1,4 @@
1
+ require_relative 'gears/base'
2
+ require_relative 'gears/dependencies'
3
+ require_relative 'gears/binaries'
4
+ require_relative 'gears/services'
@@ -0,0 +1,27 @@
1
+ require 'git'
2
+ require 'yaml'
3
+
4
+ module Gears
5
+ def self.clone_packages(path)
6
+ Git.clone git_repo, File.basename(path), path: File.dirname(path)
7
+ end
8
+
9
+ def self.git_repo
10
+ 'https://github.com/JScott/sweatshop-gears-packages.git'
11
+ end
12
+
13
+ def self.download(to_path:)
14
+ puts "Downloading packages from '#{git_repo}'"
15
+ clone_packages to_path
16
+ Announce.success 'Packages downloaded'
17
+ end
18
+
19
+ def self.packages(path)
20
+ paths = Dir["#{path}/*"].select { |path| File.directory? path }
21
+ paths.map { |path| File.expand_path path }
22
+ end
23
+
24
+ def self.metadata(path)
25
+ YAML.load File.read("#{path}/metadata.yaml")
26
+ end
27
+ end
@@ -0,0 +1,36 @@
1
+ require 'fileutils'
2
+ require 'terminal-announce'
3
+
4
+ module Gears
5
+ module Binaries
6
+ def self.expose(from_path:)
7
+ Gears.packages(from_path).each do |package|
8
+ link package if contains_binary? package
9
+ end
10
+ end
11
+
12
+ def self.contains_binary?(package_path)
13
+ metadata = Gears.metadata package_path
14
+ metadata['type'] == 'binary'
15
+ end
16
+
17
+ def self.link(package_path)
18
+ binary_name = File.basename package_path
19
+ original_binary = "#{package_path}/#{binary_name}"
20
+ binary_link = "#{scripts_path}/#{binary_name}"
21
+ begin
22
+ FileUtils.symlink original_binary, binary_link
23
+ Announce.success "Symlinked #{binary_name}"
24
+ rescue
25
+ Announce.warning "#{binary_name} already exists"
26
+ end
27
+ end
28
+
29
+ def self.scripts_path
30
+ sweatshop_config = '/tmp/.robot_sweatshop-eye-config.yaml'
31
+ Announce.failure 'Please run `sweatshop start` again' unless File.exists? sweatshop_config
32
+ config = YAML.load File.read(sweatshop_config)
33
+ config[:scripts_path]
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,18 @@
1
+ require 'terminal-announce'
2
+ require 'bundler/cli'
3
+
4
+ module Gears
5
+ module Dependencies
6
+ def self.install(from_path:)
7
+ Gears.packages(from_path).each { |path| install_gems path }
8
+ end
9
+
10
+ def self.install_gems(package_path)
11
+ gemfile = "#{package_path}/Gemfile"
12
+ return unless File.exist? gemfile
13
+ name = File.basename(package_path).split('/').last
14
+ Announce.info "Installing gems for #{name}"
15
+ system "bundle install --gemfile #{gemfile}"
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,34 @@
1
+ require 'fileutils'
2
+ require 'terminal-announce'
3
+ require 'erubis'
4
+
5
+ module Gears
6
+ module Services
7
+ def self.load(from_path:)
8
+ packages = Gears.packages(from_path).select { |package| contains_service? package }
9
+ services = packages.map { |package| File.basename package }
10
+ dynamically_load_eye services, from_path
11
+ services.each { |service| Announce.success "Loaded #{service} into Eye" }
12
+ end
13
+
14
+ def self.contains_service?(package_path)
15
+ metadata = Gears.metadata package_path
16
+ metadata['type'] == 'service'
17
+ end
18
+
19
+ def self.write_and_load(eye_config)
20
+ eye_file = '/tmp/.sweatshop_gears.eye'
21
+ File.write eye_file, eye_config
22
+ puts `eye load #{eye_file}`
23
+ puts `eye stop sweatshop_gears`
24
+ File.delete eye_file
25
+ end
26
+
27
+ def self.dynamically_load_eye(service_list, gears_path)
28
+ input = File.read "#{__dir__}/sweatshop_gears.eye.eruby"
29
+ eruby = Erubis::Eruby.new input
30
+ context = { services: service_list, gears_path: File.expand_path(gears_path) }
31
+ write_and_load eruby.result(context)
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,26 @@
1
+ require 'yaml'
2
+
3
+ # TODO: config not guaranteed to be there. sweatshop has to run first
4
+ # TODO: per-user temp file
5
+ CONFIG = YAML.load_file '/tmp/.robot_sweatshop-eye-config.yaml'
6
+ PID_PATH = CONFIG[:pidfile_path]
7
+ LOG_PATH = CONFIG[:logfile_path]
8
+
9
+ Eye.config do
10
+ logger "#{CONFIG[:logfile_path]}/eye.log"
11
+ end
12
+
13
+ Eye.application :sweatshop_gears do
14
+ trigger :flapping, times: 10, within: 1.minute, retry_in: 10.minutes
15
+ check :cpu, every: 10.seconds, below: 100, times: 3
16
+ working_dir CONFIG[:working_path]
17
+
18
+ <% for service in services %>
19
+ process :'<%= service %>' do
20
+ pid_file "#{PID_PATH}/gears/<%= service %>.pid"
21
+ stdall "#{LOG_PATH}/gears/<%= service %>.log"
22
+ start_command "<%= gears_path %>/<%= service %>/<%= service %>"
23
+ daemonize true
24
+ end
25
+ <% end %>
26
+ end
@@ -0,0 +1,29 @@
1
+ Gem::Specification.new do |gem|
2
+ gem.name = 'sweatshop_gears'
3
+ gem.version = '1.0.1'
4
+ gem.licenses = 'MIT'
5
+ gem.authors = ['Justin Scott']
6
+ gem.email = 'jvscott@gmail.com'
7
+ gem.homepage = 'http://www.github.com/jscott/sweatshop-gears-cli/'
8
+ gem.summary = 'Package management for Robot Sweatshop'
9
+ gem.description = gem.summary
10
+
11
+ gem.files = `git ls-files`.split("\n")
12
+ gem.test_files = `git ls-files -- test/**/*`.split("\n")
13
+ gem.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
14
+ gem.require_paths = ['lib']
15
+
16
+ gem.required_ruby_version = '>= 2.1'
17
+
18
+ gem.add_runtime_dependency 'bundler'
19
+ gem.add_runtime_dependency 'commander'
20
+ gem.add_runtime_dependency 'robot_sweatshop'
21
+ gem.add_runtime_dependency 'contracts'
22
+ gem.add_runtime_dependency 'terminal-announce'
23
+ gem.add_runtime_dependency 'git'
24
+ gem.add_runtime_dependency 'erubis'
25
+
26
+ gem.add_development_dependency 'rake'
27
+ gem.add_development_dependency 'riot'
28
+ gem.add_development_dependency 'simplecov'
29
+ end
data/test/cli.bats ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env bats
2
+
3
+ # gem build sweatshop-gears.gemspec --quiet
4
+ # gem install robot_sweatshop-gears-*.gem
5
+
6
+ @test "Runs" {
7
+ run sweatshop-gears
8
+ [ $status = 0 ]
9
+ }
data/test/init.bats ADDED
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env bats
2
+
3
+ @test "Downloads the Gears packages" {
4
+ run sweatshop-gears init --path .test_download_path
5
+ [ -f .test_download_path/README.md ]
6
+ }
7
+
8
+ @test "Exposes package binaries" {
9
+ run sweatshop-gears init --path .test_download_path
10
+ scripts_path=.robot_sweatshop/scripts
11
+ [ -f $scripts_path/git-sync ]
12
+ }
13
+
14
+ @test "Doesn't expose services" {
15
+ run sweatshop-gears init --path .test_download_path
16
+ scripts_path=.robot_sweatshop/scripts
17
+ [ ! -f $scripts_path/big-green-button ]
18
+ }
19
+
20
+ @test "Loads services into Eye" {
21
+ eye stop big-green-button
22
+ run sweatshop-gears init --path .test_download_path
23
+ eye start big-green-button
24
+ sleep 3
25
+ [[ $(eye info | grep big-green-button) =~ up ]]
26
+ }
27
+
28
+ @test "Installs dependencies" {
29
+ skip "I need a gem to be installed that isn't used by Sweatshop or Gears"
30
+ yes | gem uninstall SOME_GEM --all
31
+ sweatshop-gears init --path .test_download_path
32
+ [[ $(gem list) =~ "SOME_GEM " ]]
33
+ }
34
+
35
+ teardown() {
36
+ rm -rf .test_download_path
37
+ }
metadata ADDED
@@ -0,0 +1,202 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sweatshop_gears
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Justin Scott
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-06-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
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: commander
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: robot_sweatshop
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: contracts
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: terminal-announce
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: git
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: erubis
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rake
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: riot
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: simplecov
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description: Package management for Robot Sweatshop
154
+ email: jvscott@gmail.com
155
+ executables:
156
+ - sweatshop-gears
157
+ extensions: []
158
+ extra_rdoc_files: []
159
+ files:
160
+ - ".gitignore"
161
+ - ".rubocop.yml"
162
+ - Gemfile
163
+ - Gemfile.lock
164
+ - LICENSE
165
+ - README.md
166
+ - Rakefile
167
+ - bin/sweatshop-gears
168
+ - lib/robot_sweatshop/gears.rb
169
+ - lib/robot_sweatshop/gears/base.rb
170
+ - lib/robot_sweatshop/gears/binaries.rb
171
+ - lib/robot_sweatshop/gears/dependencies.rb
172
+ - lib/robot_sweatshop/gears/services.rb
173
+ - lib/robot_sweatshop/gears/sweatshop_gears.eye.eruby
174
+ - sweatshop_gears.gemspec
175
+ - test/cli.bats
176
+ - test/init.bats
177
+ homepage: http://www.github.com/jscott/sweatshop-gears-cli/
178
+ licenses:
179
+ - MIT
180
+ metadata: {}
181
+ post_install_message:
182
+ rdoc_options: []
183
+ require_paths:
184
+ - lib
185
+ required_ruby_version: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - ">="
188
+ - !ruby/object:Gem::Version
189
+ version: '2.1'
190
+ required_rubygems_version: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ requirements: []
196
+ rubyforge_project:
197
+ rubygems_version: 2.4.5
198
+ signing_key:
199
+ specification_version: 4
200
+ summary: Package management for Robot Sweatshop
201
+ test_files: []
202
+ has_rdoc: