module Teamster::CLI::ClassMethods

Public Instance Methods

adapter_helper_placeholder_for(filename, class_name) click to toggle source
# File lib/teamster-cli.rb, line 323
      def adapter_helper_placeholder_for(filename, class_name)
        <<-CODE
module Teamster
  module Adapters
    module #{class_name}Helper
      def #{filename}_summary?
        true
      end

      def #{filename}_summary
        erb :#{filename}_summary
      end
    end
  end
end
        CODE
      end
adapter_placeholder_for(filename, class_name) click to toggle source
# File lib/teamster-cli.rb, line 284
      def adapter_placeholder_for(filename, class_name)
        <<-CODE
require_relative \"#{filename}/#{filename}_helper\"

module Teamster
  module Adapters
    class #{class_name} < Sinatra::Base
      \# Class methods that contain Teamster-Adapter specific helpers.
      include BaseAdapter

      \# --{ Stuff that needs to be done before registration with core. }--

      \# Add adapters here (comma separated) if there are helper adapters.
      has_helpers #{class_name}Helper

      \# Location of the views folder
      views_at \"\#\{File.dirname(__FILE__)\}/#{filename}/views\"
      
      under_development \# Remove this line when development is finished.
      
      \# ------------------------------------------------------------------

      \# Register this class so it can be used.
      register self, "#{filename}"

      configure do
        enable :logging \# To log, use \"logger.info <MSG>\". Log messages are captured
                        \# in the file specified in config.ru.
      end

      get '/#{filename.gsub('_', '-')}/?' do
        erb :#{filename}
      end
    end
  end
end
        CODE
      end
add_adapter_to_config(name, filename) click to toggle source
# File lib/teamster-cli.rb, line 80
def add_adapter_to_config(name, filename)
  @config = YAML.load_file CONFIG_FILE
  adapter = {
    'name' => name,
    'files' => [
      "lib/teamster-adapters/#{filename}.rb",
      "lib/teamster-adapters/#{filename}/#{filename}_helper.rb",
      "lib/teamster-adapters/#{filename}/views/#{filename}.erb",
      "lib/teamster-adapters/#{filename}/views/#{filename}_summary.erb"
    ]
  }
  @config.tap do |hsh|
    adapters = hsh.fetch('adapters')
    adapters << adapter
  end
  File.open(CONFIG_FILE, 'w') {|fh| fh.write @config.to_yaml}
end
ask_user(question) click to toggle source
# File lib/teamster-cli.rb, line 32
def ask_user(question)
  print "#{question}: "
  STDIN.gets.strip
end
b64_enc(obj) click to toggle source
# File lib/teamster-cli.rb, line 28
def b64_enc(obj)
  Base64.strict_encode64(obj)
end
config_ru() click to toggle source
# File lib/teamster-cli.rb, line 260
      def config_ru
        <<-CODE
require 'teamster'
Dir.glob("lib/*.rb").each {|file| require File.absolute_path(file)}

Dir.mkdir("log") unless Dir.exists?("log")
log_file = File.new("log/teamster-#{Time.now.strftime("%Y%m%d-%H%M")}.log", "a+")
$stdout.reopen(log_file)
$stderr.reopen(log_file)
$stdout.sync=true
$stderr.sync=true

run Teamster::Core::App
        CODE
      end
create_adapter_for(name) click to toggle source
# File lib/teamster-cli.rb, line 98
def create_adapter_for(name)
  puts "Creating placeholders for adapter #{name}...\n"
  filename   = name.split(' ').map{|a| a.downcase}.join('_')
  class_name = name.split(' ').map{|a| a.capitalize}.join('')
  FileUtils.mkdir_p "lib/teamster-adapters/#{filename}/views"
  create_file "lib/teamster-adapters/#{filename}.rb", "adapter_placeholder_for", filename, class_name
  create_file "lib/teamster-adapters/#{filename}/#{filename}_helper.rb", "adapter_helper_placeholder_for", filename, class_name
  create_file "lib/teamster-adapters/#{filename}/views/#{filename}.erb", "view_placeholder_for", filename, class_name
  create_file "lib/teamster-adapters/#{filename}/views/#{filename}_summary.erb", "view_summary_placeholder_for", filename, class_name
  puts "\nBasic adapter creation done!"
  puts "Controller   : \"lib/teamster-adapters/#{filename}.rb\""
  puts "Helper       : \"lib/teamster-adapters/#{filename}/#{filename}_helper.rb\""
  puts "View         : \"lib/teamster-adapters/#{filename}/views/#{filename}.erb\""
  puts "Summary View : \"lib/teamster-adapters/#{filename}/views/#{filename}_summary.erb\""
  add_adapter_to_config name, filename
end
create_config() click to toggle source
# File lib/teamster-cli.rb, line 13
def create_config
  @config['title']    = ask_user "What is your team name"
  @config['adapters'] = []
  File.open(CONFIG_FILE, 'w') {|fh| fh.write @config.to_yaml}
end
create_file(filename, method, *args) click to toggle source
# File lib/teamster-cli.rb, line 145
def create_file(filename, method, *args)
  case [File.exists?(filename), !!@opts[:overwrite]]
  when [true, false]
    puts "File \"#{filename}\" exists. Run with --overwrite to overwrite file."
  else
    puts "Creating file #{filename}..."
    File.open(filename, "w") {|fh| fh.write(send(method.to_sym, *args))}
  end
end
create_user() click to toggle source
# File lib/teamster-cli.rb, line 19
def create_user
  puts "Creating default user.."
  users = [{"name" => "Administrator", "pass" => b64_enc(BCrypt::Password.create("password"))}]
  File.open("./data/users", "w") do |fh|
    fh.write({"users" => users}.to_yaml)
  end
  FileUtils.chmod 0600, './data/users'
end
detailed_usage() click to toggle source
# File lib/teamster-cli.rb, line 176
      def detailed_usage
        <<-DETAIL
Teamster is a simple and extensible web portal for teams.

Current version: #{VERSION}

Usage:
  teamster [COMMAND] [OPTIONS]

Commands:
  init, list, create, delete, export, import, update, start, stop, restart

Options (standalone):
  --help                    Display this detailed help.
  --version                 Version of the teamster used.


Command \"init\" : Initializes the web app. Creates required files for web app.
Options:
  --overwrite               If app is already initialized, --overwrite will
                            recreate all the base files.


Command \"list\"            Lists all teamster adapters.


Command \"create\" NAME     Creates a skeleton of a teamster adapter. Creates a
                            new entry in the config file.


Command \"update\" NAME     Updates the files for a teamster adapter in the
                            config file. NAME is optional. If NAME is not given,
                            all new and existing adapters are updated.


Command \"delete\" NAME     Deletes all the files of the adapter based on the
                            config file.
Option:
  --no-update               Does not update new and existing adapters in the
                            config files before deletion.


Command \"remove\" NAME     Same as DELETE above.


Command \"export\" NAME     Zips all the files listed in the config file for
                            the specified adapter. Take care to scrub all
                            information in config files, etc.
Option:
  --no-update               Does not update new and existing adapters in the
                            config files before deletion.


Command \"import\" NAME     Import is not yet implemented.


Command \"start\" : Used to run the teamster web app.
Options:
  --prod                    Binds a unix socket to be used by a web
                            server (eg. Nginx) and creates a state file
                            that is used by the Puma app server.
  --socket-file FILE        Required with --prod. Relative/absolute path
                            to the UNIX socket file.
  --state-file FILE         Required with --prod. Relative/absolute path
                            to the Puma state file.


Command \"stop\" : Used to stop the teamster web app in production mode.
Options:
  --socket-file FILE        Required. Relative/absolute path to the UNIX
                            socket file.
  --state-file FILE         Required. Relative/absolute path to the Puma
                            state file.


Command \"restart\" : Used to restart the teamster web app in production mode.
Options:
  --socket-file FILE        Required. Relative/absolute path to the UNIX
                            socket file.
  --state-file FILE         Required. Relative/absolute path to the Puma
                            state file.
      DETAIL
      end
export_adapter(name, files) click to toggle source
# File lib/teamster-cli.rb, line 130
def export_adapter(name, files)
  zip_file = "#{name.gsub(' ', '_')}.zip"
  puts "\nExporting adapter #{name} to zip: #{zip_file}\n\n"
  puts "The following files will be exported into a zip file:"
  files.each {|f| puts "- #{f}"}
  puts
  if `which zip`.length != 0
    if system "zip -r #{zip_file} #{files.join(' ')}"
      quit "\nExport successful!", 0
    else
      quit "\nError occurred when zipping!", 1
    end
  end
end
import_adapter_for(name) click to toggle source
# File lib/teamster-cli.rb, line 115
def import_adapter_for(name)
  puts "Importing adapter: #{name}"
  zip_file = "#{name}.zip"
  if File.exists?(zip_file)
    if `which unzip`.length != 0
      `unzip #{zip_file}`
      puts "\nSuccessfully imported #{name}. Please restart teamster to use."
    else
      puts "\nUnable to import adapter. Export depends on cli tool \"unzip\"."
    end
  else
    puts "Unable to find file: #{zip_file}"
  end
end
quit(msg, code = 0) click to toggle source
# File lib/teamster-cli.rb, line 8
def quit(msg, code = 0)
  warn msg
  exit code
end
show_version() click to toggle source
# File lib/teamster-cli.rb, line 155
def show_version
  "Current version of teamster: #{VERSION}"
end
teamster_adapters() click to toggle source
# File lib/teamster-cli.rb, line 276
      def teamster_adapters
        <<-CODE
Dir.glob(File.dirname(__FILE__) + '/teamster-adapters/*.rb').each do |mdl|
  require mdl
end
        CODE
      end
update_adapter(name) click to toggle source
# File lib/teamster-cli.rb, line 37
def update_adapter(name)
  config = YAML.load_file(CONFIG_FILE)
  adapter = config.fetch('adapters').find {|e| e.fetch("name") == name}
  quit "No local adapter found with name: #{name}" unless adapter
  list_from_fs = Dir.glob("lib/teamster-adapters/#{name.gsub(' ', '_')}/**/*.*")
  list_from_conf = adapter.fetch('files')
  list_from_conf.concat(list_from_fs).uniq!
  File.open(CONFIG_FILE, 'w') {|fh| fh.write config.to_yaml}
end
update_existing_adapters() click to toggle source
# File lib/teamster-cli.rb, line 65
def update_existing_adapters
  config = YAML.load_file(CONFIG_FILE)
  adapters = config.fetch('adapters')
  current_adapters = Dir.glob("lib/teamster-adapters/*.rb").map do |f|
    f.split('/').last.gsub('.rb', '').gsub('_', ' ')
  end
  current_adapters.each do |name|
    adapter = adapters.find {|e| e.fetch("name") == name}
    list_from_fs = Dir.glob("lib/teamster-adapters/#{name.gsub(' ', '_')}/**/*.*")
    list_from_conf = adapter.fetch('files')
    list_from_conf.concat(list_from_fs).uniq!
  end
  File.open(CONFIG_FILE, 'w') {|fh| fh.write config.to_yaml}
end
update_new_adapters() click to toggle source
# File lib/teamster-cli.rb, line 47
def update_new_adapters
  config = YAML.load_file(CONFIG_FILE)
  adapters = config.fetch('adapters')
  current_adapters = Dir.glob("lib/teamster-adapters/*.rb").map do |f|
    f.split('/').last.gsub('.rb', '').gsub('_', ' ')
  end
  current_adapters.each do |name|
    next if adapters.find {|e| e.fetch("name") == name}
    adapters << {}.tap do |hsh|
      hsh["name"] = name
      file_list = Dir.glob("lib/teamster-adapters/#{name.gsub(' ', '_')}/**/*.*")
      file_list << "lib/teamster-adapters/#{name.gsub(' ', '_')}.rb"
      hsh["files"] = file_list
    end
  end
  File.open(CONFIG_FILE, 'w') {|fh| fh.write config.to_yaml}
end
usage() click to toggle source
# File lib/teamster-cli.rb, line 159
      def usage
        <<-HELP
Initialize application:
  teamster init

Create an adapter:
  teamster create my amazing adapter

Run web application:
  teamster start

Verify by opening browser and navigating to "http://localhost:9292".

For more detailed help, please run "teamster --help".
        HELP
      end
view_placeholder_for(filename, class_name) click to toggle source
# File lib/teamster-cli.rb, line 341
      def view_placeholder_for(filename, class_name)
        <<-CODE
<h1 style='text-align: center'>PLACEHOLDER FOR #{filename.split('_').map{|a| a.upcase}.join(' ')}</h1>
<p style='text-align: center'>Page under construction. Please check back later!</p>
        CODE
      end
view_summary_placeholder_for(filename, class_name) click to toggle source
# File lib/teamster-cli.rb, line 348
      def view_summary_placeholder_for(filename, class_name)
        <<-CODE
<p>Under development right now..</p>
        CODE
      end