license-acceptance 1.0.3 → 1.0.5

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
  SHA256:
3
- metadata.gz: aeb87da3439e5c6b203e866ecf52b25cb3bb228e2cf2b5fd7a5beb2857075d7a
4
- data.tar.gz: ea1c2ffb167f0476d13c5a941b7343c7f643b98f9b4a92a18bee5919dd7f25a8
3
+ metadata.gz: e892e857adb140ddab6c76d173116f248180ced44a2e2ceeeecd9919b1a91b09
4
+ data.tar.gz: ce171bdadb89755fa39e0bd9ce5c5c63901d7949958a0de9a4883a823a35ae9f
5
5
  SHA512:
6
- metadata.gz: 2a8ddcf9559be315f55defa68535cea96ba856bb31ec84298065b0fdd51e25bcb323cfefd87ceca409facaf1833e9dc311140b0ae578cd32b2e5fe403440c147
7
- data.tar.gz: 51ffbe843d828fbbbfe745784435526bed06b9fb9a278dbc84d02dd40ec6711b97bb01de2c4db5a97fba18cd7205b1233927e164a38615268c1f21c423d48cac
6
+ metadata.gz: 0a6c4bb643dc44b5ca0ca0e0f48f6ac22ef590bc7645eea104aa584259d29a911054030749689d2be4424daed5d5a6fd2ace9554a2c7ee9989502d7f63e69d79
7
+ data.tar.gz: c5508cb4655eb0a02ba5c1067b9c58a8c03a08d9ff9eeed7bf0c864df31749ab649901db64c5fc3db6da1fee22f66c81e0bc27d32b02a0fc4899648033c2f408
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- license-acceptance (1.0.3)
4
+ license-acceptance (1.0.5)
5
5
  pastel (~> 0.7)
6
6
  tomlrb (~> 1.2)
7
7
  tty-box (~> 0.3)
@@ -2,36 +2,36 @@
2
2
  title = "All known products that require license acceptance, and the mapping of parent to child relationships"
3
3
 
4
4
  [[products]]
5
- name = "chef-infra"
6
- pretty_name = "Chef Infra"
5
+ id = "infra-client"
6
+ pretty_name = "Chef Infra Client"
7
7
  hab_pkg_id = "chef/chef-client"
8
- filename = "chef_infra"
8
+ filename = "chef_infra_client"
9
9
  mixlib_name = "chef"
10
10
  license_required_version = "15"
11
11
 
12
12
  [[products]]
13
- name = "inspec"
14
- pretty_name = "InSpec"
13
+ id = "inspec"
14
+ pretty_name = "Chef InSpec"
15
15
  hab_pkg_id = "chef/inspec"
16
16
  filename = "inspec"
17
17
 
18
18
  [[products]]
19
- name = "supermarket"
19
+ id = "supermarket"
20
20
  pretty_name = "Supermarket"
21
21
  filename = "supermarket"
22
22
 
23
23
  [[products]]
24
- name = "chef-server"
25
- pretty_name = "Chef Server"
24
+ id = "infra-server"
25
+ pretty_name = "Chef Infra Server"
26
26
  hab_pkg_id = "chef/oc_erchef"
27
- filename = "chef_server"
27
+ filename = "chef_infra_server"
28
28
 
29
29
  [[products]]
30
- name = "push-jobs-server"
30
+ id = "push-jobs-server"
31
31
  pretty_name = "Chef Push Jobs Server"
32
- filename = "chef_push_jobs_server"
32
+ filename = "push_jobs_server"
33
33
 
34
34
  [relationships]
35
- "chef-infra" = ["inspec"]
36
- "chef-server" = ["chef-infra"]
37
- "push-jobs-server" = ["chef-infra", "chef-server"]
35
+ "infra-client" = ["inspec"]
36
+ "infra-server" = ["infra-client"]
37
+ "push-jobs-server" = ["infra-client", "infra-server"]
@@ -39,21 +39,21 @@ module LicenseAcceptance
39
39
  # For applications that just need simple logic to handle a failed license acceptance flow we include this small
40
40
  # wrapper. Apps with more complex logic (like logging to a logging engine) should call the non-bang version and
41
41
  # handle the exception.
42
- def check_and_persist!(product_name, version)
43
- check_and_persist(product_name, version)
44
- rescue LicenseNotAcceptedError
45
- output.puts "#{product_name} cannot execute without accepting the license"
42
+ def check_and_persist!(product_id, version)
43
+ check_and_persist(product_id, version)
44
+ rescue LicenseNotAcceptedError => e
45
+ output.puts "#{e.product.pretty_name} cannot execute without accepting the license"
46
46
  exit 172
47
47
  end
48
48
 
49
- def check_and_persist(product_name, version)
49
+ def check_and_persist(product_id, version)
50
50
  if accepted_no_persist?
51
51
  logger.debug("Chef License accepted with no persistence")
52
52
  @acceptance_value = ACCEPT_NO_PERSIST
53
53
  return true
54
54
  end
55
55
 
56
- product_relationship = product_reader.lookup(product_name, version)
56
+ product_relationship = product_reader.lookup(product_id, version)
57
57
 
58
58
  missing_licenses = file_strategy.accepted?(product_relationship)
59
59
 
@@ -87,16 +87,16 @@ module LicenseAcceptance
87
87
  end
88
88
  return true
89
89
  else
90
- raise LicenseNotAcceptedError.new(missing_licenses)
90
+ raise LicenseNotAcceptedError.new(product_relationship.parent, missing_licenses)
91
91
  end
92
92
  end
93
93
 
94
- def self.check_and_persist!(product_name, version, opts={})
95
- new(opts).check_and_persist!(product_name, version)
94
+ def self.check_and_persist!(product_id, version, opts={})
95
+ new(opts).check_and_persist!(product_id, version)
96
96
  end
97
97
 
98
- def self.check_and_persist(product_name, version, opts={})
99
- new(opts).check_and_persist(product_name, version)
98
+ def self.check_and_persist(product_id, version, opts={})
99
+ new(opts).check_and_persist(product_id, version)
100
100
  end
101
101
 
102
102
  # Check whether the specified product requires license acceptance for the given version.
@@ -109,11 +109,11 @@ module LicenseAcceptance
109
109
  end
110
110
 
111
111
  # Some callers only know about mixlib names so we need a way for them to get the product
112
- # name as this library knows it.
113
- def name_from_mixlib(mixlib_name)
112
+ # id as this library knows it.
113
+ def id_from_mixlib(mixlib_name)
114
114
  product = product_reader.lookup_by_mixlib(mixlib_name)
115
115
  return nil if product.nil?
116
- product.name
116
+ product.id
117
117
  end
118
118
 
119
119
  # Return the value that was matched ("accept", "accept-no-persist", etc.). Used by callers so they do not
@@ -160,8 +160,10 @@ module LicenseAcceptance
160
160
  end
161
161
 
162
162
  class LicenseNotAcceptedError < RuntimeError
163
- def initialize(missing_licenses)
164
- msg = "Missing licenses for the following:\n* " + missing_licenses.map(&:name).join("\n* ")
163
+ attr_reader :product
164
+ def initialize(product, missing_licenses)
165
+ @product = product
166
+ msg = "Missing licenses for the following:\n* " + missing_licenses.map(&:id).join("\n* ")
165
167
  super(msg)
166
168
  end
167
169
  end
@@ -1,10 +1,11 @@
1
1
  module LicenseAcceptance
2
2
  class Product
3
3
 
4
- attr_reader :name, :pretty_name, :filename, :mixlib_name, :license_required_version
4
+ attr_reader :id, :pretty_name, :filename, :mixlib_name, :license_required_version
5
5
 
6
- def initialize(name, pretty_name, filename, mixlib_name, license_required_version)
7
- @name = name
6
+ def initialize(id, pretty_name, filename, mixlib_name, license_required_version)
7
+ # id is the internal representation of this product as license-acceptance knows it
8
+ @id = id
8
9
  @pretty_name = pretty_name
9
10
  @filename = filename
10
11
  @mixlib_name = mixlib_name
@@ -13,7 +14,7 @@ module LicenseAcceptance
13
14
 
14
15
  def ==(other)
15
16
  return false if other.class != Product
16
- if other.name == name &&
17
+ if other.id == id &&
17
18
  other.pretty_name == pretty_name &&
18
19
  other.filename == filename &&
19
20
  other.mixlib_name == mixlib_name
@@ -19,24 +19,24 @@ module LicenseAcceptance
19
19
  raise InvalidProductInfo.new(location) if toml.empty? || toml["products"].nil? || toml["relationships"].nil?
20
20
 
21
21
  for product in toml["products"]
22
- products[product["name"]] = Product.new(
23
- product["name"], product["pretty_name"],
22
+ products[product["id"]] = Product.new(
23
+ product["id"], product["pretty_name"],
24
24
  product["filename"], product["mixlib_name"],
25
25
  product["license_required_version"]
26
26
  )
27
27
  end
28
28
 
29
- for parent_name, children in toml["relationships"]
30
- parent = products[parent_name]
31
- raise UnknownParent.new(parent_name) if parent.nil?
29
+ for parent_id, children in toml["relationships"]
30
+ parent = products[parent_id]
31
+ raise UnknownParent.new(parent_id) if parent.nil?
32
32
  # Its fine to not have a relationship entry, but not fine to have
33
33
  # a relationship where the children are nil or empty.
34
34
  if children.nil? || children.empty? || !children.is_a?(Array)
35
35
  raise NoChildRelationships.new(parent)
36
36
  end
37
- children.map! do |child_name|
38
- child = products[child_name]
39
- raise UnknownChild.new(child_name) if child.nil?
37
+ children.map! do |child_id|
38
+ child = products[child_id]
39
+ raise UnknownChild.new(child_id) if child.nil?
40
40
  child
41
41
  end
42
42
  relationships[parent] = children
@@ -55,9 +55,9 @@ module LicenseAcceptance
55
55
  File.absolute_path(File.join(__FILE__, "../../../config/product_info.toml"))
56
56
  end
57
57
 
58
- def lookup(parent_name, parent_version)
59
- parent_product = products.fetch(parent_name) do
60
- raise UnknownProduct.new(parent_name)
58
+ def lookup(parent_id, parent_version)
59
+ parent_product = products.fetch(parent_id) do
60
+ raise UnknownProduct.new(parent_id)
61
61
  end
62
62
  children = relationships.fetch(parent_product, [])
63
63
  if !parent_version.is_a? String
@@ -105,7 +105,7 @@ module LicenseAcceptance
105
105
 
106
106
  class NoChildRelationships < RuntimeError
107
107
  def initialize(product)
108
- msg = "No child relationships for #{product.name}, should be removed from product info or fixed"
108
+ msg = "No child relationships for #{product.id}, should be removed from product info or fixed"
109
109
  super(msg)
110
110
  end
111
111
  end
@@ -25,7 +25,7 @@ module LicenseAcceptance
25
25
  def accepted?(product_relationship)
26
26
  searching = [product_relationship.parent] + product_relationship.children
27
27
  missing_licenses = searching.clone
28
- logger.debug("Searching for the following licenses: #{missing_licenses.map(&:name)}")
28
+ logger.debug("Searching for the following licenses: #{missing_licenses.map(&:id)}")
29
29
 
30
30
  searching.each do |product|
31
31
  found = false
@@ -40,7 +40,7 @@ module LicenseAcceptance
40
40
  end
41
41
  break if missing_licenses.empty?
42
42
  end
43
- logger.debug("Missing licenses remaining: #{missing_licenses.map(&:name)}")
43
+ logger.debug("Missing licenses remaining: #{missing_licenses.map(&:id)}")
44
44
  missing_licenses
45
45
  end
46
46
 
@@ -77,12 +77,13 @@ module LicenseAcceptance
77
77
 
78
78
  def persist_license(folder_path, product, parent, parent_version)
79
79
  path = ::File.join(folder_path, product.filename)
80
- logger.info("Persisting a license for #{product.name} at path #{path}")
80
+ logger.info("Persisting a license for #{product.pretty_name} at path #{path}")
81
81
  ::File.open(path, ::File::WRONLY | ::File::CREAT | ::File::EXCL) do |license_file|
82
82
  contents = {
83
- name: product.name,
83
+ id: product.id,
84
+ name: product.pretty_name,
84
85
  date_accepted: INVOCATION_TIME.iso8601,
85
- accepting_product: parent.name,
86
+ accepting_product: parent.id,
86
87
  accepting_product_version: parent_version,
87
88
  user: Etc.getlogin,
88
89
  file_format: 1,
@@ -24,7 +24,7 @@ module LicenseAcceptance
24
24
  CHECK = PASTEL.green("✔")
25
25
 
26
26
  def request(missing_licenses, &persist_callback)
27
- logger.debug("Requesting a license for #{missing_licenses.map(&:name)}")
27
+ logger.debug("Requesting a license for #{missing_licenses.map(&:id)}")
28
28
  c = missing_licenses.size
29
29
  s = c > 1 ? "s": ""
30
30
 
@@ -1,3 +1,3 @@
1
1
  module LicenseAcceptance
2
- VERSION = "1.0.3"
2
+ VERSION = "1.0.5"
3
3
  end
@@ -12,23 +12,28 @@ RSpec.describe LicenseAcceptance::Acceptor do
12
12
  d
13
13
  end
14
14
  let(:opts) { { output: output } }
15
+ let(:reader) { instance_double(LicenseAcceptance::ProductReader) }
15
16
  let(:acc) { LicenseAcceptance::Acceptor.new(opts) }
16
- let(:product) { instance_double(LicenseAcceptance::Product, name: "chef-infra") }
17
+ let(:product) { instance_double(LicenseAcceptance::Product, id: "foo", pretty_name: "Foo") }
17
18
  let(:version) { "version" }
18
- let(:relationship) { instance_double(LicenseAcceptance::ProductRelationship) }
19
+ let(:relationship) { instance_double(LicenseAcceptance::ProductRelationship, parent: product) }
19
20
  let(:missing) { [product] }
20
21
 
21
22
  describe "#check_and_persist!" do
22
- let(:err) { LicenseAcceptance::LicenseNotAcceptedError.new([product]) }
23
+ before do
24
+ expect(LicenseAcceptance::ProductReader).to receive(:new).and_return(reader)
25
+ expect(reader).to receive(:read)
26
+ end
27
+
28
+ let(:err) { LicenseAcceptance::LicenseNotAcceptedError.new(product, [product]) }
23
29
  it "outputs an error message to stdout and exits when license acceptance is declined" do
24
30
  expect(acc).to receive(:check_and_persist).and_raise(err)
25
- expect { acc.check_and_persist!(product.name, version) }.to raise_error(SystemExit)
26
- expect(output.string).to match(/#{product.name}/)
31
+ expect { acc.check_and_persist!(product.id, version) }.to raise_error(SystemExit)
32
+ expect(output.string).to match(/#{product.pretty_name}/)
27
33
  end
28
34
  end
29
35
 
30
36
  describe "#check_and_persist" do
31
- let(:reader) { instance_double(LicenseAcceptance::ProductReader) }
32
37
  let(:file_acc) { instance_double(LicenseAcceptance::Strategy::File) }
33
38
  let(:arg_acc) { instance_double(LicenseAcceptance::Strategy::Argument) }
34
39
  let(:prompt_acc) { instance_double(LicenseAcceptance::Strategy::Prompt) }
@@ -241,7 +246,7 @@ RSpec.describe LicenseAcceptance::Acceptor do
241
246
  let(:reader) { instance_double(LicenseAcceptance::ProductReader) }
242
247
  let(:mixlib_name) { "chef" }
243
248
  let(:version) { "15.0.0" }
244
- let(:product) { instance_double(LicenseAcceptance::Product, name: "chef-infra", license_required_version: "15.0.0") }
249
+ let(:product) { instance_double(LicenseAcceptance::Product, id: "foo", license_required_version: "15.0.0") }
245
250
 
246
251
  before do
247
252
  expect(LicenseAcceptance::ProductReader).to receive(:new).and_return(reader)
@@ -7,11 +7,11 @@ RSpec.describe LicenseAcceptance::ProductReader do
7
7
  let(:version) { "0.1.0" }
8
8
  let(:location) { "location" }
9
9
 
10
- let(:p1) { {"name" => "p1", "pretty_name" => "P1", "filename" => "f1", "mixlib_name" => "p1m", "license_required_version" => "p1v"} }
11
- let(:p2) { {"name" => "p2", "pretty_name" => "P2", "filename" => "f2", "mixlib_name" => "p2m", "license_required_version" => "p2v"} }
10
+ let(:p1) { {"id" => "p1", "pretty_name" => "P1", "filename" => "f1", "mixlib_name" => "p1m", "license_required_version" => "p1v"} }
11
+ let(:p2) { {"id" => "p2", "pretty_name" => "P2", "filename" => "f2", "mixlib_name" => "p2m", "license_required_version" => "p2v"} }
12
12
  # defined the `==` operator on Product for ease of comparison
13
- let(:product1) { LicenseAcceptance::Product.new(p1["name"], p1["pretty_name"], p1["filename"], p1["mixlib_name"], p1["license_required_version"]) }
14
- let(:product2) { LicenseAcceptance::Product.new(p2["name"], p2["pretty_name"], p2["filename"], p2["mixlib_name"], p2["license_required_version"]) }
13
+ let(:product1) { LicenseAcceptance::Product.new(p1["id"], p1["pretty_name"], p1["filename"], p1["mixlib_name"], p1["license_required_version"]) }
14
+ let(:product2) { LicenseAcceptance::Product.new(p2["id"], p2["pretty_name"], p2["filename"], p2["mixlib_name"], p2["license_required_version"]) }
15
15
  let(:r1) { {p1 => p2} }
16
16
  let(:toml) { {"products" => [p1, p2], "relationships" => {"p1" => ["p2"]}} }
17
17
 
@@ -2,10 +2,10 @@ require "spec_helper"
2
2
  require "license_acceptance/product"
3
3
 
4
4
  RSpec.describe LicenseAcceptance::Product do
5
- let(:instance) { LicenseAcceptance::Product.new("name", "Pretty Name", "filename", "mixlib_name", "version") }
5
+ let(:instance) { LicenseAcceptance::Product.new("id", "Pretty Name", "filename", "mixlib_name", "version") }
6
6
 
7
7
  it "can lookup the product attributes" do
8
- expect(instance.name).to eq("name")
8
+ expect(instance.id).to eq("id")
9
9
  expect(instance.pretty_name).to eq("Pretty Name")
10
10
  expect(instance.filename).to eq("filename")
11
11
  expect(instance.mixlib_name).to eq("mixlib_name")
@@ -12,9 +12,10 @@ RSpec.describe LicenseAcceptance::Strategy::File do
12
12
  instance_double(LicenseAcceptance::Config, license_locations: [dir1, dir2], persist_location: dir3)
13
13
  end
14
14
  let(:acc) { LicenseAcceptance::Strategy::File.new(config) }
15
- let(:p1_name) { "chef-infra" }
15
+ let(:p1_id) { "foo" }
16
16
  let(:p1_filename) { "p1_filename" }
17
- let(:p1) { instance_double(LicenseAcceptance::Product, name: p1_name, filename: p1_filename) }
17
+ let(:p1_pretty) { "Pretty Name" }
18
+ let(:p1) { instance_double(LicenseAcceptance::Product, id: p1_id, filename: p1_filename, pretty_name: p1_pretty) }
18
19
  let(:version) { "0.1.0" }
19
20
  let(:product_relationship) { instance_double(LicenseAcceptance::ProductRelationship, parent: p1, children: [], parent_version: version) }
20
21
  let(:mode) { File::WRONLY | File::CREAT | File::EXCL }
@@ -43,17 +44,19 @@ RSpec.describe LicenseAcceptance::Strategy::File do
43
44
  expect(File).to receive(:open).with(File.join(dir3, p1_filename), mode).and_yield(file)
44
45
  expect(file).to receive(:<<) do |yaml|
45
46
  yaml = YAML.load(yaml)
46
- expect(yaml["name"]).to eq(p1_name)
47
- expect(yaml["accepting_product"]).to eq(p1_name)
47
+ expect(yaml["id"]).to eq(p1_id)
48
+ expect(yaml["name"]).to eq(p1_pretty)
49
+ expect(yaml["accepting_product"]).to eq(p1_id)
48
50
  expect(yaml["accepting_product_version"]).to eq(version)
49
51
  end
50
52
  expect(acc.persist(product_relationship, [p1])).to eq([])
51
53
  end
52
54
 
53
55
  describe "when license has children" do
54
- let(:p2_name) { "inspec" }
56
+ let(:p2_id) { "bar" }
55
57
  let(:p2_filename) { "p2_filename" }
56
- let(:p2) { instance_double(LicenseAcceptance::Product, name: p2_name, filename: p2_filename) }
58
+ let(:p2_pretty) { "Other Pretty Name" }
59
+ let(:p2) { instance_double(LicenseAcceptance::Product, id: p2_id, filename: p2_filename, pretty_name: p2_pretty) }
57
60
  let(:product_relationship) {
58
61
  instance_double(
59
62
  LicenseAcceptance::ProductRelationship,
@@ -68,15 +71,17 @@ RSpec.describe LicenseAcceptance::Strategy::File do
68
71
  expect(File).to receive(:open).with(File.join(dir3, p1_filename), mode).and_yield(file)
69
72
  expect(file).to receive(:<<) do |yaml|
70
73
  yaml = YAML.load(yaml)
71
- expect(yaml["name"]).to eq(p1_name)
72
- expect(yaml["accepting_product"]).to eq(p1_name)
74
+ expect(yaml["id"]).to eq(p1_id)
75
+ expect(yaml["name"]).to eq(p1_pretty)
76
+ expect(yaml["accepting_product"]).to eq(p1_id)
73
77
  expect(yaml["accepting_product_version"]).to eq(version)
74
78
  end
75
79
  expect(File).to receive(:open).with(File.join(dir3, p2_filename), mode).and_yield(file)
76
80
  expect(file).to receive(:<<) do |yaml|
77
81
  yaml = YAML.load(yaml)
78
- expect(yaml["name"]).to eq(p2_name)
79
- expect(yaml["accepting_product"]).to eq(p1_name)
82
+ expect(yaml["id"]).to eq(p2_id)
83
+ expect(yaml["name"]).to eq(p2_pretty)
84
+ expect(yaml["accepting_product"]).to eq(p1_id)
80
85
  expect(yaml["accepting_product_version"]).to eq(version)
81
86
  end
82
87
  expect(acc.persist(product_relationship, [p1, p2])).to eq([])
@@ -88,8 +93,9 @@ RSpec.describe LicenseAcceptance::Strategy::File do
88
93
  expect(File).to receive(:open).once.with(File.join(dir3, p2_filename), mode).and_yield(file)
89
94
  expect(file).to receive(:<<) do |yaml|
90
95
  yaml = YAML.load(yaml)
91
- expect(yaml["name"]).to eq(p2_name)
92
- expect(yaml["accepting_product"]).to eq(p1_name)
96
+ expect(yaml["id"]).to eq(p2_id)
97
+ expect(yaml["name"]).to eq(p2_pretty)
98
+ expect(yaml["accepting_product"]).to eq(p1_id)
93
99
  expect(yaml["accepting_product_version"]).to eq(version)
94
100
  end
95
101
  expect(acc.persist(product_relationship, [p2])).to eq([])
@@ -10,7 +10,7 @@ RSpec.describe LicenseAcceptance::Strategy::Prompt do
10
10
  end
11
11
  let(:acc) { LicenseAcceptance::Strategy::Prompt.new(config) }
12
12
  let(:prompt) { instance_double(TTY::Prompt) }
13
- let(:p1) { instance_double(LicenseAcceptance::Product, name: "name", pretty_name: "Pretty Name") }
13
+ let(:p1) { instance_double(LicenseAcceptance::Product, id: "foo", pretty_name: "Pretty Name") }
14
14
  let(:missing_licenses) { [p1] }
15
15
 
16
16
  before do
@@ -29,7 +29,7 @@ RSpec.describe LicenseAcceptance::Strategy::Prompt do
29
29
  end
30
30
 
31
31
  describe "when there are multiple products" do
32
- let(:p2) { instance_double(LicenseAcceptance::Product, name: "other_name", pretty_name: "Other") }
32
+ let(:p2) { instance_double(LicenseAcceptance::Product, id: "bar", pretty_name: "Other") }
33
33
  let(:missing_licenses) { [p1, p2] }
34
34
  it "returns true" do
35
35
  expect(prompt).to receive(:ask).and_return("yes")
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: license-acceptance
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - tyler-ball
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-01 00:00:00.000000000 Z
11
+ date: 2019-05-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pastel