train 0.20.0 → 0.20.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e2e42871db47191abec6fe3d94b56a60863abd48
4
- data.tar.gz: 9004baaebe7b8021f840647bdc5032b88fb130fc
3
+ metadata.gz: 04b361d035e2f468512b7a2daf50ee16be2b69e7
4
+ data.tar.gz: 53d547202564642c4adbfa6bd4995c1ada9831e8
5
5
  SHA512:
6
- metadata.gz: 32c7d11c6aeaee6a856dfa3ce914e8d6a64d23108d8239473a7364b82929cace43c495f21765486d5b4fec02911c67747075376bde4ed8239fb88c54d30cac6d
7
- data.tar.gz: 1335190030d7f53d31b7c5ee4f7c882fc101e80b9ae808da030c4090ecac2cc95a1b609049dbccd78ab9e7235a1c649dc9a206700de9c4689c2c1b890425f77f
6
+ metadata.gz: 12d486c2d8cb2d7e7b80d2220dd9f53f92571e7a5c97333b80670aa8e4e920c5e01b6531416fdecfd62d972ff2a6534eb5a1bca0eae2df6cb2732d7cc919b66d
7
+ data.tar.gz: f45f67cbe240440d9fb832f23dc626154a839a9949de25aeba19f7a70dbd7a2d178f13ea7fe1ebe209ca67ada5021b5732b6b04786f0783136bf5f5389445c7f
data/CHANGELOG.md CHANGED
@@ -1,7 +1,14 @@
1
1
  # Change Log
2
2
 
3
- ## [0.20.0](https://github.com/chef/train/tree/0.20.0) (2016-09-21)
4
- [Full Changelog](https://github.com/chef/train/compare/v0.19.1...0.20.0)
3
+ ## [0.20.1](https://github.com/chef/train/tree/0.20.1) (2016-10-15)
4
+ [Full Changelog](https://github.com/chef/train/compare/v0.20.0...0.20.1)
5
+
6
+ **Fixed bugs:**
7
+
8
+ - support empty URIs [\#154](https://github.com/chef/train/pull/154) ([arlimus](https://github.com/arlimus))
9
+
10
+ ## [v0.20.0](https://github.com/chef/train/tree/v0.20.0) (2016-09-21)
11
+ [Full Changelog](https://github.com/chef/train/compare/v0.19.1...v0.20.0)
5
12
 
6
13
  **Fixed bugs:**
7
14
 
data/lib/train.rb CHANGED
@@ -51,19 +51,14 @@ module Train
51
51
  # e.g. ssh://bob@remote => backend: ssh, user: bob, host: remote
52
52
  def self.target_config(config = nil) # rubocop:disable Metrics/AbcSize
53
53
  conf = config.nil? ? {} : config.dup
54
-
55
- # symbolize keys
56
- conf = conf.each_with_object({}) do |(k, v), acc|
57
- acc[k.to_sym] = v
58
- acc
59
- end
54
+ conf = symbolize_keys(conf)
60
55
 
61
56
  group_keys_and_keyfiles(conf)
62
57
 
63
58
  return conf if conf[:target].to_s.empty?
64
59
 
65
60
  # split up the target's host/scheme configuration
66
- uri = URI.parse(conf[:target].to_s)
61
+ uri = parse_uri(conf[:target].to_s)
67
62
  unless uri.host.nil? and uri.scheme.nil?
68
63
  conf[:backend] ||= uri.scheme
69
64
  conf[:host] ||= uri.host
@@ -80,6 +75,44 @@ module Train
80
75
  conf
81
76
  end
82
77
 
78
+ # Takes a map of key-value pairs and turns all keys into symbols. For this
79
+ # to work, only keys are supported that can be turned into symbols.
80
+ # Example: { 'a' => 123 } ==> { a: 123 }
81
+ #
82
+ # @param map [Hash]
83
+ # @return [Hash] new map with all keys being symbols
84
+ def self.symbolize_keys(map)
85
+ map.each_with_object({}) do |(k, v), acc|
86
+ acc[k.to_sym] = v
87
+ acc
88
+ end
89
+ end
90
+ private_class_method :symbolize_keys
91
+
92
+ # Parse a URI. Supports empty URI's with paths, e.g. `mock://`
93
+ #
94
+ # @param string [string] URI string, e.g. `schema://domain.com`
95
+ # @return [URI::Generic] parsed URI object
96
+ def self.parse_uri(string)
97
+ URI.parse(string)
98
+ rescue URI::InvalidURIError => e
99
+ # A use-case we want to catch is parsing empty URIs with a schema
100
+ # e.g. mock://. To do this, we match it manually and fake the hostname
101
+ case string
102
+ when %r{^([a-z]+)://$}
103
+ string += 'dummy'
104
+ when /^([a-z]+):$/
105
+ string += '//dummy'
106
+ else
107
+ raise Train::UserError, e
108
+ end
109
+
110
+ u = URI.parse(string)
111
+ u.host = nil
112
+ u
113
+ end
114
+ private_class_method :parse_uri
115
+
83
116
  def self.validate_backend(conf, default = :local)
84
117
  return default if conf.nil?
85
118
  res = conf[:backend]
data/lib/train/version.rb CHANGED
@@ -3,5 +3,5 @@
3
3
  # Author:: Dominik Richter (<dominik.richter@gmail.com>)
4
4
 
5
5
  module Train
6
- VERSION = '0.20.0'.freeze
6
+ VERSION = '0.20.1'.freeze
7
7
  end
@@ -0,0 +1,4 @@
1
+ images:
2
+ - alpine:edge
3
+ provision:
4
+ - script: bootstrap.sh
@@ -0,0 +1,4 @@
1
+ images:
2
+ - ubuntu:16.04
3
+ provision:
4
+ - script: bootstrap.sh
@@ -128,6 +128,35 @@ describe Train do
128
128
  res = Train.target_config(org)
129
129
  res.must_equal nu
130
130
  end
131
+
132
+ it 'supports empty URIs with schema://' do
133
+ org = { target: 'mock://' }
134
+ res = Train.target_config(org)
135
+ res[:backend].must_equal 'mock'
136
+ res[:host].must_be_nil
137
+ res[:user].must_be_nil
138
+ res[:password].must_be_nil
139
+ res[:port].must_be_nil
140
+ res[:path].must_be_nil
141
+ res[:target].must_equal org[:target]
142
+ end
143
+
144
+ it 'supports empty URIs with schema:' do
145
+ org = { target: 'mock:' }
146
+ res = Train.target_config(org)
147
+ res[:backend].must_equal 'mock'
148
+ res[:host].must_be_nil
149
+ res[:user].must_be_nil
150
+ res[:password].must_be_nil
151
+ res[:port].must_be_nil
152
+ res[:path].must_be_nil
153
+ res[:target].must_equal org[:target]
154
+ end
155
+
156
+ it 'it raises UserError on invalid URIs' do
157
+ org = { target: 'mock world' }
158
+ proc { Train.target_config(org) }.must_raise Train::UserError
159
+ end
131
160
  end
132
161
 
133
162
  describe '#validate_backend' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: train
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.20.0
4
+ version: 0.20.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dominik Richter
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-21 00:00:00.000000000 Z
11
+ date: 2016-10-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -195,11 +195,13 @@ files:
195
195
  - test/integration/sudo/passwd.rb
196
196
  - test/integration/sudo/reqtty.rb
197
197
  - test/integration/sudo/run_as.rb
198
+ - test/integration/test-one.yaml
198
199
  - test/integration/test-travis-centos.yml
199
200
  - test/integration/test-travis-debian.yml
200
201
  - test/integration/test-travis-fedora.yml
201
202
  - test/integration/test-travis-oel.yml
202
203
  - test/integration/test-travis-ubuntu.yml
204
+ - test/integration/test-two.yaml
203
205
  - test/integration/test_local.rb
204
206
  - test/integration/test_ssh.rb
205
207
  - test/integration/tests/path_block_device_test.rb
@@ -251,7 +253,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
251
253
  version: '0'
252
254
  requirements: []
253
255
  rubyforge_project:
254
- rubygems_version: 2.4.6
256
+ rubygems_version: 2.5.1
255
257
  signing_key:
256
258
  specification_version: 4
257
259
  summary: Transport interface to talk to different backends.
@@ -272,11 +274,13 @@ test_files:
272
274
  - test/integration/sudo/passwd.rb
273
275
  - test/integration/sudo/reqtty.rb
274
276
  - test/integration/sudo/run_as.rb
277
+ - test/integration/test-one.yaml
275
278
  - test/integration/test-travis-centos.yml
276
279
  - test/integration/test-travis-debian.yml
277
280
  - test/integration/test-travis-fedora.yml
278
281
  - test/integration/test-travis-oel.yml
279
282
  - test/integration/test-travis-ubuntu.yml
283
+ - test/integration/test-two.yaml
280
284
  - test/integration/test_local.rb
281
285
  - test/integration/test_ssh.rb
282
286
  - test/integration/tests/path_block_device_test.rb