tane 0.0.1

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.
Files changed (45) hide show
  1. data/.gitignore +4 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +14 -0
  4. data/README.md +22 -0
  5. data/Rakefile +10 -0
  6. data/bin/tane +18 -0
  7. data/lib/tane.rb +64 -0
  8. data/lib/tane/commands/app.rb +5 -0
  9. data/lib/tane/commands/base.rb +15 -0
  10. data/lib/tane/commands/claim.rb +26 -0
  11. data/lib/tane/commands/create.rb +46 -0
  12. data/lib/tane/commands/email.rb +50 -0
  13. data/lib/tane/commands/event.rb +21 -0
  14. data/lib/tane/commands/exec.rb +37 -0
  15. data/lib/tane/commands/help.rb +33 -0
  16. data/lib/tane/commands/init.rb +25 -0
  17. data/lib/tane/commands/login.rb +91 -0
  18. data/lib/tane/commands/logout.rb +25 -0
  19. data/lib/tane/commands/refresh.rb +26 -0
  20. data/lib/tane/commands/signup.rb +43 -0
  21. data/lib/tane/commands/support.rb +37 -0
  22. data/lib/tane/helpers.rb +168 -0
  23. data/lib/tane/helpers/bushido_helper.rb +50 -0
  24. data/lib/tane/helpers/init_helper.rb +116 -0
  25. data/lib/tane/parser.rb +52 -0
  26. data/lib/tane/version.rb +3 -0
  27. data/spec/commands/base_spec.rb +26 -0
  28. data/spec/commands/claim_spec.rb +31 -0
  29. data/spec/commands/email_spec.rb +71 -0
  30. data/spec/commands/event_spec.rb +20 -0
  31. data/spec/commands/exec_spec.rb +18 -0
  32. data/spec/commands/help_spec.rb +12 -0
  33. data/spec/commands/init_spec.rb +27 -0
  34. data/spec/commands/login_spec.rb +81 -0
  35. data/spec/commands/support_spec.rb +59 -0
  36. data/spec/executable_spec.rb +11 -0
  37. data/spec/fixtures/credentials.yml +2 -0
  38. data/spec/helpers/bushido_helper_spec.rb +87 -0
  39. data/spec/helpers/init_helper_spec.rb +127 -0
  40. data/spec/helpers_spec.rb +223 -0
  41. data/spec/spec_helper.rb +15 -0
  42. data/tane.gemspec +29 -0
  43. data/tasks/spec.rake +10 -0
  44. data/tasks/tane.rake +11 -0
  45. metadata +188 -0
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile ADDED
@@ -0,0 +1,14 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in tane.gemspec
4
+ gemspec
5
+
6
+ group :development, :test do
7
+ gem "rspec"
8
+ gem "awesome_print"
9
+ end
10
+
11
+ group :test do
12
+ gem 'cover_me', '>= 1.0.0.rc6'
13
+ gem 'ci_reporter'
14
+ end
data/README.md ADDED
@@ -0,0 +1,22 @@
1
+ # Tane
2
+
3
+ Copy-paste the following to create a new Bushido rails application.
4
+
5
+ gem install tane
6
+ tane create
7
+
8
+ ## What is tane?
9
+
10
+ Tane is a Bushido Developers best friend and a development tool. It
11
+ helps you generate new Bushido capable apps. It also enables existing
12
+ Ruby on Rails Apps to be Bushido friendly.
13
+
14
+ ## How To Create A New App
15
+
16
+ Install the tane gem and run the `tane create` command to create a new
17
+ app.
18
+
19
+ The create command will then make a new directory using that passed
20
+ name. If you don't pass a name, it will ask you for one. The create
21
+ command will use the directory specified to generate a new rails 3 app
22
+ based on a Bushido app template.
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ # Import the Tane rake tasks
4
+ import 'tasks/tane.rake'
5
+
6
+ Dir['tasks/**/*.rake'].each { |rake| load rake }
7
+
8
+ if ENV["RAILS_ENV"] != "production"
9
+ require 'ci/reporter/rake/rspec'
10
+ end
data/bin/tane ADDED
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
4
+ $LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
5
+
6
+
7
+
8
+ args = ARGV.dup
9
+ ARGV.clear
10
+
11
+ require 'tane'
12
+ options = Tane::Parser.parse(args)
13
+
14
+ command = args.shift.strip rescue 'help'
15
+ command = 'help' if command == ''
16
+
17
+ klass = Tane::Commands.const_get command.capitalize
18
+ klass.fire(options, args)
data/lib/tane.rb ADDED
@@ -0,0 +1,64 @@
1
+ require "ostruct"
2
+ require "optparse"
3
+ require "awesome_print"
4
+ require "highline"
5
+
6
+ require "tane/version"
7
+ require "tane/helpers"
8
+ require "tane/parser"
9
+
10
+ # Load all the available commands
11
+ $commands = []
12
+
13
+ Dir.glob(File.dirname(__FILE__) + "/tane/commands/*.rb").each do |command|
14
+ $commands << command.split("/").last.split('.rb').first
15
+ end
16
+
17
+ # Mark the commands for autoload (load-on-demand)
18
+ module Tane
19
+ module Commands
20
+ $commands.each do |command|
21
+ autoload command.capitalize.to_sym, "tane/commands/#{command}"
22
+ end
23
+
24
+ class << self
25
+ def command_list_and_help
26
+ command_list = "\n"
27
+ command_list += "The commands I know are:"
28
+
29
+ ($commands - ["app", "base"]).each do |command|
30
+ command_list += "\n #{command}"
31
+ end
32
+
33
+ command_list += "\n\n"
34
+ command_list += "For help on any of these commands do"
35
+ command_list += "\n\t"
36
+ command_list += "tane help command_name"
37
+ command_list += "\n\n"
38
+ end
39
+
40
+ def const_missing(name)
41
+ puts "Unsupported command #{name.downcase}."
42
+ puts command_list_and_help
43
+ exit 1
44
+ end
45
+ end
46
+
47
+ end
48
+ end
49
+
50
+ $helpers = []
51
+
52
+ Dir.glob(File.dirname(__FILE__) + "/tane/helpers/*.rb").each do |helper|
53
+ $helpers << helper.split("/").last.split('_helper.rb').first
54
+ end
55
+
56
+ # Mark the commands for autoload (load-on-demand)
57
+ module Tane
58
+ module Helpers
59
+ $helpers.each do |helper|
60
+ autoload helper.capitalize.to_sym, "tane/helpers/#{helper}_helper"
61
+ end
62
+ end
63
+ end
64
+
@@ -0,0 +1,5 @@
1
+ class Tane::Commands::App < Tane::Commands::Base
2
+ # Parent class for all commands that need to interact with an app
3
+ class << self
4
+ end
5
+ end
@@ -0,0 +1,15 @@
1
+ module Tane
2
+ module Commands
3
+ class Base
4
+ include Tane::Helpers
5
+
6
+ class << self
7
+ def fire(opts, args)
8
+ @opts = opts
9
+
10
+ process(args)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,26 @@
1
+ class Tane::Commands::Claim < Tane::Commands::Base
2
+
3
+ class << self
4
+ def process(args)
5
+ email = args.first
6
+ ido_id = args[1]
7
+ event = {'category' => 'app', 'event' => 'claimed',
8
+ 'data' => {'time' => Time.now, 'ido_id' => ido_id, 'email' => email}}
9
+
10
+ post(data_url, event)
11
+ end
12
+
13
+ def help_text
14
+ <<-EOL
15
+ Usage:
16
+
17
+ tane claim email ido_id
18
+
19
+ Notifies the app of an App.claimed event to the locally running app when the email and ido_id are passed.
20
+
21
+ tane claim john@example.com 6h284ah92jcj9m2sv21f
22
+ EOL
23
+ end
24
+ end
25
+
26
+ end
@@ -0,0 +1,46 @@
1
+ class Tane::Commands::Create < Tane::Commands::Base
2
+
3
+ class << self
4
+ def process(args)
5
+ authenticate_user
6
+ app_name = args[0] ||= term.ask("Please enter a name for your new app: ") { |app_name| app_name }
7
+ template_url = ENV['KIMONO_URL'] || "https://raw.github.com/Bushido/kimono/master/kimono.rb"
8
+
9
+ print "Creating a new Bushido rails app in #{ app_name } ... "
10
+
11
+ system("rails new #{app_name} -m #{ template_url } > tane.log")
12
+
13
+ Dir.chdir("./#{app_name}")do
14
+ system("bundle exec tane init > ../tane.log")
15
+ end
16
+
17
+ success_messages = ["Let the hacking commence!",
18
+ "Hacks and glory await!",
19
+ "Hack and be merry!",
20
+ "Your hacking starts... NOW!",
21
+ "May the source be with you!",
22
+ "Take this demi-REPL, dear friend, and may it serve you well.",
23
+ "Lemonodor-fame is but a hack away!",
24
+ "Go forth to #{ app_name }, and hack for all you're worth - for all mankind!"]
25
+
26
+ success_message = success_messages[ rand(success_messages.length) ]
27
+
28
+ FileUtils.mv("./tane.log", "./#{ app_name }/log/tane.log")
29
+ puts "Finished successfully!"
30
+ puts "Your app is now in ./#{ app_name } . #{ success_message }"
31
+ end
32
+
33
+ def help_text
34
+ <<-EOL
35
+ Usage:
36
+
37
+ tane claim email ido_id
38
+
39
+ Notifies the app of an App.claimed event to the locally running app when the email and ido_id are passed.
40
+
41
+ tane claim john@example.com 6h284ah92jcj9m2sv21f
42
+ EOL
43
+ end
44
+ end
45
+
46
+ end
@@ -0,0 +1,50 @@
1
+ class Tane::Commands::Email < Tane::Commands::Base
2
+ class << self
3
+ def process(args)
4
+ if args.count == 0
5
+ list_email_templates
6
+ else
7
+ send_email(args.first)
8
+ end
9
+ end
10
+
11
+ def list_email_templates
12
+ email_templates = Dir["#{email_templates_path}/*.yml"]
13
+ "#{email_templates.count} email templates found for this app:"
14
+ email_templates.each { |template| term.say template }
15
+ end
16
+
17
+ def send_email(email_name)
18
+ email = render_email(email_name)
19
+
20
+ if email.nil?
21
+ term.say "Couldn't find any email with the title '#{email_name}', are you sure there is a .bushido/emails/#{email_name}.yml? "
22
+ term.say "Here are the email templates for this app..."
23
+ list_email_templates
24
+
25
+ exit 1
26
+ end
27
+
28
+ post(mail_url, email)
29
+ end
30
+
31
+ def render_email(name)
32
+ YAML.load(ERB.new(File.read( email_template_file_path(name) )).result)
33
+ end
34
+
35
+ def help_text
36
+ <<-EOL
37
+ Usage:
38
+
39
+ tane email [email_template_name]
40
+
41
+ Simulates an incoming email event in the app running locally, using the template provided. Details on how to create a template are discussed later in this document.
42
+
43
+ To list email templates defined for the application, run
44
+
45
+ tane email
46
+ EOL
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,21 @@
1
+ class Tane::Commands::Event < Tane::Commands::Base
2
+
3
+ class << self
4
+ def process(args)
5
+ event = {'category' => args.first, 'event' => args[1], 'data' => eval(args[2])}
6
+ puts event
7
+ post(data_url, event)
8
+ end
9
+
10
+ def help_text
11
+ <<-EOL
12
+ Usage:
13
+
14
+ tane event event_category event_name data_hash
15
+
16
+ Notifies the local app of an event. The event category, event name are to be passed along with the data. The data is in the form of a ruby hash with the keys as strings (not symbols!). The following is an example.
17
+ EOL
18
+ end
19
+ end
20
+
21
+ end
@@ -0,0 +1,37 @@
1
+ class Tane::Commands::Exec < Tane::Commands::Base
2
+
3
+ class << self
4
+ def process(args)
5
+ authenticate_user
6
+ bushido_envs.each_pair do |key, value|
7
+ ENV[key] = value
8
+ end
9
+
10
+ command = args.join(' ')
11
+
12
+ if command.empty?
13
+ term.say("please enter a command for tane exec to run. example:")
14
+ term.say("\t tane exec rails s")
15
+
16
+ exit 1
17
+ end
18
+
19
+ exec command
20
+ end
21
+
22
+ def help_text
23
+ <<-EOL
24
+ Usage:
25
+
26
+ tane exec any_command
27
+
28
+ Executes any command specified in a simulated Bushido environment. The following example shows you how to run rails applications.
29
+
30
+ tane exec rails s
31
+
32
+ This is how you should be running Bushido rails applications locally. All the configuration required for `tane exec` is obtained from `.bushido` directory in the current directory. This can only be used if `tane init` has been run in the current directory.
33
+ EOL
34
+ end
35
+ end
36
+
37
+ end
@@ -0,0 +1,33 @@
1
+ class Tane::Commands::Help < Tane::Commands::Base
2
+
3
+ class << self
4
+ def process(args)
5
+ if args.count == 0
6
+ puts opts.help_text
7
+ return
8
+ end
9
+ help_for_command args.first.capitalize if args.count != 0
10
+ end
11
+
12
+ def help_for_command(command)
13
+ klass = Tane::Commands.const_get(command)
14
+ Tane::Commands.const_missing(command) if not klass.respond_to? :help_text
15
+ term.say "\n#{klass.help_text}\n"
16
+ end
17
+
18
+ def help_text
19
+ <<-EOL
20
+ Usage:
21
+
22
+ tane help [command]
23
+
24
+ Displays the help message with the list commands tane supports. For details about usage about each each command use `tane help name`, where _name_ is the name of the command you need information about. For example
25
+
26
+ tane help support
27
+
28
+ displays the information about the support command.
29
+ EOL
30
+ end
31
+ end
32
+
33
+ end
@@ -0,0 +1,25 @@
1
+ class Tane::Commands::Init < Tane::Commands::Base
2
+
3
+ class << self
4
+ def process(args)
5
+ authenticate_user
6
+ if in_rails_dir?
7
+ Tane::Helpers::Init.initialize_app
8
+ else
9
+ term.say("You have to be in the local rails app's root directory when running `tane init`")
10
+ exit 1
11
+ end
12
+ end
13
+
14
+ def help_text
15
+ <<-EOL
16
+ Usage:
17
+
18
+ tane init
19
+
20
+ Creates a `.bushido` directory within the directory of the rails application. That holds all the config that enables you to run applications and commands in a Bushido environment. It also deploys a development application on Bushido that allows your local application to use resources on the Bushido platform.
21
+ EOL
22
+ end
23
+ end
24
+
25
+ end
@@ -0,0 +1,91 @@
1
+ require 'tane/commands/app'
2
+
3
+ class Tane::Commands::Login < Tane::Commands::Base
4
+ class << self
5
+ def process(args)
6
+ email, password = warn_if_credentials_and_prompt
7
+
8
+ auth_token = verify_or_signup(email, password)
9
+
10
+ term.say "Done!"
11
+ term.say "Saving credentials"
12
+ save_credentials(email, auth_token)
13
+ end
14
+
15
+
16
+ def warn_if_credentials_and_prompt
17
+ warn_if_credentials
18
+
19
+ term.say "Let's log you in:"
20
+ email, password = prompt_for_credentials
21
+ end
22
+
23
+
24
+ def verify_or_signup(email, password)
25
+ term.say "contacting bushido, please wait..."
26
+ auth_token, errors = Tane::Helpers::Bushido.verify_credentials(email, password)
27
+
28
+ return auth_token if not auth_token.nil?
29
+
30
+ if auth_token.nil?
31
+ term.say("Invalid username, or password, sorry! Don't worry though, we'll get you through this!")
32
+
33
+ # returns auth_token on success
34
+ return signup_and_notify(email, password) if term.agree("would you like to try signing up with those credentials?")
35
+
36
+ display_help_messages_and_exit
37
+ end
38
+ end
39
+
40
+
41
+ def signup_and_notify(email, password)
42
+ term.say "Trying to sign up with those credentials..."
43
+ auth_token, errors = Tane::Helpers::Bushido.signup(email, password)
44
+
45
+ display_errors_and_exit(errors) if auth_token.nil?
46
+
47
+ term.say "Ok, you're signed up as #{email}!"
48
+ return auth_token
49
+ end
50
+
51
+
52
+ def display_errors_and_exit(errors)
53
+ term.say "Couldn't signup - "
54
+
55
+ errors.each do |field|
56
+ term.say "\n"
57
+ field.last.each do |error|
58
+ term.say " #{field.first} #{error} \n"
59
+ end
60
+ end
61
+ exit
62
+ end
63
+
64
+
65
+ def display_help_messages_and_exit
66
+ messages = [
67
+ "Please try one of the following:",
68
+ "\t1. Log in again with different credentials",
69
+ "\t2. Send us a help message from the command line via `tane support 'Hey guys, having trouble logging in with tane...'`",
70
+ "\t3. Contact us by email at support@gobushido.com if you're having trouble!",
71
+ "Seriously, isn't it cool to be able to send a support message straight from the cli? It's like you're the fonz"]
72
+
73
+ messages.each do |message|
74
+ term.say message
75
+ end
76
+
77
+ exit
78
+ end
79
+
80
+ def help_text
81
+ <<-EOL
82
+ Usage:
83
+
84
+ tane login
85
+
86
+ Logs you into the Bushido and stores the credentials in `~/.bushido/credentials.yml` file. It only stores your email and an authentication token. Your password is not stored. This is required if you want to run local applications in a Bushido environment. It prompts you to signup if you do not have a Bushido account.
87
+ EOL
88
+ end
89
+
90
+ end
91
+ end