zilverline/sequent

View on GitHub
bin/sequent

Summary

Maintainability
Test Coverage
#!/usr/bin/env ruby
# frozen_string_literal: true

require_relative '../lib/sequent/generator'

command = ARGV[0].to_s.strip
abort('Please specify a command. i.e. `sequent new myapp`') if command.empty?
abort('Please specify a command. i.e. `sequent new myapp`') if ARGV[1..-1].empty?

args = ARGV[1..-1].map(&:to_s).map(&:strip)

def new_project(args)
  arguments = args.dup
  name = arguments.shift
  abort('Please specify a directory name. i.e. `sequent new myapp`') if name.empty?

  Sequent::Generator::Project.new(name).execute
  puts <<~NEXTSTEPS

    Success!

    Your brand spanking new sequent app is waiting for you in:
      #{File.expand_path(name, Dir.pwd)}

    To finish setting up your app:
      cd #{name}
      bundle install
      bundle exec rake sequent:db:create
      bundle exec rake sequent:db:create_view_schema
      bundle exec rake sequent:migrate:online
      bundle exec rake sequent:migrate:offline

    Run the example specs:
      SEQUENT_ENV=test bundle exec rake sequent:db:create
      bundle exec rspec spec

    To generate new aggregates use:
      sequent generate <aggregate_name>. e.g. sequent generate address

    For more information see:
      https://www.sequent.io

    Happy coding!

  NEXTSTEPS
end

def generate_aggregate(args)
  arguments = args.dup
  aggregate_name = arguments.shift
  abort('Please specify an aggregate name. i.e. `sequent g aggregate user`') unless args_valid?(aggregate_name)

  Sequent::Generator::Aggregate.new(aggregate_name).execute
  puts "#{aggregate_name} aggregate has been generated"
end

def generate_command(args)
  arguments = args.dup
  aggregate_name = arguments.shift
  command_name = arguments.shift
  attrs = arguments

  unless args_valid?(aggregate_name, command_name)
    abort('Please specify an aggregate name and command name. i.e. `sequent g command user AddUser`')
  end
  Sequent::Generator::Command.new(aggregate_name, command_name, attrs).execute
  puts "#{command_name} command has been added to #{aggregate_name}"
end

def generate_event(args)
  arguments = args.dup
  aggregate_name = arguments.shift
  event_name = arguments.shift
  attrs = arguments

  abort('Please specify an aggregate name and event name. i.e. `sequent g event user AddUser`') unless args_valid?(
    aggregate_name, event_name
  )
  Sequent::Generator::Event.new(aggregate_name, event_name, attrs).execute
  puts "#{event_name} event has been added to #{aggregate_name}"
end

def generate(args)
  arguments = args.dup
  entity = arguments.shift
  abort('Please specify a command. i.e. `sequent g aggregate user`') if entity.empty?

  case entity
  when 'aggregate'
    generate_aggregate(arguments)
  when 'command'
    generate_command(arguments)
  when 'event'
    generate_event(arguments)
  else
    abort("Unknown argument #{entity} for `generate`. Try `sequent g aggregate user`")
  end
end

def args_valid?(*args)
  args.all?(&:present?)
end

case command
when 'new'
  new_project(args)
when 'generate', 'g'
  generate(args)
else
  abort("Unknown command #{command}. Try `sequent new myapp`")
end