Class: MultiAR::Interface

Inherits:
Object
  • Object
show all
Defined in:
lib/multi_ar/interface.rb

Overview

An utility to ease creation of executable using multi database ActiveRecord through command line interface.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeInterface

Returns a new instance of Interface.



52
53
54
55
56
# File 'lib/multi_ar/interface.rb', line 52

def initialize
  @options = {}
  @dependencies = {}
  @run_by_default = false
end

Instance Attribute Details

#dependenciesObject

TODO:

what for this actually is? Write an example or just tell what for this should be used.

Hash of gems the application depends to.

Format should be:

{ "gem_name" => "~> 2.0", "another_gem" => nil }

This is used in –init.



50
51
52
# File 'lib/multi_ar/interface.rb', line 50

def dependencies
  @dependencies
end

#descriptionObject

Description of the application show in usage texts on CLI



34
35
36
# File 'lib/multi_ar/interface.rb', line 34

def description
  @description
end

#migration_frameworkObject

If set to true, migration framework and other Rake related functionality will be enabled.



37
38
39
# File 'lib/multi_ar/interface.rb', line 37

def migration_framework
  @migration_framework
end

#optionsObject

Options that will be enabled.

Options supported by this system are:

  • config # ‘true` or `String`

  • db_config # ‘true` or `String`

  • dry # boolean

  • environment # ‘true` or `String`

  • verbose # boolean

  • databases # ‘true` or `Array`

  • migration_dir # String

If value is ‘true`, an option will be added to CLI interface. If the value is something else, the option will be populated by this value instead.

‘environment` option is enabled by default, rest are disabled.



28
29
30
# File 'lib/multi_ar/interface.rb', line 28

def options
  @options
end

#run_by_defaultObject

Boolean of whether no arguments are needed



40
41
42
# File 'lib/multi_ar/interface.rb', line 40

def run_by_default
  @run_by_default
end

#versionObject

Version shown with –version flag on CLI



31
32
33
# File 'lib/multi_ar/interface.rb', line 31

def version
  @version
end

Instance Method Details

#cli {|p| ... } ⇒ Object

TODO:

hardcode shorthands

Note:

Consumes ARGV, create copy of it if you need it for something.

Yields:

  • (p)


60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/multi_ar/interface.rb', line 60

def cli
  p = Trollop::Parser.new
  p.version @version if @version
  p.banner @description if @description
  p.opt "init",         "Create stub environment with configuration and database.yaml",           type: :string
  p.opt "databases",    "List of databases to perform operations",                                type: :strings if @options["databases"] == true
  p.opt "db_config",    "Path to database config file",                                           type: :string, default: "config/database.yaml" if @options["db_config"] == true
  p.opt "config",       "Path to MultiAR framework config file",                                  type: :string, default: "config/settings.yaml" if @options["config"] == true
  p.opt "dry",          "Run the program without doing anything. Useful for debugging with -v",   type: :flag if @options["dry"] == true
  p.opt "environment",  "The environment to use. Corresponds to database config name " +
        "(environment for foo_development is “development”).",                                    type: :string, default: "development"
  p.opt "verbose",      "Be verbose",                                                             type: :flag if @options["verbose"] == true

  if @migration_framework == true
    p.opt "all_rake_tasks",     "List all Rake tasks, not only commented ones",                 short: "A", type: :flag
    # TODO: not implemented currently, do we really need this?
    #p.opt "list_databases",     "Lists databases that contains migrations in the gem",                      type: :flag
    # TODO: should we do migration_dirs here too instead?
    p.opt "migration_dir",      "The directory where migrations for databases are read from",               type: :string,  default: "db/migrate"
    p.opt "task",               "Rake task to execute",                                         short: "t", type: :string
    p.opt "tasks",              "List available Rake tasks",                                    short: "T", type: :flag
  end

  yield p if block_given?

  opts = Trollop::with_standard_exception_handling p do
    args = ARGV.clone

    result = p.parse ARGV

    if not @run_by_default
      raise Trollop::HelpNeeded if args.empty?
    end

    result
  end

  @options.each do |key, value|
    next if value == true
    # Not bothering to do checks as we just take the intended values, and not looping the array otherwise
    opts[key] = value
  end

  bootstrap opts if opts["init"] # Bootstrap will exit after execution; in that case nothing after this will be run.

  raise "--config must be path to valid file" if opts[:config_given] and not File.exist? opts["config"]
  raise "Database config #{opts["db_config"]} seems to be missing" if @options["db_config"] and not File.exist? opts["db_config"]

  @opts = opts

  init_multi_ar

  # Then run Rake tasks as requested

  return opts if not @migration_framework # TODO: I think there should be much more fine grained control for this

  if opts["tasks"] || opts["all_rake_tasks"]
    @multi_ar.list_tasks all_rake_tasks: opts["all_rake_tasks"]
    exit 1
  end

  if opts["task"].nil?
    puts "Task must be specified. Check if you passed --task option."
    exit 1
  end

  puts "Running task #{opts["task"]}" if opts["verbose"]
  @multi_ar.rake_task opts["task"]
end