bin/sequent
#!/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