stax 0.0.6 → 0.0.7

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
  SHA256:
3
- metadata.gz: 24b118344e504720f05bc0cf2ece8718f239f62be0c1108798e3b0ae293e824b
4
- data.tar.gz: 7320e11f8631f087861934243b7eec97d17a992ebcb74b43512a345fe4423ef4
3
+ metadata.gz: 16b886170228e97d41cc2294002b13db11b77cc363c838181043418891cbc2b6
4
+ data.tar.gz: fc5d8071c9e5537af036509de4fcaebab03973297bab62421552bcd029de5abd
5
5
  SHA512:
6
- metadata.gz: 36ded65f2ff9dedc05b985c0e9af6bf290ae8f301f32ba3653d439b7bbe406ba69b413ed0548a88f168d0603246a32b13e5feddc5a1c2656027aaff569c1f6d2
7
- data.tar.gz: 1178754545a2d18103dbc0c87308c30de5d0a765e97e00542393e91567ebc33acaefc7ad86ae5d8331cbb8e9bbe6986130b1ffb1382d5f4edc1491acabd14c13
6
+ metadata.gz: df070637f695680a7e4474a4b734973ec063b4049ac00a4630fda0d192411aaa87a8146c156addbec21c8b708ddeed97d5c74130f7a80f4862ff4f65a6469258
7
+ data.tar.gz: 3f0fac8e4f16a786accca5e2f7661be3031caf21c3134156e7e489de49207373293320e22ebb8abf84a8b2371a38e93e11c18b288d8c092d19242592c4470a82
data/README.md CHANGED
@@ -10,6 +10,54 @@ Stax can read template files written in `yaml`, `json` or the
10
10
  [cfer](https://github.com/seanedwards/cfer) ruby wrapper. It will
11
11
  choose which to use based on file extensions found.
12
12
 
13
+ ## Getting Started
14
+
15
+ Install `stax`:
16
+
17
+ ```sh
18
+ # gem install stax
19
+ ```
20
+
21
+ Create a new `stax` application. You can choose to do this in an
22
+ ops-specific subdirectory of your application code (thus delivering
23
+ infrastructure to run an app with the app itself), or create an
24
+ infrastructure-specific repo. It's up to you.
25
+
26
+ ```sh
27
+ $ stax new ops
28
+ ```
29
+
30
+ Change to your stax directory and install bundle:
31
+
32
+ ```sh
33
+ $ cd ops
34
+ $ bundle install
35
+ ```
36
+
37
+ Create an example stack, and add a resource:
38
+
39
+ ```sh
40
+ $ stax g stack example
41
+ $ cat >> cf/example.rb
42
+ resource :s3, 'AWS::S3::Bucket'
43
+ ^D
44
+ $ stax example create
45
+ ```
46
+
47
+ Your new stack should create, and you should now be able to list it,
48
+ inspect resource, etc:
49
+
50
+ ```sh
51
+ $ stax ls
52
+ $ stax example resources
53
+ ```
54
+
55
+ Delete your example stack:
56
+
57
+ ```sh
58
+ $ stax example delete
59
+ ```
60
+
13
61
  ## Concepts
14
62
 
15
63
  ### Application
data/lib/stax.rb CHANGED
@@ -1,5 +1,3 @@
1
- require 'thor'
2
-
3
1
  require 'stax/aws/sdk'
4
2
  require 'stax/aws/cfn'
5
3
 
@@ -8,9 +6,9 @@ require 'stax/staxfile'
8
6
  require 'stax/base'
9
7
  require 'stax/git'
10
8
  require 'stax/cli'
11
- require 'stax/meta'
12
9
  require 'stax/subcommand'
13
10
  require 'stax/cfer'
11
+
14
12
  require 'stax/stack'
15
13
  require 'stax/stack/cfn'
16
14
  require 'stax/stack/crud'
@@ -20,8 +18,6 @@ require 'stax/stack/outputs'
20
18
  require 'stax/stack/imports'
21
19
  require 'stax/stack/resources'
22
20
 
23
- require 'stax/generators'
24
- require 'stax/generate'
25
21
  require 'stax/mixin/ec2'
26
22
  require 'stax/mixin/alb'
27
23
  require 'stax/mixin/elb'
@@ -17,6 +17,18 @@ module Stax
17
17
  client.get_stages(rest_api_id: id, deployment_id: deployment).item
18
18
  end
19
19
 
20
+ def resources(id)
21
+ position = nil
22
+ items = []
23
+ loop do
24
+ resp = client.get_resources(rest_api_id: id, position: position)
25
+ items += resp.items
26
+ position = resp.position
27
+ break unless position
28
+ end
29
+ items
30
+ end
31
+
20
32
  end
21
33
 
22
34
  end
data/lib/stax/aws/cfn.rb CHANGED
@@ -72,6 +72,8 @@ module Stax
72
72
 
73
73
  def describe(name)
74
74
  client.describe_stacks(stack_name: name).stacks.first
75
+ rescue ::Aws::CloudFormation::Errors::ValidationError
76
+ nil
75
77
  end
76
78
 
77
79
  def exists?(name)
data/lib/stax/base.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require 'thor'
1
2
  require 'stax/aws/sts'
2
3
 
3
4
  module Stax
data/lib/stax/cli.rb CHANGED
@@ -1,23 +1,13 @@
1
- require 'stax/aws/cfn'
1
+ require 'stax/cli/version'
2
+ require 'stax/cli/ls'
3
+ require 'stax/cli/new'
4
+ require 'stax/cli/generate'
5
+ require 'stax/cli/crud'
6
+ require 'stax/cli/info'
2
7
 
3
8
  module Stax
4
9
  class Cli < Base
5
10
  class_option :branch, type: :string, default: Git.branch, desc: 'git branch to use'
6
11
  class_option :app, type: :string, default: File.basename(Git.toplevel), desc: 'application name'
7
-
8
- desc 'version', 'show version'
9
- def version
10
- puts VERSION
11
- end
12
-
13
- desc 'ls', 'list stacks for this branch'
14
- def ls
15
- print_table Aws::Cfn.stacks.select { |s|
16
- s.stack_name.start_with?(stack_prefix)
17
- }.map { |s|
18
- [s.stack_name, s.creation_time, color(s.stack_status, Aws::Cfn::COLORS), s.template_description]
19
- }.sort
20
- end
21
-
22
12
  end
23
13
  end
File without changes
@@ -0,0 +1,23 @@
1
+ require 'stax/generators'
2
+
3
+ module Stax
4
+ class Cli < Base
5
+
6
+ desc 'generate NAME [ARGS]', 'run code generators'
7
+ def generate(name = nil, *args)
8
+ Stax::Generators.load_builtin_generators
9
+ Stax::Generators.load_local_generators
10
+
11
+ if name.nil?
12
+ Stax::Generators::Base.subclasses.each do |g|
13
+ say_status(g.command_name, g.desc, :bold)
14
+ end
15
+ else
16
+ klass = Stax::Generators.find(name)
17
+ fail_task("Unknown generator #{name}") unless klass
18
+ klass.start(args)
19
+ end
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ module Stax
2
+ class Stack < Base
3
+
4
+ # no_commands do
5
+ # def self.info(cmds)
6
+ # puts "info: #{cmds}"
7
+ # end
8
+ # end
9
+
10
+ desc 'info', 'service-specific info'
11
+ def info
12
+ ## get mixins in the order we declared them
13
+ self.class.subcommands.reverse.each do |cmd|
14
+ begin
15
+ invoke cmd, [:info]
16
+ rescue Thor::UndefinedCommandError => e
17
+ # no info no problem
18
+ end
19
+ end
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,46 @@
1
+ module Stax
2
+ class Cli < Base
3
+
4
+ no_commands do
5
+ def ls_staxfile_stacks
6
+ print_table Stax.stack_list.map { |id|
7
+ name = stack(id).stack_name
8
+ if (s = Aws::Cfn.describe(name))
9
+ [s.stack_name, s.creation_time, color(s.stack_status, Aws::Cfn::COLORS), s.description]
10
+ else
11
+ options[:existing] ? nil : [name, '-']
12
+ end
13
+ }.compact
14
+ end
15
+
16
+ def ls_stacks_with_prefix(prefix)
17
+ print_table Aws::Cfn.stacks.select { |s|
18
+ s.stack_name.start_with?(prefix || stack_prefix)
19
+ }.map { |s|
20
+ [s.stack_name, s.creation_time, color(s.stack_status, Aws::Cfn::COLORS), s.template_description]
21
+ }.sort
22
+ end
23
+
24
+ def ls_account_stacks
25
+ print_table Aws::Cfn.stacks.map { |s|
26
+ [s.stack_name, s.creation_time, color(s.stack_status, Aws::Cfn::COLORS), s.template_description]
27
+ }.sort
28
+ end
29
+ end
30
+
31
+ desc 'ls [PREFIX]', 'list stacks'
32
+ method_option :existing, aliases: '-e', type: :boolean, default: false, desc: 'list just existing stacks'
33
+ method_option :all, aliases: '-a', type: :boolean, default: false, desc: 'list all running stacks with our prefix'
34
+ method_option :account, aliases: '-A', type: :boolean, default: false, desc: 'list all running stacks in account'
35
+ def ls(prefix = nil)
36
+ if options[:account]
37
+ ls_account_stacks
38
+ elsif options[:all]
39
+ ls_stacks_with_prefix(prefix)
40
+ else
41
+ ls_staxfile_stacks
42
+ end
43
+ end
44
+
45
+ end
46
+ end
@@ -0,0 +1,11 @@
1
+ module Stax
2
+ class Cli < Base
3
+
4
+ desc 'new DIR', 'create new stax project in dir'
5
+ def new(dir)
6
+ Stax::Generators.load_builtin_generators
7
+ Stax::Generators::NewGenerator.start(Array(dir))
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ require 'stax/version'
2
+
3
+ module Stax
4
+ class Cli < Base
5
+
6
+ desc 'version', 'show version'
7
+ def version
8
+ puts Stax::VERSION
9
+ end
10
+
11
+ end
12
+ end
@@ -1,12 +1,24 @@
1
1
  require 'stax/generators/base'
2
- require 'stax/generators/stack/stack_generator'
3
- require 'stax/generators/generator/generator_generator'
4
2
 
5
3
  module Stax
6
4
  module Generators
7
5
 
8
- def self.invoke(name, *args)
9
- Stax::Generators::const_get(name.capitalize + 'Generator').start(args)
6
+ def self.load_builtin_generators
7
+ Dir[File.join(__dir__, 'generators', '**', '*_generator.rb')].map(&method(:require))
8
+ end
9
+
10
+ ## load any generators in project lib/generators/
11
+ def self.load_local_generators
12
+ if Stax.root_path
13
+ Dir[Stax.root_path.join('lib', 'generators', '**', '*_generator.rb')].map(&method(:require))
14
+ end
15
+ end
16
+
17
+ ## find subclass that matches command name
18
+ def self.find(name)
19
+ Base.subclasses.find do |g|
20
+ g.command_name == name
21
+ end
10
22
  end
11
23
 
12
24
  end
@@ -1,3 +1,5 @@
1
+ require 'thor/group'
2
+
1
3
  module Stax
2
4
  module Generators
3
5
  class Base < Thor::Group
@@ -5,6 +7,12 @@ module Stax
5
7
 
6
8
  protected
7
9
 
10
+ ## show usage and exit
11
+ def usage!
12
+ self.class.help(self)
13
+ exit
14
+ end
15
+
8
16
  def self.subclasses
9
17
  ObjectSpace.each_object(singleton_class).map do |klass|
10
18
  klass == self ? nil : klass
@@ -16,9 +24,6 @@ module Stax
16
24
  self.to_s.split('::').last.delete_suffix('Generator').downcase
17
25
  end
18
26
 
19
- def self.invoke(name, args = ARGV)
20
- end
21
-
22
27
  ## override help banner to make sense for generators
23
28
  def self.banner(*args)
24
29
  "#{basename} generate #{command_name} ARGS"
@@ -6,7 +6,7 @@ module Stax
6
6
  source_root File.expand_path('templates', __dir__)
7
7
 
8
8
  def check_args
9
- abort('Give name of generator, e.g. FooBar or foo_bar') if args.size != 1
9
+ usage! if args.size != 1
10
10
  end
11
11
 
12
12
  def create_generator_file
@@ -19,6 +19,10 @@ module Stax
19
19
 
20
20
  private
21
21
 
22
+ def self.banner(*args)
23
+ "#{basename} generate #{command_name} NAME"
24
+ end
25
+
22
26
  def generator_name
23
27
  @_generator_name ||= args.first.underscore
24
28
  end
@@ -28,7 +32,7 @@ module Stax
28
32
  end
29
33
 
30
34
  def generator_path
31
- @_generator_path ||= File.join('lib', 'generators', args.first.underscore)
35
+ @_generator_path ||= File.join([Stax.root_path, 'lib', 'generators', args.first.underscore].compact)
32
36
  end
33
37
 
34
38
  end
@@ -0,0 +1,42 @@
1
+ module Stax
2
+ module Generators
3
+ class NewGenerator < Base
4
+ desc 'Create new stax project in give dir.'
5
+
6
+ source_root File.expand_path('templates', __dir__)
7
+
8
+ def check_args
9
+ usage! if args.size != 1
10
+ end
11
+
12
+ def create_stax_dir
13
+ empty_directory(args.first)
14
+ self.destination_root = args.first
15
+ end
16
+
17
+ def create_staxfile
18
+ template('Staxfile')
19
+ end
20
+
21
+ def create_gemfile
22
+ template('Gemfile')
23
+ end
24
+
25
+ def create_dirs
26
+ empty_directory(File.join('lib', 'stack'))
27
+ empty_directory('cf')
28
+ end
29
+
30
+ def create_lib_stack
31
+ template(File.join('lib', 'stack.rb'))
32
+ end
33
+
34
+ private
35
+
36
+ def self.banner(*args)
37
+ "#{basename} generate #{command_name} DIR"
38
+ end
39
+
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,16 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'stax'
4
+ # gem 'stax', git: 'https://github.com/rlister/stax'
5
+
6
+ gem 'stax-nag'
7
+ # gem 'stax-nag', git: 'https://github.com/rlister/stax-nag'
8
+
9
+ gem 'stax-examples'
10
+ # gem 'stax-examples', git: 'https://github.com/rlister/stax-examples'
11
+
12
+ ## this is a hack until this fixed: https://github.com/seanedwards/cfer/issues/50
13
+ gem 'docile', '~> 1.2.0'
14
+
15
+ ## for ruby template wrappers
16
+ gem 'cfer', '>= 0.6.0'
@@ -0,0 +1,5 @@
1
+ require 'stax/examples'
2
+
3
+ ## add stacks here
4
+ # stack :foo
5
+ # stack :bar, import: :foo
@@ -0,0 +1,38 @@
1
+ ## Monkey-patches you may make to change stack behavior.
2
+ ## Changing these here will affect all stacks.
3
+ ## You may also define these per-stack in the sub-class for each stack in lib/stacks/.
4
+
5
+ module Stax
6
+ class Stack < Base
7
+
8
+ no_commands do
9
+
10
+ ## your application name, will start all stack names
11
+ # def app_name
12
+ # @_app_name ||= options[:app].empty? ? nil : cfn_safe(options[:app])
13
+ # end
14
+
15
+ ## git branch to insert in stack names
16
+ # def branch_name
17
+ # @_branch_name ||= cfn_safe(options[:branch])
18
+ # end
19
+
20
+ ## format of stack names like $app-$branch-$stack
21
+ # def stack_prefix
22
+ # @_stack_prefix ||= [app_name, branch_name].compact.join('-') + '-'
23
+ # end
24
+
25
+ ## turn on stack protection when creating stack
26
+ # def cfn_termination_protection
27
+ # false
28
+ # end
29
+
30
+ ## enforce changesets for stack update
31
+ # def stack_force_changeset
32
+ # false
33
+ # end
34
+
35
+ end
36
+
37
+ end
38
+ end
@@ -12,7 +12,7 @@ module Stax
12
12
  class_option :yaml, type: :boolean, default: false, desc: 'create yaml templates'
13
13
 
14
14
  def check_args
15
- abort('List one or more stacks to create') if args.empty?
15
+ usage! if args.empty?
16
16
  end
17
17
 
18
18
  def create_staxfile
@@ -3,13 +3,14 @@ require 'stax/aws/alb'
3
3
  module Stax
4
4
  module Alb
5
5
  def self.included(thor)
6
- thor.desc(:alb, 'ALB subcommands')
6
+ thor.desc('alb COMMAND', 'ALB subcommands')
7
7
  thor.subcommand(:alb, Cmd::Alb)
8
8
  end
9
9
  end
10
10
 
11
11
  module Cmd
12
12
  class Alb < SubCommand
13
+ stax_info :status
13
14
 
14
15
  COLORS = {
15
16
  healthy: :green,
@@ -10,6 +10,7 @@ module Stax
10
10
 
11
11
  module Cmd
12
12
  class Apigw < SubCommand
13
+ stax_info :endpoints, :resources
13
14
 
14
15
  no_commands do
15
16
  def stack_apis
@@ -36,6 +37,30 @@ module Stax
36
37
  end
37
38
  end
38
39
 
40
+ desc 'resources', 'list resources'
41
+ def resources
42
+ stack_apis.each do |r|
43
+ api = Aws::APIGateway.api(r.physical_resource_id)
44
+ debug("Resources for API #{api.name} #{api.id}")
45
+ print_table Aws::APIGateway.resources(api.id).map { |r|
46
+ methods = r.resource_methods&.keys&.join(',')
47
+ [r.path, r.id, methods]
48
+ }.sort
49
+ end
50
+ end
51
+
52
+ desc 'endpoints', 'guess endpoint URIs'
53
+ def endpoints
54
+ stack_apis.each do |r|
55
+ api = Aws::APIGateway.api(r.physical_resource_id)
56
+ debug("Endpoints for API #{api.name} #{api.id}")
57
+ print_table Aws::APIGateway.stages(api.id).map { |s|
58
+ url = "https://#{api.id}.execute-api.#{aws_region}.amazonaws.com/#{s.stage_name}/"
59
+ [s.stage_name, url]
60
+ }.sort
61
+ end
62
+ end
63
+
39
64
  end
40
65
  end
41
66
  end
@@ -10,6 +10,8 @@ module Stax
10
10
 
11
11
  module Cmd
12
12
  class Asg < SubCommand
13
+ stax_info :status
14
+
13
15
  COLORS = {
14
16
  ## lifecycle states
15
17
  Pending: :yellow, InService: :green, Terminating: :red,
@@ -18,6 +18,8 @@ module Stax
18
18
 
19
19
  module Cmd
20
20
  class Codebuild < SubCommand
21
+ stax_info :builds
22
+
21
23
  COLORS = {
22
24
  SUCCEEDED: :green,
23
25
  FAILED: :red,
@@ -18,6 +18,8 @@ module Stax
18
18
 
19
19
  module Cmd
20
20
  class Codepipeline < SubCommand
21
+ stax_info :state
22
+
21
23
  COLORS = {
22
24
  Succeeded: :green,
23
25
  Failed: :red,
@@ -6,13 +6,14 @@ require_relative 'dynamodb/backup'
6
6
  module Stax
7
7
  module DynamoDB
8
8
  def self.included(thor)
9
- thor.desc(:dynamodb, 'Dynamo subcommands')
9
+ thor.desc('dynamodb COMMAND', 'Dynamo subcommands')
10
10
  thor.subcommand(:dynamodb, Cmd::DynamoDB)
11
11
  end
12
12
  end
13
13
 
14
14
  module Cmd
15
15
  class DynamoDB < SubCommand
16
+ stax_info :tables
16
17
 
17
18
  COLORS = {
18
19
  CREATING: :yellow,
@@ -38,6 +39,7 @@ module Stax
38
39
 
39
40
  desc 'tables', 'list tables for stack'
40
41
  def tables
42
+ debug("Dynamo tables for stack #{my.stack_name}")
41
43
  print_table stack_tables.map { |r|
42
44
  t = Aws::DynamoDB.table(r.physical_resource_id)
43
45
  g = Aws::DynamoDB.global_table(r.physical_resource_id)
@@ -4,7 +4,7 @@ require_relative 'ecs/deploy'
4
4
  module Stax
5
5
  module Ecs
6
6
  def self.included(thor)
7
- thor.desc(:ecs, 'ECS subcommands')
7
+ thor.desc('ecs COMMAND', 'ECS subcommands')
8
8
  thor.subcommand(:ecs, Cmd::Ecs)
9
9
  end
10
10
 
@@ -63,6 +63,8 @@ module Stax
63
63
 
64
64
  module Cmd
65
65
  class Ecs < SubCommand
66
+ stax_info :tasks
67
+
66
68
  COLORS = {
67
69
  ACTIVE: :green,
68
70
  INACTIVE: :red,
@@ -10,6 +10,7 @@ module Stax
10
10
 
11
11
  module Cmd
12
12
  class Elb < SubCommand
13
+ stax_info :status
13
14
 
14
15
  COLORS = {
15
16
  InService: :green,
@@ -6,13 +6,14 @@ require 'stax/aws/lambda'
6
6
  module Stax
7
7
  module Lambda
8
8
  def self.included(thor)
9
- thor.desc(:lambda, 'Lambda subcommands')
9
+ thor.desc('lambda COMMAND', 'Lambda subcommands')
10
10
  thor.subcommand(:lambda, Cmd::Lambda)
11
11
  end
12
12
  end
13
13
 
14
14
  module Cmd
15
15
  class Lambda < SubCommand
16
+ stax_info :ls
16
17
 
17
18
  no_commands do
18
19
  def stack_lambdas
@@ -37,6 +38,7 @@ module Stax
37
38
 
38
39
  desc 'ls', 'list lambdas for stack'
39
40
  def ls
41
+ debug("Lambda functions for stack #{my.stack_name}")
40
42
  names = stack_lambdas.map(&:physical_resource_id)
41
43
  print_table Aws::Lambda.list.select { |l|
42
44
  names.include?(l.function_name)
@@ -99,5 +101,4 @@ module Stax
99
101
 
100
102
  end
101
103
  end
102
-
103
104
  end
@@ -4,7 +4,7 @@ module Stax
4
4
  module Logs
5
5
 
6
6
  def self.included(thor)
7
- thor.desc(:logs, 'Logs subcommands')
7
+ thor.desc('logs COMMAND', 'Logs subcommands')
8
8
  thor.subcommand(:logs, Cmd::Logs)
9
9
  end
10
10
 
data/lib/stax/staxfile.rb CHANGED
@@ -1,27 +1,37 @@
1
1
  module Stax
2
+ @@_root_path = nil
2
3
  @@_stack_list = []
3
4
 
5
+ ## the stax root is defined as location of Staxfile
6
+ def self.root_path
7
+ @@_root_path
8
+ end
9
+
4
10
  ## list of stacks defined in Staxfile
5
11
  def self.stack_list
6
12
  @@_stack_list
7
13
  end
8
14
 
9
- ## try to require file from lib/stack/ for each stack
10
- def self.auto_require(path)
11
- stack_list.each do |stack|
12
- f = path.join('lib', 'stack', "#{stack}.rb")
13
- require(f) if File.exist?(f)
15
+ ## search up the dir tree for nearest Staxfile
16
+ def self.find_staxfile
17
+ Pathname.pwd.ascend do |path|
18
+ return path if File.exist?(file = path.join('Staxfile'))
14
19
  end
15
20
  end
16
21
 
17
- ## search up the dir tree for nearest Staxfile
18
22
  def self.load_staxfile
19
- Pathname.pwd.ascend do |path|
20
- if File.exist?(file = path.join('Staxfile'))
21
- load(file) if file
22
- auto_require(path)
23
- break
24
- end
23
+ @@_root_path = find_staxfile
24
+ if root_path
25
+ load(root_path.join('Staxfile'))
26
+ require_stacks
27
+ end
28
+ end
29
+
30
+ ## auto-require any stack lib files
31
+ def self.require_stacks
32
+ stack_list.each do |stack|
33
+ f = root_path.join('lib', 'stack', "#{stack}.rb")
34
+ require(f) if File.exist?(f)
25
35
  end
26
36
  end
27
37
 
@@ -36,11 +46,11 @@ module Stax
36
46
  else
37
47
  self.const_set(c, Class.new(Stack))
38
48
  end.tap do |klass|
39
- Cli.desc(name, "#{name} stack")
49
+ Cli.desc("#{name} COMMAND", "#{name} stack commands")
40
50
  Cli.subcommand(name, klass)
41
51
 
42
- ## has syntax to include mixins
43
- opt.fetch(:include, []).each do |i|
52
+ ## syntax to include mixins, reverse to give predictable include order
53
+ opt.fetch(:include, []).reverse.each do |i|
44
54
  klass.include(self.const_get(i))
45
55
  end
46
56
 
@@ -1,12 +1,35 @@
1
1
  module Stax
2
2
  class SubCommand < Base
3
- no_commands do
4
3
 
4
+ class << self
5
+ def stax_info(*tasks)
6
+ @stax_info_tasks ||= []
7
+ @stax_info_tasks += tasks
8
+ end
9
+
10
+ def stax_info_tasks
11
+ @stax_info_tasks&.uniq
12
+ end
13
+ end
14
+
15
+ no_commands do
5
16
  ## return the Stack instance that called this subcommand
6
17
  def my
7
18
  @_my ||= stack(current_command_chain.first)
8
19
  end
20
+ end
9
21
 
22
+ desc 'info', 'stax info task', hide: true
23
+ def info
24
+ self.class.stax_info_tasks&.each do |task|
25
+ begin
26
+ invoke task
27
+ puts "\n"
28
+ rescue NoMethodError => e
29
+ warn(e.message)
30
+ end
31
+ end
10
32
  end
33
+
11
34
  end
12
35
  end
data/lib/stax/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Stax
2
- VERSION = '0.0.6'
2
+ VERSION = '0.0.7'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stax
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Lister
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-06-04 00:00:00.000000000 Z
11
+ date: 2018-06-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -157,19 +157,27 @@ files:
157
157
  - lib/stax/base.rb
158
158
  - lib/stax/cfer.rb
159
159
  - lib/stax/cli.rb
160
+ - lib/stax/cli/crud.rb
161
+ - lib/stax/cli/generate.rb
162
+ - lib/stax/cli/info.rb
163
+ - lib/stax/cli/ls.rb
164
+ - lib/stax/cli/new.rb
165
+ - lib/stax/cli/version.rb
160
166
  - lib/stax/docker.rb
161
167
  - lib/stax/dsl.rb
162
- - lib/stax/generate.rb
163
168
  - lib/stax/generators.rb
164
169
  - lib/stax/generators/base.rb
165
170
  - lib/stax/generators/generator/generator_generator.rb
166
171
  - lib/stax/generators/generator/templates/generator.rb.erb
172
+ - lib/stax/generators/new/new_generator.rb
173
+ - lib/stax/generators/new/templates/Gemfile
174
+ - lib/stax/generators/new/templates/Staxfile
175
+ - lib/stax/generators/new/templates/lib/stack.rb
167
176
  - lib/stax/generators/stack/stack_generator.rb
168
177
  - lib/stax/git.rb
169
178
  - lib/stax/github.rb
170
179
  - lib/stax/iam.rb
171
180
  - lib/stax/keypair.rb
172
- - lib/stax/meta.rb
173
181
  - lib/stax/mixin/alb.rb
174
182
  - lib/stax/mixin/apigw.rb
175
183
  - lib/stax/mixin/asg.rb
data/lib/stax/generate.rb DELETED
@@ -1,12 +0,0 @@
1
- module Stax
2
- class Cli < Base
3
-
4
- desc 'generate NAME [ARGS]', 'run code generators'
5
- def generate(generator, *args)
6
- Stax::Generators.invoke(generator, *args)
7
- rescue NameError => e
8
- fail_task(e.message)
9
- end
10
-
11
- end
12
- end