sfn 1.2.0 → 2.0.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: eb52f9ec870e82eaf0e32aaba64f4c4ea05badf8
4
- data.tar.gz: 54939ef76128913964444beb09d72d8c4c4b1447
3
+ metadata.gz: 1d4a0525d2165a404b2a131f9b1edb470fd2b5b3
4
+ data.tar.gz: c6640282596fb6f2770b05a3dd8e7a60f6e26312
5
5
  SHA512:
6
- metadata.gz: 6727eeb62882084fab9f4207f2ccea58160155a16410c6051ff1970e35a70702af087020c972c1c5d40941a5c5917a4fe0b3f5e8351f11aa70574b85ba1d830e
7
- data.tar.gz: c7390a1b826f92b231e0b2d6df9f97258a9381824d5e6826d58496ee5044b7c5e9d322f77da7f8c0e878c98ffcfb72c888ef73186826453ad8419628823832ca
6
+ metadata.gz: 3e30c1d2a4470fe271c4bcd6a8dc6affe57fd9d101b68bb19a27ce604f8b54c5515879a1b231c3e8504da639a347504b0c46ba5faa6f23624233840d86ae547e
7
+ data.tar.gz: 95995a16cc8cb71cae4dc732a9b13833d1c9e16b7d0a55a78e2c2fd660c7668de86c7ecdd1366f961e497e138d2371abae75c0a827fa4d89584fdae33d30a70f
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ # v2.0.0
2
+ * [enhancement] Move to SparkleFormation 2.0
3
+ * [enhancement] Add more credential content to configuration file generator
4
+ * [feature] Run Bundler.require if Bundler is detected (#97)
5
+ * [enhancement] Extract provider specific details for abstracts (#98)
6
+ * [enhancement] Add `nesting_prefix` to customize nested template storage path (#99)
7
+ * [fix] Properly display substack planning information
8
+ * [fix] Force minimum width on list columns to prevent bunching on no content
9
+
1
10
  # v1.2.0
2
11
  * [fix] Always require packs when loading
3
12
  * [fix] Prevent stale output display on update
data/bin/sfn CHANGED
@@ -3,6 +3,10 @@
3
3
  require 'bogo-cli'
4
4
  require 'sfn'
5
5
 
6
+ if(defined?(Bundler))
7
+ Bundler.require
8
+ end
9
+
6
10
  Bogo::Cli::Setup.define do
7
11
 
8
12
  on :v, :version, 'Print version ' do
@@ -6,6 +6,8 @@ anchors:
6
6
  url: "#sfn-based"
7
7
  - title: "knife-based"
8
8
  url: "#knife-based"
9
+ - title: "Generate sfn configuration"
10
+ url: "#generate-sfn-configuration"
9
11
  - title: "configuration-options"
10
12
  url: "#configuration-options"
11
13
  ---
@@ -34,6 +36,20 @@ Supported formats:
34
36
  The configuration is contained within a file named
35
37
  `.sfn`.
36
38
 
39
+ #### Generate sfn configuration
40
+
41
+ The `sfn` command provides a `conf` subcommand. By
42
+ default this command will display current local
43
+ configuration values. It can also be used to generate
44
+ an initial configuration file which can then be
45
+ customized:
46
+
47
+ ~~~
48
+ $ sfn conf --generate
49
+ ~~~
50
+
51
+ This will create a new `.sfn` file in the working directory.
52
+
37
53
  ### `knife`-based
38
54
 
39
55
  The `sfn` application includes a plugin for the
@@ -73,6 +89,10 @@ $ knife sparkleformation --help
73
89
  | | Valid | `String`
74
90
  | | Default | none
75
91
  |----------------------------|---------------|---------------------------------------------------------------
92
+ | `nesting_prefix` | Description | Prefix to prepend to template file name within object store
93
+ | | Valid | `String`
94
+ | | Default | none
95
+ |----------------------------|---------------|---------------------------------------------------------------
76
96
  | `sparkle_pack` | Description | SparklePacks to load
77
97
  | | Valid | `Array<String>`
78
98
  | | Default | none
data/lib/sfn.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'sfn/version'
2
2
  require 'miasma'
3
3
  require 'bogo'
4
+ require 'sparkle_formation'
4
5
 
5
6
  module Sfn
6
7
 
@@ -59,8 +59,12 @@ module Sfn
59
59
  # options, please see:
60
60
  # http://www.sparkleformation.io/docs/sfn/configuration.html
61
61
  Configuration.new do
62
+ # Set style of stack nesting
62
63
  apply_nesting 'deep'
64
+ # Enable processing of SparkleFormation templates
63
65
  processing true
66
+ # Provider specific options used when creating
67
+ # new stacks. Options defined here are AWS specific.
64
68
  options do
65
69
  on_failure 'nothing'
66
70
  notification_topics []
@@ -69,14 +73,50 @@ Configuration.new do
69
73
  creator ENV['USER']
70
74
  end
71
75
  end
76
+ # Name of bucket in object store to hold nested
77
+ # stack templates
72
78
  # nesting_bucket 'BUCKET_NAME'
79
+ # Prefix used on generated template path prior to storage
80
+ # in the object store
81
+ # nesting_prefix 'nested-templates'
82
+ # Remote provider credentials
73
83
  credentials do
84
+ # Remote provider name (:aws, :azure, :open_stack, :rackspace)
74
85
  provider :aws
86
+ # AWS credentials information
75
87
  aws_access_key_id ENV['AWS_ACCESS_KEY_ID']
76
88
  aws_secret_access_key ENV['AWS_SECRET_ACCESS_KEY']
77
89
  aws_region ENV['AWS_REGION']
78
90
  aws_bucket_region ENV['AWS_REGION']
79
91
  # aws_sts_role_arn ENV['AWS_STS_ROLE_ARN']
92
+ # Eucalyptus related additions
93
+ # api_endpoint ENV['EUCA_ENDPOINT']
94
+ # euca_compat 'path'
95
+ # ssl_enabled false
96
+ # Azure credentials information
97
+ azure_tenant_id ENV['AZURE_TENANT_ID']
98
+ azure_client_id ENV['AZURE_CLIENT_ID']
99
+ azure_subscription_id ENV['AZURE_SUBSCRIPTION_ID']
100
+ azure_client_secret ENV['AZURE_CLIENT_ID']
101
+ azure_region ENV['AZURE_REGION']
102
+ azure_blob_account_name ENV['AZURE_BLOB_ACCOUNT_NAME']
103
+ azure_blob_secret_key ENV['AZURE_BLOB_SECRET_KEY']
104
+ # Defaults to "miasma-orchestration-templates"
105
+ azure_root_orchestration_container ENV['AZURE_ROOT_ORCHESTRATION_CONTAINER']
106
+ # OpenStack credentials information
107
+ open_stack_identity_url ENV['OPENSTACK_IDENTITY_URL']
108
+ open_stack_username ENV['OPENSTACK_USERNAME']
109
+ open_stack_user_id ENV['OPENSTACK_USER_ID']
110
+ open_stack_password ENV['OPENSTACK_PASSWORD']
111
+ open_stack_token ENV['OPENSTACK_TOKEN']
112
+ open_stack_region ENV['OPENSTACK_REGION']
113
+ open_stack_tenant_name ENV['OPENSTACK_TENANT_NAME']
114
+ open_stack_domain ENV['OPENSTACK_DOMAIN']
115
+ open_stack_project ENV['OPENSTACK_PROJECT']
116
+ # Rackspace credentials information
117
+ rackspace_api_key ENV['RACKSPACE_API_KEY']
118
+ rackspace_username ENV['RACKSPACE_USERNAME']
119
+ rackspace_region ENV['RACKSPACE_REGION']
80
120
  end
81
121
  end
82
122
  EOF
@@ -14,6 +14,10 @@ module Sfn
14
14
  def execute!
15
15
  name_required!
16
16
  name = name_args.first
17
+
18
+ # NOTE: Always disable plans on create
19
+ config[:plan] = false
20
+
17
21
  if(config[:template])
18
22
  file = config[:template]
19
23
  else
@@ -78,7 +82,7 @@ module Sfn
78
82
  namespace.const_get(:Describe).new({:outputs => true}, [name]).execute!
79
83
  else
80
84
  ui.fatal "Create of new stack #{ui.color(name, :bold)}: #{ui.color('FAILED', :red, :bold)}"
81
- raise
85
+ raise 'Stack did not reach a successful completion state.'
82
86
  end
83
87
  else
84
88
  ui.warn 'Stack state polling has been disabled.'
@@ -26,7 +26,9 @@ module Sfn
26
26
  events = get_events
27
27
  row(:header => true) do
28
28
  allowed_attributes.each do |attr|
29
- column attr.split('_').map(&:capitalize).join(' '), :width => ((val = events.map{|e| e[attr].to_s.length}.push(attr.length).max + 2) > 70 ? 70 : val)
29
+ width_val = events.map{|e| e[attr].to_s.length}.push(attr.length).max + 2
30
+ width_val = width_val > 70 ? 70 : width_val < 20 ? 20 : width_val
31
+ column attr.split('_').map(&:capitalize).join(' '), :width => width_val
30
32
  end
31
33
  end
32
34
  events.each do |event|
@@ -13,8 +13,11 @@ module Sfn
13
13
  table(:border => false) do
14
14
  stacks = get_stacks
15
15
  row(:header => true) do
16
+
16
17
  allowed_attributes.each do |attr|
17
- column attr.split('_').map(&:capitalize).join(' '), :width => (stacks.map{|s| s[attr].to_s.length}.max || 20) + 2
18
+ width_val = stacks.map{|e| e[attr].to_s.length}.push(attr.length).max + 2
19
+ width_val = width_val > 70 ? 70 : width_val < 20 ? 20 : width_val
20
+ column attr.split('_').map(&:capitalize).join(' '), :width => width_val
18
21
  end
19
22
  end
20
23
  get_stacks.each do |stack|
@@ -106,7 +106,7 @@ module Sfn
106
106
 
107
107
  if(config[:plan])
108
108
  stack.parameters = original_parameters
109
- plan = Planner::Aws.new(ui, config, arguments, stack)
109
+ plan = build_planner(stack)
110
110
  if(plan)
111
111
  result = plan.generate_plan(stack.template, config_root_parameters)
112
112
  display_plan_information(result)
@@ -126,7 +126,7 @@ module Sfn
126
126
  namespace.const_get(:Describe).new({:outputs => true}, [name]).execute!
127
127
  else
128
128
  ui.fatal "Update of stack #{ui.color(name, :bold)}: #{ui.color('FAILED', :red, :bold)}"
129
- raise
129
+ raise 'Stack did not reach a successful update completion state.'
130
130
  end
131
131
  else
132
132
  ui.warn 'Stack state polling has been disabled.'
@@ -146,9 +146,8 @@ module Sfn
146
146
 
147
147
  def build_planner(stack)
148
148
  klass_name = stack.api.class.to_s.split('::').last
149
- klass = Planner.const_get(klass_name)
150
- if(klass)
151
- klass.new(ui, config, arguments, stack)
149
+ if(Planner.const_defined?(klass_name))
150
+ Planner.const_get(klass_name).new(ui, config, arguments, stack)
152
151
  else
153
152
  warn "Failed to build planner for current provider. No provider implemented. (`#{klass_name}`)"
154
153
  nil
@@ -168,7 +167,8 @@ module Sfn
168
167
  said_any_things = false
169
168
  unless(info[:stacks].empty?)
170
169
  info[:stacks].each do |s_name, s_info|
171
- said_any_things ||= print_plan_result(s_info, [*names, s_name].compact)
170
+ result = print_plan_result(s_info, [*names, s_name].compact)
171
+ said_any_things ||= result
172
172
  end
173
173
  end
174
174
  unless(names.flatten.compact.empty?)
@@ -29,9 +29,9 @@ module Sfn
29
29
  )
30
30
  result.connection.data[:stack_types] = (
31
31
  [
32
- result.connection.class.const_get(:RESOURCE_MAPPING).detect do |klass, info|
32
+ (result.connection.class.const_get(:RESOURCE_MAPPING).detect do |klass, info|
33
33
  info[:api] == :orchestration
34
- end.first
34
+ end || []).first
35
35
  ] + custom_stack_types
36
36
  ).compact.uniq
37
37
  retry_config = config.fetch(:retry,
@@ -12,6 +12,10 @@ module Sfn
12
12
  UNPACK_NAME_JOINER = '-sfn-'
13
13
  # maximum number of attempts to get valid parameter value
14
14
  MAX_PARAMETER_ATTEMPTS = 5
15
+ # Template parameter locations
16
+ TEMPLATE_PARAMETER_LOCATIONS = ['Parameters', 'parameters']
17
+ # Template parameter default value locations
18
+ TEMPLATE_PARAMETER_DEFAULTS = ['Default', 'defaultValue', 'default']
15
19
 
16
20
  # Apply any defined remote stacks
17
21
  #
@@ -120,7 +124,9 @@ module Sfn
120
124
  stack_parameters = stack_parameters.nil? ? Smash.new : stack_parameters._dump
121
125
  else
122
126
  parameter_prefix = []
123
- stack_parameters = sparkle.fetch('Parameters', Smash.new)
127
+ stack_parameters = TEMPLATE_PARAMETER_LOCATIONS.map do |loc_key|
128
+ sparkle[loc_key]
129
+ end.compact.first || Smash.new
124
130
  end
125
131
  unless(stack_parameters.empty?)
126
132
  if(config.get(:parameter).is_a?(Array))
@@ -175,7 +181,7 @@ module Sfn
175
181
  attempt += 1
176
182
  default = config[:parameters].fetch(
177
183
  ns_k, current_parameters.fetch(
178
- k, v['Default']
184
+ k, TEMPLATE_PARAMETER_DEFAULTS.map{|loc_key| v[loc_key]}.compact.first
179
185
  )
180
186
  )
181
187
  if(config[:interactive_parameters])
@@ -90,7 +90,7 @@ module Sfn
90
90
  begin
91
91
  SparkleFormation::Sparkle.new(:name => sparkle_name)
92
92
  rescue ArgumentError
93
- ui.fatal "Failed to properly setup sparkle pack `#{sparkle_pack}`. Check implementation."
93
+ ui.fatal "Failed to properly setup sparkle pack `#{sparkle_name}`. Check implementation."
94
94
  raise
95
95
  end
96
96
  end
@@ -236,34 +236,41 @@ module Sfn
236
236
  def process_nested_stack_deep(sf, c_stack=nil)
237
237
  sf.apply_nesting(:deep) do |stack_name, stack, resource|
238
238
  run_callbacks_for(:template, :stack_name => stack_name, :sparkle_stack => stack)
239
- stack_definition = stack.compile.dump!
239
+
240
240
  stack_resource = resource._dump
241
241
 
242
242
  if(stack.parent)
243
- current_parameters = stack.parent.compile.dump!.to_smash.fetch('Resources', stack_name, 'Properties', 'Parameters', Smash.new)
243
+ current_parameters = stack.parent.compile.resources.set!(stack_name).properties.parameters
244
+ current_parameters = current_parameters.nil? ? Smash.new : current_parameters._dump
244
245
  else
245
246
  current_parameters = Smash.new
246
247
  end
247
248
  current_stack = c_stack ? c_stack.nested_stacks.detect{|s| s.data[:logical_id] == stack_name} : nil
248
249
  if(current_stack && current_stack.data[:parent_stack])
249
- current_parameters.merge!(current_stack.data[:parent_stack].template.fetch('Resources', stack_name, 'Properties', 'Parameters', Smash.new))
250
+ current_parameters.merge!(
251
+ current_stack.data[:parent_stack].template.fetch(
252
+ 'Resources', stack_name, 'Properties', 'Parameters', current_stack.data[:parent_stack].template.fetch(
253
+ 'resources', stack_name, 'properties', 'parameters', Smash.new
254
+ )
255
+ )
256
+ )
250
257
  end
251
- full_stack_name = stack.root_path.map(&:name).map(&:to_s).join('_')
258
+ full_stack_name = [
259
+ config[:nesting_prefix],
260
+ stack.root_path.map(&:name).map(&:to_s).join('_')
261
+ ].compact.join('/')
252
262
  unless(config[:print_only])
253
263
  result = Smash.new(
254
- 'Parameters' => populate_parameters!(stack,
264
+ :parameters => populate_parameters!(stack,
255
265
  :stack => current_stack,
256
266
  :current_parameters => current_parameters
257
267
  )
258
268
  )
259
- unless(config[:plan])
260
- resource.properties.delete!(:stack)
261
- else
262
- (stack_definition['Resources'] || {}).each do |_, info|
263
- if(valid_stack_types.include?(info['Type']))
264
- info['Properties'].delete('Stack')
265
- end
266
- end
269
+ hold_stack = resource.properties.delete!(:stack)
270
+ stack_definition = stack.compile.dump!
271
+
272
+ if(config[:plan])
273
+ resource.properties.stack hold_stack
267
274
  end
268
275
  bucket = provider.connection.api_for(:storage).buckets.get(
269
276
  config[:nesting_bucket]
@@ -276,21 +283,61 @@ module Sfn
276
283
  file.content_type = 'text/json'
277
284
  file.body = MultiJson.dump(Sfn::Utils::StackParameterScrubber.scrub!(stack_definition))
278
285
  file.save
279
- url = URI.parse(file.url)
280
286
  result.merge!(
281
- 'TemplateURL' => "#{url.scheme}://#{url.host}#{url.path}"
287
+ :url => file.url
282
288
  )
283
289
  else
284
290
  result = Smash.new(
285
- 'TemplateURL' => "http://example.com/bucket/#{full_stack_name}.json"
291
+ :url => "http://example.com/bucket/#{full_stack_name}.json"
286
292
  )
287
293
  end
288
- result.each do |k,v|
294
+ format_nested_stack_results(resource._self.provider, result).each do |k,v|
289
295
  resource.properties.set!(k, v)
290
296
  end
291
297
  end
292
298
  end
293
299
 
300
+ # Update the nested stack information for specific provider
301
+ #
302
+ # @param provider [Symbol]
303
+ # @param results [Hash]
304
+ # @return [Hash]
305
+ def format_nested_stack_results(provider, results)
306
+ case provider
307
+ when :aws
308
+ if(results[:parameters])
309
+ results['Parameters'] = results.delete(:parameters)
310
+ end
311
+ if(results[:url])
312
+ url = URI.parse(results.delete(:url))
313
+ results['TemplateURL'] = "#{url.scheme}://#{url.host}#{url.path}"
314
+ end
315
+ results
316
+ when :heat, :rackspace
317
+ results[:template] = results.delete(:url)
318
+ results
319
+ when :azure
320
+ if(results[:parameters])
321
+ results[:parameters] = Smash[
322
+ results[:parameters].map do |key, value|
323
+ [key,
324
+ value.is_a?(Hash) ? value : Smash.new(:value => value)]
325
+ end
326
+ ]
327
+ end
328
+ if(results[:url])
329
+ results[:templateLink] = Smash.new(
330
+ :uri => results.delete(:url),
331
+ :contentVersion => '1.0.0.0'
332
+ )
333
+ end
334
+ results[:mode] = 'Incremental'
335
+ results
336
+ else
337
+ raise "Unknown stack provider value given! `#{provider}`"
338
+ end
339
+ end
340
+
294
341
  # Apply template translation
295
342
  #
296
343
  # @param template [Hash]
@@ -55,6 +55,11 @@ module Sfn
55
55
  :description => 'Bucket to use for storing nested stack templates',
56
56
  :short_flag => 'N'
57
57
  )
58
+ attribute(
59
+ :nesting_prefix, String,
60
+ :description => 'File name prefix for storing template in bucket',
61
+ :short_flag => 'Y'
62
+ )
58
63
  attribute(
59
64
  :print_only, [TrueClass, FalseClass],
60
65
  :description => 'Print the resulting stack template',
@@ -18,7 +18,7 @@ module Sfn
18
18
  def status_ends_with?(*args)
19
19
  stat = status.to_s.downcase
20
20
  !!args.map(&:to_s).map(&:downcase).detect do |suffix|
21
- stat.end_with?(suffix)
21
+ stat.end_with?(suffix) || state.to_s.end_with?(suffix)
22
22
  end
23
23
  end
24
24
 
@@ -29,7 +29,7 @@ module Sfn
29
29
  def status_starts_with?(*args)
30
30
  stat = status.to_s.downcase
31
31
  !!args.map(&:to_s).map(&:downcase).detect do |prefix|
32
- stat.start_with?(prefix)
32
+ stat.start_with?(prefix) || state.to_s.start_with?(prefix)
33
33
  end
34
34
  end
35
35
 
data/lib/sfn/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Sfn
2
2
  # Current library version
3
- VERSION = Gem::Version.new('1.2.0')
3
+ VERSION = Gem::Version.new('2.0.0')
4
4
  end
data/sfn.gemspec CHANGED
@@ -10,27 +10,16 @@ Gem::Specification.new do |s|
10
10
  s.description = 'SparkleFormation CLI'
11
11
  s.license = 'Apache-2.0'
12
12
  s.require_path = 'lib'
13
- s.add_dependency 'bogo-cli', '~> 0.1.21'
14
- s.add_dependency 'miasma', '~> 0.2.27'
15
- s.add_dependency 'miasma-aws', '~> 0.1.16'
16
- s.add_dependency 'net-ssh'
17
- s.add_dependency 'sparkle_formation', '~> 1.1'
18
- s.add_dependency 'hashdiff', '~> 0.2.2'
13
+ s.add_runtime_dependency 'bogo-cli', '~> 0.1.21'
14
+ s.add_runtime_dependency 'miasma', '~> 0.2.27'
15
+ s.add_runtime_dependency 'miasma-aws', '~> 0.2.0'
16
+ s.add_runtime_dependency 'miasma-azure', '~> 0.1.0'
17
+ s.add_runtime_dependency 'net-ssh'
18
+ s.add_runtime_dependency 'sparkle_formation', '~> 2.0'
19
+ s.add_runtime_dependency 'hashdiff', '~> 0.2.2'
19
20
  s.add_development_dependency 'rake'
20
21
  s.add_development_dependency 'minitest'
21
22
  s.add_development_dependency 'mocha'
22
23
  s.executables << 'sfn'
23
24
  s.files = Dir['{lib,bin,docs}/**/*'] + %w(sfn.gemspec README.md CHANGELOG.md LICENSE)
24
- s.post_install_message = <<-EOF
25
-
26
- This is an install of the sfn gem from the 1.0 release tree. If you
27
- are upgrading from a pre-1.0 version, please review the CHANGELOG and
28
- test your environment _before_ continuing on!
29
-
30
- * https://github.com/sparkleformation/sfn/blob/master/CHANGELOG.md
31
-
32
- Happy stacking!
33
-
34
- EOF
35
-
36
25
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sfn
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Roberts
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-05 00:00:00.000000000 Z
11
+ date: 2016-01-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bogo-cli
@@ -44,14 +44,28 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 0.1.16
47
+ version: 0.2.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 0.1.16
54
+ version: 0.2.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: miasma-azure
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.1.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.1.0
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: net-ssh
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -72,14 +86,14 @@ dependencies:
72
86
  requirements:
73
87
  - - "~>"
74
88
  - !ruby/object:Gem::Version
75
- version: '1.1'
89
+ version: '2.0'
76
90
  type: :runtime
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
94
  - - "~>"
81
95
  - !ruby/object:Gem::Version
82
- version: '1.1'
96
+ version: '2.0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: hashdiff
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -233,16 +247,7 @@ homepage: http://github.com/sparkleformation/sfn
233
247
  licenses:
234
248
  - Apache-2.0
235
249
  metadata: {}
236
- post_install_message: |2+
237
-
238
- This is an install of the sfn gem from the 1.0 release tree. If you
239
- are upgrading from a pre-1.0 version, please review the CHANGELOG and
240
- test your environment _before_ continuing on!
241
-
242
- * https://github.com/sparkleformation/sfn/blob/master/CHANGELOG.md
243
-
244
- Happy stacking!
245
-
250
+ post_install_message:
246
251
  rdoc_options: []
247
252
  require_paths:
248
253
  - lib