docker-porcelain 0.2.0 → 0.3.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
  SHA1:
3
- metadata.gz: ae92c062667eac697e5f18d3d950afb557b21130
4
- data.tar.gz: 9967f41c870b65dd7f0b04af016bb2b939ebf654
3
+ metadata.gz: 9abf4d5591b1dc167a974d44a7b585ee079775a3
4
+ data.tar.gz: a8e2a32ad64087d40f19be336350c26652662ccc
5
5
  SHA512:
6
- metadata.gz: 76b59a8f1c8a423833fbc651a654cdc714ee6c96b7260e2cffa23ab4d124a92917dc42301c002d82a982a2514655b001d99a74126b5296a93f8098030910316b
7
- data.tar.gz: 5239179b59df5a826dfa776348826aa4ce6afbff5a2257f3624309083a9749362ff1253c64c6a57beb41928dcb50d0f540ce65697e4d2dc9b1b765a0d9279370
6
+ metadata.gz: 50f831bddf3502bf4e9684245d24e6c9437122aff4cc318b18d514dd3765fc04fbf05a32a39f937355f56ee2950b648ee89046005719770f09a7bf8cd8777ba7
7
+ data.tar.gz: e32d4a549030bee551c600aaf0118dcd6cc005158fe20d9333628758b26a4674c7f84b6c87dffc23180815f1de1e2b19623c2d8ac48ebcc5fb2f0c82a2515c60
data/.overcommit.yml CHANGED
@@ -1,32 +1,4 @@
1
- # Use this file to configure the Overcommit hooks you wish to use. This will
2
- # extend the default configuration defined in:
3
- # https://github.com/brigade/overcommit/blob/master/config/default.yml
4
- #
5
- # At the topmost level of this YAML file is a key representing type of hook
6
- # being run (e.g. pre-commit, commit-msg, etc.). Within each type you can
7
- # customize each hook, such as whether to only run it on certain files (via
8
- # `include`), whether to only display output if it fails (via `quiet`), etc.
9
- #
10
- # For a complete list of hooks, see:
11
- # https://github.com/brigade/overcommit/tree/master/lib/overcommit/hook
12
- #
13
- # For a complete list of options that you can use to customize hooks, see:
14
- # https://github.com/brigade/overcommit#configuration
15
- #
16
- # Uncomment the following lines to make the configuration take effect.
17
-
18
- #PreCommit:
19
- # RuboCop:
20
- # enabled: true
21
- # on_warn: fail # Treat all warnings as failures
22
- #
23
- # TrailingWhitespace:
24
- # exclude:
25
- # - '**/db/structure.sql' # Ignore trailing whitespace in generated files
26
- #
27
- #PostCheckout:
28
- # ALL: # Special hook name that customizes all hooks of this type
29
- # quiet: true # Change all post-checkout hooks to only display output on failure
30
- #
31
- # IndexTags:
32
- # enabled: true # Generate a tags file with `ctags` each time HEAD changes
1
+ PreCommit:
2
+ RuboCop:
3
+ enabled: true
4
+ problem_on_unmodified_line: warn
data/.rubocop.yml ADDED
@@ -0,0 +1,10 @@
1
+ Style/MethodDefParentheses:
2
+ EnforcedStyle: require_no_parentheses
3
+
4
+ Style/MultilineOperationIndentation:
5
+ # it insists on two spaces, I like four
6
+ Enabled: false
7
+
8
+ Style/AndOr:
9
+ # I use them for good reason
10
+ Enabled: false
data/README.md CHANGED
@@ -67,9 +67,15 @@ container.write '/tmp/foo', 'This is the foo file!'
67
67
  ```ruby
68
68
  container.write '/tmp/foo', 'This is the foo file!'
69
69
  container.system 'true' or fail "there's no truth in the container!"
70
+ uptime = container.` 'uptime'
71
+ container.delete! # force destroy
72
+
70
73
  img = Docker::Image['image:tag'] # => #<Docker::Image:...>
71
74
  img.tags # => ['image:tag', 'other:tag']
72
- Docker::Image.repository 'image' # => #<Docker::Image:...>
75
+ img.parent # => #<Docker::Image:...>
76
+ img.tag 'repo', 'tag'
77
+
78
+ Docker::Image.repository 'image' # => [#<Docker::Image:...>, ...]
73
79
  ```
74
80
 
75
81
  ## Development
@@ -1,10 +1,15 @@
1
1
  require 'docker/porcelain/error'
2
2
 
3
+ # rubocop:disable Style/OpMethod
4
+ # rubocop:disable Style/RedundantSelf
5
+ # rubocop:disable Style/Alias
6
+
3
7
  module Docker
4
8
  module Porcelain
5
9
  module Container
6
- # Writes to a file in the container
7
- # @note Executes `tee` internally, which has to be available inside the container.
10
+ # Write to a file in the container
11
+ # @note Executes +tee+ internally, which has to be available inside the
12
+ # container.
8
13
  # @param path [String] full path of the file to write
9
14
  # @param content [String] data to be written
10
15
  # @return [Fixnum] number of bytes written
@@ -20,13 +25,39 @@ module Docker
20
25
  end
21
26
  end
22
27
 
28
+ # Execute a command in the container, returning the output
29
+ # @param [String] command the command line to execute,
30
+ # passed to +/bin/sh -c+
31
+ # @return [String] the standard output
32
+ # @raise (Docker::Porcelain::CommandError) if there's a problem executing
33
+ # the command (ie. the shell returns 127)
34
+ # @note The exit code is available in {#last_exitstatus}.
35
+ # @see #system
36
+ def ` command
37
+ # unweird syntax highlighters: `
38
+ stdout, stderr, status = self.exec ['/bin/sh', '-c', command]
39
+ case @last_exitstatus = status
40
+ when 127
41
+ fail CommandError, stderr.join
42
+ else
43
+ stdout.join
44
+ end
45
+ end
46
+
47
+ alias backtick ` # `
48
+
49
+ # Execute a command in the container, discarding the output
23
50
  # @overload system(command...)
24
- # Executes a command in a container
25
- # @param [String, Array<String>] command to execute.
26
- # A single string is passed to '/bin/sh -c' for execution.
27
- # @return [true, false, nil] true if the command gives zero exit status,
28
- # false for non zero exit status, nil if command execution fails.
29
- # @note The exit code is available in {.last_exitstatus}.
51
+ # @param [String] command the command line to execute;
52
+ # passed to +/bin/sh -c+
53
+ # @param [String...] command... the command to execute and its arguments
54
+ # @return [true] if the command exits with zero exit status.
55
+ # @return [false] if the command exits with a nonzero status.
56
+ # @return [nil] if the command execution fails.
57
+ # @note The exit code is available in {#last_exitstatus}.
58
+ # @see #`
59
+ # @raise [NotImplementedError] if the argument list contains options
60
+ # or environments (as allowed by {Kernel#system}).
30
61
  def system *args
31
62
  env = args.shift if args.first.is_a? Hash
32
63
  opts = args.pop if args.last.is_a? Hash
@@ -36,7 +67,7 @@ module Docker
36
67
  raise NotImplementedError, "setting env or opts is not implemented" \
37
68
  if [env, opts].any?
38
69
 
39
- raise NotImplementedError, "overringing argv0 is not implemented" \
70
+ fail NotImplementedError, 'overriding argv0 is not implemented' \
40
71
  if cmdline.first.is_a? Array
41
72
 
42
73
  if cmdline.length == 1
@@ -45,7 +76,6 @@ module Docker
45
76
 
46
77
  _stdout, _stderr, status = self.exec cmdline
47
78
 
48
- # 'simulate' exit status in $?
49
79
  @last_exitstatus = status
50
80
 
51
81
  case status
@@ -56,7 +86,14 @@ module Docker
56
86
  end
57
87
  end
58
88
 
59
- # Exit status of the last command ran with {#system}
89
+ # Force delete a container (even if it is running)
90
+ # @return [void]
91
+ def delete!
92
+ delete force: true
93
+ end
94
+
95
+ # @return [Fixnum] exit status of the last command ran with {#system}
96
+ # or {#`}
60
97
  attr_reader :last_exitstatus
61
98
  end
62
99
  end
@@ -10,7 +10,8 @@ module Docker
10
10
  end
11
11
 
12
12
  class Image
13
- include Docker::Porcelain::Image
13
+ prepend Docker::Porcelain::Image
14
+ extend Docker::Porcelain::Image::ClassMethods
14
15
  end
15
16
  end
16
17
 
@@ -21,14 +21,55 @@ module Docker
21
21
 
22
22
  # @return [Array<String>] repository tags of the image
23
23
  def tags
24
+ # Image can have incomplete info, refresh then
25
+ refresh! unless info['RepoTags']
26
+
24
27
  # docker returns '<none>:<none>' for an untagged repo
25
28
  info['RepoTags'] - ['<none>:<none>']
26
29
  end
27
30
 
31
+ # @return [Docker::Image] the parent image
32
+ # @return [nil] if the image is +FROM scratch+
33
+ def parent
34
+ return nil if (parent = info['Parent']).empty?
35
+ Docker::Porcelain::Image[parent]
36
+ end
37
+
38
+ # Tag the image
39
+ # @overload tag(repo, tag, opts)
40
+ # @param [String] repo the repository to tag in
41
+ # @param [String] tag the new tag
42
+ # @option opts [Boolean] force whether to replace the tag if it
43
+ # already exists
44
+ # @overload tag(repo_tag, opts)
45
+ # @param [String] repo_tag the repository to tag in with optional tag;
46
+ # in 'repo:tag' or 'repo' format
47
+ # @option opts [Boolean] force whether to replace the tag if it
48
+ # already exists
49
+ # @overload tag(opts)
50
+ # @option opts [String] repo the repository to tag in
51
+ # @option opts [String] tag the new tag
52
+ # @option opts [Boolean] force whether to replace the tag if it
53
+ # already exists
54
+ # @return [void]
55
+ def tag *args
56
+ strargs, rest = args.partition { |arg| arg.respond_to? :to_str }
57
+
58
+ # rest should be [opts] or empty
59
+ rest.length < 2 or
60
+ fail ArgumentError, 'expected args: [repo [tag]] [options]'
61
+ opts = rest.first || {}
62
+
63
+ super opts.merge Image.repo_tag_to_hash *strargs
64
+ end
65
+
28
66
  extend ClassMethods
29
67
 
30
- def self.included other
31
- other.extend ClassMethods
68
+ private
69
+
70
+ def self.repo_tag_to_hash repo = nil, tag = nil
71
+ repo, tag = repo.split ':' unless tag
72
+ { 'repo' => repo, 'tag' => tag }
32
73
  end
33
74
  end
34
75
  end
@@ -1,5 +1,5 @@
1
1
  module Docker
2
2
  module Porcelain
3
- VERSION = "0.2.0"
3
+ VERSION = '0.3.0'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: docker-porcelain
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rafał Rzepecki
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-10-21 00:00:00.000000000 Z
11
+ date: 2015-10-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: docker-api
@@ -76,6 +76,7 @@ files:
76
76
  - ".gitignore"
77
77
  - ".overcommit.yml"
78
78
  - ".rspec"
79
+ - ".rubocop.yml"
79
80
  - ".travis.yml"
80
81
  - Gemfile
81
82
  - LICENSE.txt