drydocker 0.1.5 → 0.1.6

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
  SHA1:
3
- metadata.gz: 2087edb0fea5b7cd272581650bf518a62e0f3cf4
4
- data.tar.gz: dbcb288e04130111067a590580cfed6138ecc236
3
+ metadata.gz: 0f60acdab6aa7f2bde922bd50bfb390dd39f7a3f
4
+ data.tar.gz: b16eea66d98f207632ff9a89c0aa531612f936ed
5
5
  SHA512:
6
- metadata.gz: a3e280418b00facbd62f2cc531be552c9c2dd430c7d15e8c883e0f806d30035ce0fb463454a432f7e5bdf34a2855c354dd41b0d226b9b5780685a880eda55de8
7
- data.tar.gz: 2890bd0c906e74e463838b10d149d2fe5f539a01a8a682634dfccdf37091c39c99ead52ee4813ec94a4d4da2d4f7e3f78afee34a3b3917784296186c579156ee
6
+ metadata.gz: 5950ef61f6030f8fa7262b8ab467018dbad8a2a030e159daa4c291a85f95f61f49452287ac418953f75a7c0191f5004b84057c24a6b7930215d9e4dcba0180bd
7
+ data.tar.gz: 6f6783c43f809a379d928a5c96f6ef5c446599b2474fb4f6b4d33c03dd564f303031450ea00b775220ee052e1098bd5ad5a7cc2d127e518b1ec9232e2c01254b
data/.dockerignore ADDED
@@ -0,0 +1,2 @@
1
+ .git
2
+ pkg
data/README.md CHANGED
@@ -2,7 +2,10 @@
2
2
 
3
3
  [![wercker status](https://app.wercker.com/status/b00d4339862ef12b880f0022b6d20b2a/s "wercker status")](https://app.wercker.com/project/bykey/b00d4339862ef12b880f0022b6d20b2a)
4
4
 
5
- A project to provide a simple continuous testing tool.
5
+ Drydocker provides a simple wrapper to run tests inside a container every
6
+ time you make a change to your code. It listens to filesystem changes on your
7
+ host and runs a docker command every time it detects anything. It is a
8
+ pre-requisite of use that you have a docker image you can run your tests in.
6
9
 
7
10
  ## Installation
8
11
 
@@ -36,7 +39,7 @@ the output of `drydocker -h` for more information on the flags to use.
36
39
  ## Links
37
40
 
38
41
  * Source code: https://github.com/silarsis/drydocker
39
- * Build/Test: https://app.wercker.com/status/b00d4339862ef12b880f0022b6d20b2a/s
42
+ * Build/Test: https://app.wercker.com/#applications/54b446f6da3a4af764100e91
40
43
  * Docker container: https://registry.hub.docker.com/u/silarsis/drydocker/
41
44
  * RubyGem: https://rubygems.org/gems/drydocker
42
45
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.5
1
+ 0.1.6
data/bin/drydocker CHANGED
@@ -5,49 +5,47 @@ require 'optparse'
5
5
 
6
6
  # Command line parser to setup options
7
7
  # :name, :command, :image, :entrypoint, :path
8
- class DrydockerOptions
9
- def self.parse(args)
10
- options = Drydocker::Config.default_config
11
-
12
- opt_parser = OptionParser.new do |opts|
13
- opts.banner = 'Usage: drydocker [options]'
14
- opts.separator ''
15
- opts.separator 'Specific options:'
16
-
17
- opts.on('-f', '--filename [FILENAME]', 'File of options to load') do |fn|
18
- options.load(fn)
19
- end
20
-
21
- opts.on('-n', '--name [NAME]') do |name|
22
- options[:name] = name
23
- end
24
-
25
- opts.on('-c', '--command [COMMAND]') do |cmd|
26
- options[:command] = cmd
27
- end
28
-
29
- opts.on('-i', '--image [IMAGE]') do |img|
30
- options[:image] = img
31
- end
32
-
33
- opts.on('-e', '--entrypoint [ENTRYPOINT]') do |entry|
34
- options[:entrypoint] = entry
35
- end
36
-
37
- opts.on('-p', '--path [PATH]') do |path|
38
- options[:path] = path
39
- end
40
-
41
- opts.on('-v', '--[no-]verbose') do |verbose|
42
- options[:verbose] = verbose
43
- end
8
+ def parse(args)
9
+ options = Drydocker::Config.default_config
10
+
11
+ opt_parser = OptionParser.new do |opts|
12
+ opts.banner = 'Usage: drydocker [options]'
13
+ opts.separator ''
14
+ opts.separator 'Specific options:'
15
+
16
+ opts.on('-f', '--filename [FILENAME]', 'File of options to load') do |fn|
17
+ options.load(fn)
18
+ end
19
+
20
+ opts.on('-n', '--name [NAME]', 'Container name to run tests in, default "<imagename>-test"') do |name|
21
+ options[:name] = name
22
+ end
23
+
24
+ opts.on('-c', '--command [COMMAND]', "command to run, default '#{options[:command]}'") do |cmd|
25
+ options[:command] = cmd
26
+ end
27
+
28
+ opts.on('-i', '--image [IMAGE]', "image to run for testing, default '#{options[:image]}'") do |img|
29
+ options[:image] = img
30
+ end
31
+
32
+ opts.on('-e', '--entrypoint [ENTRYPOINT]', 'entrypoint in case you need to override that, default nil') do |entry|
33
+ options[:entrypoint] = entry
34
+ end
35
+
36
+ opts.on('-p', '--path [PATH]', "directory to monitor and mount for testing, default '#{options[:path]}'") do |path|
37
+ options[:path] = path
38
+ end
39
+
40
+ opts.on('-v', '--[no-]verbose', 'verbose output') do |verbose|
41
+ options[:verbose] = verbose
44
42
  end
45
- opt_parser.parse!(args)
46
- options
47
43
  end
44
+ opt_parser.parse!(args)
45
+ options
48
46
  end
49
47
 
50
- options = DrydockerOptions.parse(ARGV)
48
+ options = parse(ARGV)
51
49
  config = Drydocker::Config.new(options)
52
50
  monitor = Drydocker::Monitor.new(config)
53
51
  monitor.clean_containers
data/drydocker.gemspec CHANGED
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: drydocker 0.1.5 ruby lib
5
+ # stub: drydocker 0.1.6 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "drydocker"
9
- s.version = "0.1.5"
9
+ s.version = "0.1.6"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
13
13
  s.authors = ["Kevin Littlejohn"]
14
- s.date = "2015-01-13"
14
+ s.date = "2015-01-14"
15
15
  s.description = "Run tests on change in a docker container continuously"
16
16
  s.email = "kevin@littlejohn.id.au"
17
17
  s.executables = ["drydocker"]
@@ -20,6 +20,7 @@ Gem::Specification.new do |s|
20
20
  "README.md"
21
21
  ]
22
22
  s.files = [
23
+ ".dockerignore",
23
24
  ".document",
24
25
  ".rubocop.yml",
25
26
  "Dockerfile",
@@ -34,8 +35,6 @@ Gem::Specification.new do |s|
34
35
  "lib/drydocker.rb",
35
36
  "spec/drydocker_spec.rb",
36
37
  "spec/spec_helper.rb",
37
- "test/helper.rb",
38
- "test/test_loop_test.rb",
39
38
  "wercker.yml"
40
39
  ]
41
40
  s.homepage = "http://github.com/silarsis/drydocker"
data/lib/drydocker.rb CHANGED
@@ -1,10 +1,12 @@
1
1
  require 'listen'
2
2
  require 'ptools'
3
+ require 'logger'
4
+ require 'shellwords'
3
5
 
4
6
  module Drydocker
5
7
  # Configuration file reader
6
8
  class Config
7
- attr_reader :name, :command, :image, :entrypoint, :path, :verbose
9
+ attr_reader :name, :command, :image, :entrypoint, :path, :verbose, :logger
8
10
 
9
11
  def self.default_config
10
12
  {
@@ -22,9 +24,10 @@ module Drydocker
22
24
  @image = config[:image]
23
25
  @name = config[:name] || name_from_image
24
26
  @entrypoint = config[:entrypoint]
25
- @command = config[:command]
27
+ @command = config[:command].shellescape
26
28
  @path = config[:path]
27
- @verbose = config[:verbose]
29
+ @logger = Logger.new(STDERR)
30
+ @logger.level = Logger::DEBUG if config[:verbose]
28
31
  end
29
32
 
30
33
  private
@@ -44,17 +47,17 @@ module Drydocker
44
47
 
45
48
  def listen
46
49
  listener = Listen.to(config.path) do |modified, added, removed|
47
- puts "triggering change: #{modified + added + removed}"
50
+ config.logger.info("triggering change: #{modified + added + removed}")
48
51
  run_or_start
49
52
  end
50
53
  listener.start # not blocking
51
- puts 'now listening'
54
+ config.logger.info('now listening')
52
55
  end
53
56
 
54
57
  def clean_containers
55
58
  fail 'No docker found' if File.which('docker').nil?
56
- return unless `docker ps | grep #{config.name}`
57
- puts 'cleaning up previous containers' if config.verbose
59
+ return unless system(docker_check_cmd)
60
+ config.logger.debug('cleaning up previous containers')
58
61
  `docker kill #{config.name}`
59
62
  `docker rm #{config.name}`
60
63
  end
@@ -64,7 +67,7 @@ module Drydocker
64
67
  def docker_run_cmd
65
68
  %W(
66
69
  #{docker_cmd} #{name_opt} #{path_opt} #{entrypoint_opt} #{config.image}
67
- #{command}
70
+ sh -c #{command}
68
71
  ).reject { |x| x == '' }.join(' ')
69
72
  end
70
73
 
@@ -77,7 +80,7 @@ module Drydocker
77
80
  end
78
81
 
79
82
  def docker_cmd
80
- 'docker run -it'
83
+ 'docker run -it -w /app'
81
84
  end
82
85
 
83
86
  def name_opt
@@ -85,7 +88,7 @@ module Drydocker
85
88
  end
86
89
 
87
90
  def entrypoint_opt
88
- config.entrypoint.nil? ? '' : "--entrypoint #{config.entrypoint}"
91
+ config.entrypoint.nil? ? '' : "--entrypoint #{config.entrypoint.shellescape}"
89
92
  end
90
93
 
91
94
  def path_opt
@@ -97,12 +100,12 @@ module Drydocker
97
100
  end
98
101
 
99
102
  def run
100
- puts docker_run_cmd if config.verbose
103
+ config.logger.debug(docker_run_cmd)
101
104
  system(docker_run_cmd)
102
105
  end
103
106
 
104
107
  def start
105
- puts docker_start_cmd if config.verbose
108
+ config.logger.debug(docker_start_cmd)
106
109
  system(docker_start_cmd)
107
110
  end
108
111
 
@@ -1,5 +1,6 @@
1
1
  require 'spec_helper'
2
2
  require 'drydocker'
3
+ require 'shellwords'
3
4
 
4
5
  # Tests for the main module
5
6
  module Drydocker
@@ -9,7 +10,7 @@ module Drydocker
9
10
  specify { expect(config.name).to eq 'silarsis-drydocker-test' }
10
11
  specify { expect(config.entrypoint).to be_nil }
11
12
  specify { expect(config.image).to eq 'silarsis/drydocker' }
12
- specify { expect(config.command).to eq 'rspec spec' }
13
+ specify { expect(config.command).to eq 'rspec spec'.shellescape }
13
14
  end
14
15
  context 'with provide value for' do
15
16
  context 'name' do
@@ -40,7 +41,7 @@ module Drydocker
40
41
  end
41
42
 
42
43
  describe Monitor do
43
- let(:config) { Config.new }
44
+ let(:config) { Config.new(name: 'spec-container') }
44
45
  let(:monitor) { Monitor.new(config) }
45
46
 
46
47
  describe '#monitor' do
@@ -49,7 +50,7 @@ module Drydocker
49
50
  .with("docker ps -a | grep #{config.name} >/dev/null") \
50
51
  .and_return false
51
52
  expect(monitor).to receive(:system) \
52
- .with("docker run -it --name #{config.name} -v #{config.path}:/app #{config.image} #{config.command}") \
53
+ .with("docker run -it -w /app --name #{config.name} -v #{config.path}:/app #{config.image} sh -c #{config.command}") \
53
54
  .and_return true
54
55
  monitor.send(:run_or_start)
55
56
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: drydocker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Littlejohn
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-13 00:00:00.000000000 Z
11
+ date: 2015-01-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: listen
@@ -145,6 +145,7 @@ extra_rdoc_files:
145
145
  - LICENSE.txt
146
146
  - README.md
147
147
  files:
148
+ - ".dockerignore"
148
149
  - ".document"
149
150
  - ".rubocop.yml"
150
151
  - Dockerfile
@@ -159,8 +160,6 @@ files:
159
160
  - lib/drydocker.rb
160
161
  - spec/drydocker_spec.rb
161
162
  - spec/spec_helper.rb
162
- - test/helper.rb
163
- - test/test_loop_test.rb
164
163
  - wercker.yml
165
164
  homepage: http://github.com/silarsis/drydocker
166
165
  licenses:
data/test/helper.rb DELETED
@@ -1,34 +0,0 @@
1
- require 'simplecov'
2
-
3
- module SimpleCov::Configuration
4
- def clean_filters
5
- @filters = []
6
- end
7
- end
8
-
9
- SimpleCov.configure do
10
- clean_filters
11
- load_adapter 'test_frameworks'
12
- end
13
-
14
- ENV["COVERAGE"] && SimpleCov.start do
15
- add_filter "/.rvm/"
16
- end
17
- require 'rubygems'
18
- require 'bundler'
19
- begin
20
- Bundler.setup(:default, :development)
21
- rescue Bundler::BundlerError => e
22
- $stderr.puts e.message
23
- $stderr.puts "Run `bundle install` to install missing gems"
24
- exit e.status_code
25
- end
26
- require 'test/unit'
27
- require 'shoulda'
28
-
29
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
30
- $LOAD_PATH.unshift(File.dirname(__FILE__))
31
- require 'drydocker'
32
-
33
- class Test::Unit::TestCase
34
- end
@@ -1,7 +0,0 @@
1
- require 'helper'
2
-
3
- class TestDrydocker < Test::Unit::TestCase
4
- should "probably rename this file and start testing for real" do
5
- flunk "hey buddy, you should probably rename this file and start testing for real"
6
- end
7
- end