sfn 3.0.30 → 3.0.32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/bin/sfn +16 -14
  4. data/lib/chef/knife/knife_plugin_seed.rb +12 -12
  5. data/lib/sfn.rb +17 -17
  6. data/lib/sfn/api_provider.rb +3 -3
  7. data/lib/sfn/api_provider/google.rb +2 -2
  8. data/lib/sfn/api_provider/terraform.rb +2 -2
  9. data/lib/sfn/cache.rb +9 -9
  10. data/lib/sfn/callback.rb +6 -6
  11. data/lib/sfn/callback/aws_assume_role.rb +5 -5
  12. data/lib/sfn/callback/aws_mfa.rb +8 -6
  13. data/lib/sfn/callback/stack_policy.rb +15 -15
  14. data/lib/sfn/command.rb +37 -36
  15. data/lib/sfn/command/conf.rb +12 -12
  16. data/lib/sfn/command/create.rb +9 -9
  17. data/lib/sfn/command/describe.rb +6 -6
  18. data/lib/sfn/command/destroy.rb +8 -8
  19. data/lib/sfn/command/diff.rb +31 -31
  20. data/lib/sfn/command/events.rb +6 -6
  21. data/lib/sfn/command/export.rb +8 -8
  22. data/lib/sfn/command/graph.rb +21 -21
  23. data/lib/sfn/command/graph/aws.rb +34 -34
  24. data/lib/sfn/command/graph/provider.rb +1 -1
  25. data/lib/sfn/command/graph/terraform.rb +41 -41
  26. data/lib/sfn/command/import.rb +17 -17
  27. data/lib/sfn/command/init.rb +15 -15
  28. data/lib/sfn/command/inspect.rb +16 -16
  29. data/lib/sfn/command/lint.rb +6 -6
  30. data/lib/sfn/command/list.rb +2 -2
  31. data/lib/sfn/command/plan.rb +227 -0
  32. data/lib/sfn/command/print.rb +4 -4
  33. data/lib/sfn/command/promote.rb +2 -2
  34. data/lib/sfn/command/update.rb +19 -144
  35. data/lib/sfn/command/validate.rb +17 -13
  36. data/lib/sfn/command_module.rb +6 -5
  37. data/lib/sfn/command_module/base.rb +8 -8
  38. data/lib/sfn/command_module/callbacks.rb +5 -5
  39. data/lib/sfn/command_module/planning.rb +151 -0
  40. data/lib/sfn/command_module/stack.rb +34 -34
  41. data/lib/sfn/command_module/template.rb +50 -50
  42. data/lib/sfn/config.rb +46 -44
  43. data/lib/sfn/config/conf.rb +3 -3
  44. data/lib/sfn/config/create.rb +9 -9
  45. data/lib/sfn/config/describe.rb +7 -7
  46. data/lib/sfn/config/destroy.rb +1 -1
  47. data/lib/sfn/config/diff.rb +3 -3
  48. data/lib/sfn/config/events.rb +9 -9
  49. data/lib/sfn/config/export.rb +5 -5
  50. data/lib/sfn/config/graph.rb +10 -10
  51. data/lib/sfn/config/import.rb +4 -4
  52. data/lib/sfn/config/init.rb +1 -1
  53. data/lib/sfn/config/inspect.rb +16 -16
  54. data/lib/sfn/config/lint.rb +5 -5
  55. data/lib/sfn/config/list.rb +6 -6
  56. data/lib/sfn/config/plan.rb +28 -0
  57. data/lib/sfn/config/print.rb +5 -5
  58. data/lib/sfn/config/promote.rb +4 -4
  59. data/lib/sfn/config/update.rb +18 -18
  60. data/lib/sfn/config/validate.rb +30 -30
  61. data/lib/sfn/lint.rb +5 -5
  62. data/lib/sfn/lint/definition.rb +3 -3
  63. data/lib/sfn/lint/rule.rb +3 -3
  64. data/lib/sfn/lint/rule_set.rb +2 -2
  65. data/lib/sfn/monkey_patch.rb +2 -2
  66. data/lib/sfn/monkey_patch/stack.rb +27 -27
  67. data/lib/sfn/monkey_patch/stack/azure.rb +1 -1
  68. data/lib/sfn/monkey_patch/stack/google.rb +5 -5
  69. data/lib/sfn/planner.rb +4 -4
  70. data/lib/sfn/planner/aws.rb +114 -70
  71. data/lib/sfn/provider.rb +13 -13
  72. data/lib/sfn/utils.rb +10 -10
  73. data/lib/sfn/utils/debug.rb +2 -2
  74. data/lib/sfn/utils/json.rb +1 -1
  75. data/lib/sfn/utils/object_storage.rb +3 -3
  76. data/lib/sfn/utils/output.rb +4 -4
  77. data/lib/sfn/utils/path_selector.rb +15 -15
  78. data/lib/sfn/utils/ssher.rb +4 -4
  79. data/lib/sfn/utils/stack_exporter.rb +16 -16
  80. data/lib/sfn/utils/stack_parameter_scrubber.rb +6 -6
  81. data/lib/sfn/utils/stack_parameter_validator.rb +22 -22
  82. data/lib/sfn/version.rb +1 -1
  83. data/sfn.gemspec +32 -32
  84. metadata +16 -13
@@ -1,17 +1,17 @@
1
- require 'sfn'
1
+ require "sfn"
2
2
 
3
3
  module Sfn
4
4
  # Utility classes and modules
5
5
  module Utils
6
- autoload :Output, 'sfn/utils/output'
7
- autoload :StackParameterValidator, 'sfn/utils/stack_parameter_validator'
8
- autoload :StackParameterScrubber, 'sfn/utils/stack_parameter_scrubber'
9
- autoload :StackExporter, 'sfn/utils/stack_exporter'
10
- autoload :Debug, 'sfn/utils/debug'
11
- autoload :JSON, 'sfn/utils/json'
12
- autoload :Ssher, 'sfn/utils/ssher'
13
- autoload :ObjectStorage, 'sfn/utils/object_storage'
14
- autoload :PathSelector, 'sfn/utils/path_selector'
6
+ autoload :Output, "sfn/utils/output"
7
+ autoload :StackParameterValidator, "sfn/utils/stack_parameter_validator"
8
+ autoload :StackParameterScrubber, "sfn/utils/stack_parameter_scrubber"
9
+ autoload :StackExporter, "sfn/utils/stack_exporter"
10
+ autoload :Debug, "sfn/utils/debug"
11
+ autoload :JSON, "sfn/utils/json"
12
+ autoload :Ssher, "sfn/utils/ssher"
13
+ autoload :ObjectStorage, "sfn/utils/object_storage"
14
+ autoload :PathSelector, "sfn/utils/path_selector"
15
15
 
16
16
  # Provide methods directly from module for previous version compatibility
17
17
  extend JSON
@@ -1,4 +1,4 @@
1
- require 'sfn'
1
+ require "sfn"
2
2
 
3
3
  module Sfn
4
4
  module Utils
@@ -10,7 +10,7 @@ module Sfn
10
10
  #
11
11
  # @param msg [String]
12
12
  def debug(msg)
13
- if ENV['DEBUG'] || (respond_to?(:config) && config[:debug])
13
+ if ENV["DEBUG"] || (respond_to?(:config) && config[:debug])
14
14
  puts "<sfn - debug>: #{msg}"
15
15
  end
16
16
  end
@@ -1,4 +1,4 @@
1
- require 'sfn'
1
+ require "sfn"
2
2
 
3
3
  module Sfn
4
4
  module Utils
@@ -1,4 +1,4 @@
1
- require 'sfn'
1
+ require "sfn"
2
2
 
3
3
  module Sfn
4
4
  module Utils
@@ -13,13 +13,13 @@ module Sfn
13
13
  # @param directory [Miasma::Models::Storage::Directory]
14
14
  # @return [String] file path
15
15
  def file_store(object, path, directory)
16
- raise NotImplementedError.new 'Internal updated required! :('
16
+ raise NotImplementedError.new "Internal updated required! :("
17
17
  content = object.is_a?(String) ? object : Utils._format_json(object)
18
18
  directory.files.create(
19
19
  :identity => path,
20
20
  :body => content,
21
21
  )
22
- loc = directory.service.service.name.split('::').last.downcase
22
+ loc = directory.service.service.name.split("::").last.downcase
23
23
  "#{loc}://#{directory.identity}/#{path}"
24
24
  end
25
25
  end
@@ -1,4 +1,4 @@
1
- require 'sfn'
1
+ require "sfn"
2
2
 
3
3
  module Sfn
4
4
  module Utils
@@ -15,8 +15,8 @@ module Sfn
15
15
  def process(things, args = {})
16
16
  @event_ids ||= []
17
17
  processed = things.reverse.map do |thing|
18
- next if @event_ids.include?(thing['id'])
19
- @event_ids.push(thing['id']).compact!
18
+ next if @event_ids.include?(thing["id"])
19
+ @event_ids.push(thing["id"]).compact!
20
20
  if args[:attributes]
21
21
  args[:attributes].map do |key|
22
22
  thing[key].to_s
@@ -67,7 +67,7 @@ module Sfn
67
67
  output += process(things, :flat => true, :attributes => allowed_attributes)
68
68
  output.compact!
69
69
  if output.empty?
70
- ui.warn 'No information found' unless args.include?(:ignore_empty_output)
70
+ ui.warn "No information found" unless args.include?(:ignore_empty_output)
71
71
  else
72
72
  ui.info "#{what.to_s.capitalize} for stack: #{ui.color(stack, :bold)}" if stack
73
73
  ui.info "#{ui.list(output, :uneven_columns_across, columns)}"
@@ -1,5 +1,5 @@
1
- require 'sfn'
2
- require 'pathname'
1
+ require "sfn"
2
+ require "pathname"
3
3
 
4
4
  module Sfn
5
5
  module Utils
@@ -13,8 +13,8 @@ module Sfn
13
13
  # @return [String]
14
14
  def humanize_path_basename(path)
15
15
  File.basename(path).sub(
16
- File.extname(path), ''
17
- ).split(/[-_]/).map(&:capitalize).join(' ')
16
+ File.extname(path), ""
17
+ ).split(/[-_]/).map(&:capitalize).join(" ")
18
18
  end
19
19
 
20
20
  # Prompt user for file selection
@@ -27,7 +27,7 @@ module Sfn
27
27
  # @option opts [String] :filter_prefix only return results matching filter
28
28
  # @return [String] file path
29
29
  def prompt_for_file(directory, opts = {})
30
- file_list = Dir.glob(File.join(directory, '**', '**', '*')).find_all do |file|
30
+ file_list = Dir.glob(File.join(directory, "**", "**", "*")).find_all do |file|
31
31
  File.file?(file)
32
32
  end
33
33
  if opts[:filter_prefix]
@@ -39,7 +39,7 @@ module Sfn
39
39
  File.dirname(file)
40
40
  end.uniq
41
41
  files = file_list.find_all do |path|
42
- path.sub(directory, '').split('/').size == 2
42
+ path.sub(directory, "").split("/").size == 2
43
43
  end
44
44
  if opts[:ignore_directories]
45
45
  directories.delete_if do |dir|
@@ -47,16 +47,16 @@ module Sfn
47
47
  end
48
48
  end
49
49
  if directories.empty? && files.empty?
50
- ui.fatal 'No formation paths discoverable!'
50
+ ui.fatal "No formation paths discoverable!"
51
51
  else
52
- output = ['Please select an entry']
53
- output << '(or directory to list):' unless directories.empty?
54
- ui.info output.join(' ')
52
+ output = ["Please select an entry"]
53
+ output << "(or directory to list):" unless directories.empty?
54
+ ui.info output.join(" ")
55
55
  output.clear
56
56
  idx = 1
57
57
  valid = {}
58
58
  unless directories.empty?
59
- output << ui.color("#{opts.fetch(:directories_name, 'Directories')}:", :bold)
59
+ output << ui.color("#{opts.fetch(:directories_name, "Directories")}:", :bold)
60
60
  directories.each do |dir|
61
61
  valid[idx] = {:path => dir, :type => :directory}
62
62
  output << [idx, humanize_path_basename(dir)]
@@ -64,7 +64,7 @@ module Sfn
64
64
  end
65
65
  end
66
66
  unless files.empty?
67
- output << ui.color("#{opts.fetch(:files_name, 'Files')}:", :bold)
67
+ output << ui.color("#{opts.fetch(:files_name, "Files")}:", :bold)
68
68
  files.each do |file|
69
69
  valid[idx] = {:path => file, :type => :file}
70
70
  output << [idx, humanize_path_basename(file)]
@@ -74,15 +74,15 @@ module Sfn
74
74
  max = idx.to_s.length
75
75
  output.map! do |o|
76
76
  if o.is_a?(Array)
77
- " #{o.first}.#{' ' * (max - o.first.to_s.length)} #{o.last}"
77
+ " #{o.first}.#{" " * (max - o.first.to_s.length)} #{o.last}"
78
78
  else
79
79
  o
80
80
  end
81
81
  end
82
82
  ui.info "#{output.join("\n")}\n"
83
- response = ui.ask_question('Enter selection: ').to_i
83
+ response = ui.ask_question("Enter selection: ").to_i
84
84
  unless valid[response]
85
- ui.fatal 'How about using a real value'
85
+ ui.fatal "How about using a real value"
86
86
  exit 1
87
87
  else
88
88
  entry = valid[response.to_i]
@@ -1,4 +1,4 @@
1
- require 'sfn'
1
+ require "sfn"
2
2
 
3
3
  module Sfn
4
4
  module Utils
@@ -15,10 +15,10 @@ module Sfn
15
15
  # @return [String, NilClass]
16
16
  def remote_file_contents(address, user, path, ssh_opts = {})
17
17
  if path.to_s.strip.empty?
18
- raise ArgumentError.new 'No file path provided!'
18
+ raise ArgumentError.new "No file path provided!"
19
19
  end
20
- require 'net/ssh'
21
- content = ''
20
+ require "net/ssh"
21
+ content = ""
22
22
  ssh_session = Net::SSH.start(address, user, ssh_opts)
23
23
  content = ssh_session.exec!("sudo cat #{path}")
24
24
  content.empty? ? nil : content
@@ -1,9 +1,9 @@
1
1
  begin
2
- require 'chef'
2
+ require "chef"
3
3
  rescue LoadError
4
4
  $stderr.puts "WARN: Failed to load Chef. Chef specific features will be disabled!"
5
5
  end
6
- require 'sfn'
6
+ require "sfn"
7
7
 
8
8
  module Sfn
9
9
  module Utils
@@ -14,12 +14,12 @@ module Sfn
14
14
  include Sfn::Utils::JSON
15
15
 
16
16
  # default chef environment name
17
- DEFAULT_CHEF_ENVIRONMENT = '_default'
17
+ DEFAULT_CHEF_ENVIRONMENT = "_default"
18
18
  # default instance options
19
19
  DEFAULT_OPTIONS = Mash.new(
20
20
  :chef_popsicle => true,
21
- :ignored_parameters => ['Environment', 'StackCreator', 'Creator'],
22
- :chef_environment_parameter => 'Environment',
21
+ :ignored_parameters => ["Environment", "StackCreator", "Creator"],
22
+ :chef_environment_parameter => "Environment",
23
23
  )
24
24
  # default structure of export payload
25
25
  DEFAULT_EXPORT_STRUCTURE = {
@@ -33,7 +33,7 @@ module Sfn
33
33
  ),
34
34
  :generator => {
35
35
  :timestamp => Time.now.to_i,
36
- :name => 'SparkleFormation',
36
+ :name => "SparkleFormation",
37
37
  :version => Sfn::VERSION.version,
38
38
  :provider => nil,
39
39
  },
@@ -89,7 +89,7 @@ module Sfn
89
89
  # @return [Object]
90
90
  def method_missing(*args)
91
91
  m = args.first.to_s
92
- if m.end_with?('?') && options.has_key?(k = m.sub('?', '').to_sym)
92
+ if m.end_with?("?") && options.has_key?(k = m.sub("?", "").to_sym)
93
93
  !!options[k]
94
94
  else
95
95
  super
@@ -126,7 +126,7 @@ module Sfn
126
126
  # @return [Chef::Environment]
127
127
  def environment
128
128
  unless @env
129
- @env = Chef::Environment.load('_default')
129
+ @env = Chef::Environment.load("_default")
130
130
  end
131
131
  @env
132
132
  end
@@ -154,9 +154,9 @@ module Sfn
154
154
  rl_item = item.is_a?(Chef::RunList::RunListItem) ? item : Chef::RunList::RunListItem.new(item)
155
155
  static_content = Mash.new(:run_list => [])
156
156
  if rl_item.recipe?
157
- cookbook, recipe = rl_item.name.split('::')
157
+ cookbook, recipe = rl_item.name.split("::")
158
158
  peg_version = allowed_cookbook_version(cookbook)
159
- static_content[:run_list] << "recipe[#{[cookbook, recipe || 'default'].join('::')}@#{peg_version}]"
159
+ static_content[:run_list] << "recipe[#{[cookbook, recipe || "default"].join("::")}@#{peg_version}]"
160
160
  elsif rl_item.role?
161
161
  role = Chef::Role.load(rl_item.name)
162
162
  role.run_list.each do |item|
@@ -177,10 +177,10 @@ module Sfn
177
177
  # @param first_run [Hash] chef first run hash
178
178
  # @return [Hash]
179
179
  def unpack_and_freeze_runlist(first_run)
180
- extracted_runlists = first_run['run_list'].map do |item|
180
+ extracted_runlists = first_run["run_list"].map do |item|
181
181
  extract_runlist_item(cf_replace(item))
182
182
  end
183
- first_run.delete('run_list')
183
+ first_run.delete("run_list")
184
184
  first_run.replace(
185
185
  extracted_runlists.inject(first_run) do |memo, first_run_item|
186
186
  Chef::Mixin::DeepMerge.merge(memo, first_run_item)
@@ -208,8 +208,8 @@ module Sfn
208
208
  result = []
209
209
  case thing
210
210
  when Hash
211
- if thing['content'] && thing['content']['run_list']
212
- result << thing['content']
211
+ if thing["content"] && thing["content"]["run_list"]
212
+ result << thing["content"]
213
213
  else
214
214
  thing.each do |k, v|
215
215
  result += locate_runlists(v)
@@ -230,9 +230,9 @@ module Sfn
230
230
  def cf_replace(hsh)
231
231
  if hsh.is_a?(Hash)
232
232
  case hsh.keys.first
233
- when 'Fn::Join'
233
+ when "Fn::Join"
234
234
  cf_join(*hsh.values.first)
235
- when 'Ref'
235
+ when "Ref"
236
236
  cf_ref(hsh.values.first)
237
237
  else
238
238
  hsh
@@ -1,4 +1,4 @@
1
- require 'sfn'
1
+ require "sfn"
2
2
 
3
3
  module Sfn
4
4
  module Utils
@@ -7,9 +7,9 @@ module Sfn
7
7
 
8
8
  # Validate attributes within Parameter blocks
9
9
  ALLOWED_PARAMETER_ATTRIBUTES = [
10
- 'Type', 'Default', 'NoEcho', 'AllowedValues', 'AllowedPattern',
11
- 'MaxLength', 'MinLength', 'MaxValue', 'MinValue', 'Description',
12
- 'ConstraintDescription',
10
+ "Type", "Default", "NoEcho", "AllowedValues", "AllowedPattern",
11
+ "MaxLength", "MinLength", "MaxValue", "MinValue", "Description",
12
+ "ConstraintDescription",
13
13
  ]
14
14
 
15
15
  # Clean the parameters of the template
@@ -17,14 +17,14 @@ module Sfn
17
17
  # @param template [Hash]
18
18
  # @return [Hash] template
19
19
  def parameter_scrub!(template)
20
- parameters = template['Parameters']
20
+ parameters = template["Parameters"]
21
21
  if parameters
22
22
  parameters.each do |name, options|
23
23
  options.delete_if do |attribute, value|
24
24
  !ALLOWED_PARAMETER_ATTRIBUTES.include?(attribute)
25
25
  end
26
26
  end
27
- template['Parameters'] = parameters
27
+ template["Parameters"] = parameters
28
28
  end
29
29
  template
30
30
  end
@@ -1,4 +1,4 @@
1
- require 'sfn'
1
+ require "sfn"
2
2
 
3
3
  module Sfn
4
4
  module Utils
@@ -9,34 +9,34 @@ module Sfn
9
9
 
10
10
  # HOT parameter mapping
11
11
  HEAT_CONSTRAINT_MAP = {
12
- 'MaxLength' => [:length, :max],
13
- 'MinLength' => [:length, :min],
14
- 'MaxValue' => [:range, :max],
15
- 'MinValue' => [:range, :min],
16
- 'AllowedValues' => [:allowed_values],
17
- 'AllowedPattern' => [:allowed_pattern],
12
+ "MaxLength" => [:length, :max],
13
+ "MinLength" => [:length, :min],
14
+ "MaxValue" => [:range, :max],
15
+ "MinValue" => [:range, :min],
16
+ "AllowedValues" => [:allowed_values],
17
+ "AllowedPattern" => [:allowed_pattern],
18
18
  }
19
19
 
20
20
  # GCDM parameter mapping
21
21
  GOOGLE_CONSTRAINT_MAP = {
22
- 'AllowedPattern' => [:pattern],
23
- 'MaxValue' => [:maximum],
24
- 'MinValue' => [:minimum],
22
+ "AllowedPattern" => [:pattern],
23
+ "MaxValue" => [:maximum],
24
+ "MinValue" => [:minimum],
25
25
  }
26
26
 
27
27
  # Parameter mapping identifier and content
28
28
  PARAMETER_DEFINITION_MAP = {
29
- 'constraints' => HEAT_CONSTRAINT_MAP,
29
+ "constraints" => HEAT_CONSTRAINT_MAP,
30
30
  }
31
31
 
32
32
  # Supported parameter validations
33
33
  PARAMETER_VALIDATIONS = [
34
- 'allowed_values',
35
- 'allowed_pattern',
36
- 'max_length',
37
- 'min_length',
38
- 'max_value',
39
- 'min_value',
34
+ "allowed_values",
35
+ "allowed_pattern",
36
+ "max_length",
37
+ "min_length",
38
+ "max_value",
39
+ "min_value",
40
40
  ]
41
41
 
42
42
  # Validate a parameters
@@ -51,12 +51,12 @@ module Sfn
51
51
  # @option parameter_definition [String, Integer] 'MinValue'
52
52
  # @return [TrueClass, Array<String>] true if valid. array of string errors if invalid
53
53
  def validate_parameter(value, parameter_definition)
54
- return [[:blank, 'Value cannot be blank']] if value.to_s.strip.empty?
54
+ return [[:blank, "Value cannot be blank"]] if value.to_s.strip.empty?
55
55
  parameter_definition = reformat_definition(parameter_definition)
56
- value_list = list_type?(parameter_definition.fetch('Type', parameter_definition['type'].to_s)) ? value.to_s.split(',') : [value]
56
+ value_list = list_type?(parameter_definition.fetch("Type", parameter_definition["type"].to_s)) ? value.to_s.split(",") : [value]
57
57
  result = PARAMETER_VALIDATIONS.map do |validator_key|
58
58
  valid_key = parameter_definition.keys.detect do |pdef_key|
59
- pdef_key.downcase.gsub('_', '') == validator_key.downcase.gsub('_', '')
59
+ pdef_key.downcase.gsub("_", "") == validator_key.downcase.gsub("_", "")
60
60
  end
61
61
  if valid_key
62
62
  value_list.map do |value|
@@ -102,7 +102,7 @@ module Sfn
102
102
  if pdef.include?(value)
103
103
  true
104
104
  else
105
- "Not an allowed value: #{pdef.join(', ')}"
105
+ "Not an allowed value: #{pdef.join(", ")}"
106
106
  end
107
107
  end
108
108
 
@@ -182,7 +182,7 @@ module Sfn
182
182
  # @return [TrueClass, FalseClass]
183
183
  def list_type?(type)
184
184
  type = type.downcase
185
- type.start_with?('comma') || type.start_with?('list<')
185
+ type.start_with?("comma") || type.start_with?("list<")
186
186
  end
187
187
  end
188
188
  end
@@ -1,4 +1,4 @@
1
1
  module Sfn
2
2
  # Current library version
3
- VERSION = Gem::Version.new('3.0.30')
3
+ VERSION = Gem::Version.new("3.0.32")
4
4
  end
@@ -1,35 +1,35 @@
1
- $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__)) + '/lib/'
2
- require 'sfn/version'
1
+ $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__)) + "/lib/"
2
+ require "sfn/version"
3
3
  Gem::Specification.new do |s|
4
- s.name = 'sfn'
4
+ s.name = "sfn"
5
5
  s.version = Sfn::VERSION.version
6
- s.summary = 'SparkleFormation CLI'
7
- s.author = 'Chris Roberts'
8
- s.email = 'code@chrisroberts.org'
9
- s.homepage = 'http://github.com/sparkleformation/sfn'
10
- s.description = 'SparkleFormation CLI'
11
- s.license = 'Apache-2.0'
12
- s.require_path = 'lib'
13
- s.add_runtime_dependency 'bogo-cli', '>= 0.2.5', '< 0.4'
14
- s.add_runtime_dependency 'bogo-ui', '>= 0.1.22', '< 0.4'
15
- s.add_runtime_dependency 'miasma', '>= 0.3.0', '< 0.4'
16
- s.add_runtime_dependency 'miasma-aws', '>= 0.3.6', '< 0.4'
17
- s.add_runtime_dependency 'miasma-azure', '>= 0.1.0', '< 0.3'
18
- s.add_runtime_dependency 'miasma-open-stack', '>= 0.1.0', '< 0.3'
19
- s.add_runtime_dependency 'miasma-rackspace', '>= 0.1.0', '< 0.3'
20
- s.add_runtime_dependency 'miasma-google', '>= 0.1.0', '< 0.3'
21
- s.add_runtime_dependency 'miasma-terraform', '>= 0.1.0', '< 0.2.0'
22
- s.add_runtime_dependency 'jmespath'
23
- s.add_runtime_dependency 'net-ssh'
24
- s.add_runtime_dependency 'sparkle_formation', '>= 3.0.11', '< 4'
25
- s.add_runtime_dependency 'hashdiff', '~> 0.2.2'
26
- s.add_runtime_dependency 'graph', '~> 2.8.1'
27
- s.add_development_dependency 'rake', '~> 10'
28
- s.add_development_dependency 'minitest'
29
- s.add_development_dependency 'rspec', '~> 3.5'
30
- s.add_development_dependency 'rufo'
31
- s.add_development_dependency 'mocha'
32
- s.add_development_dependency 'yard'
33
- s.executables << 'sfn'
34
- s.files = Dir['{lib,bin,docs}/**/*'] + %w(sfn.gemspec README.md CHANGELOG.md LICENSE)
6
+ s.summary = "SparkleFormation CLI"
7
+ s.author = "Chris Roberts"
8
+ s.email = "code@chrisroberts.org"
9
+ s.homepage = "http://github.com/sparkleformation/sfn"
10
+ s.description = "SparkleFormation CLI"
11
+ s.license = "Apache-2.0"
12
+ s.require_path = "lib"
13
+ s.add_runtime_dependency "bogo-cli", ">= 0.2.5", "< 0.4"
14
+ s.add_runtime_dependency "bogo-ui", ">= 0.1.28", "< 0.4"
15
+ s.add_runtime_dependency "miasma", ">= 0.3.3", "< 0.4"
16
+ s.add_runtime_dependency "miasma-aws", ">= 0.3.15", "< 0.4"
17
+ s.add_runtime_dependency "miasma-azure", ">= 0.1.0", "< 0.3"
18
+ s.add_runtime_dependency "miasma-open-stack", ">= 0.1.0", "< 0.3"
19
+ s.add_runtime_dependency "miasma-rackspace", ">= 0.1.0", "< 0.3"
20
+ s.add_runtime_dependency "miasma-google", ">= 0.1.0", "< 0.3"
21
+ s.add_runtime_dependency "miasma-terraform", ">= 0.1.0", "< 0.2.0"
22
+ s.add_runtime_dependency "jmespath"
23
+ s.add_runtime_dependency "net-ssh"
24
+ s.add_runtime_dependency "sparkle_formation", ">= 3.0.11", "< 4"
25
+ s.add_runtime_dependency "hashdiff", "~> 0.2.2"
26
+ s.add_runtime_dependency "graph", "~> 2.8.1"
27
+ s.add_development_dependency "rake", "~> 10"
28
+ s.add_development_dependency "minitest"
29
+ s.add_development_dependency "rspec", "~> 3.5"
30
+ s.add_development_dependency "rufo", "~> 0.3.0"
31
+ s.add_development_dependency "mocha"
32
+ s.add_development_dependency "yard"
33
+ s.executables << "sfn"
34
+ s.files = Dir["{lib,bin,docs}/**/*"] + %w(sfn.gemspec README.md CHANGELOG.md LICENSE)
35
35
  end