nuvado 1.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +23 -0
  3. data/Gemfile +5 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +69 -0
  6. data/Rakefile +33 -0
  7. data/bin/nuvado +12 -0
  8. data/lib/nuvado/apps.rb +76 -0
  9. data/lib/nuvado/backend/app.rb +6 -0
  10. data/lib/nuvado/backend/authenticated_resource.rb +25 -0
  11. data/lib/nuvado/backend/basic_resource.rb +12 -0
  12. data/lib/nuvado/backend/build.rb +7 -0
  13. data/lib/nuvado/backend/git.rb +23 -0
  14. data/lib/nuvado/backend/key.rb +9 -0
  15. data/lib/nuvado/backend/local_key.rb +50 -0
  16. data/lib/nuvado/backend/session.rb +6 -0
  17. data/lib/nuvado/backend/token_store.rb +26 -0
  18. data/lib/nuvado/backend/user.rb +6 -0
  19. data/lib/nuvado/backend.rb +15 -0
  20. data/lib/nuvado/base_command.rb +41 -0
  21. data/lib/nuvado/exceptions.rb +17 -0
  22. data/lib/nuvado/generate.rb +39 -0
  23. data/lib/nuvado/keys.rb +57 -0
  24. data/lib/nuvado/nuvado.rb +33 -0
  25. data/lib/nuvado/os.rb +22 -0
  26. data/lib/nuvado/templates/empty_project/%product_name%/%product_name%-Info.plist.tt +45 -0
  27. data/lib/nuvado/templates/empty_project/%product_name%/%product_name%-Prefix.pch.tt +14 -0
  28. data/lib/nuvado/templates/empty_project/%product_name%/AppDelegate.h.tt +15 -0
  29. data/lib/nuvado/templates/empty_project/%product_name%/AppDelegate.m.tt +49 -0
  30. data/lib/nuvado/templates/empty_project/%product_name%/Default-568h@2x.png +0 -0
  31. data/lib/nuvado/templates/empty_project/%product_name%/Default.png +0 -0
  32. data/lib/nuvado/templates/empty_project/%product_name%/Default@2x.png +0 -0
  33. data/lib/nuvado/templates/empty_project/%product_name%/en.lproj/InfoPlist.strings +2 -0
  34. data/lib/nuvado/templates/empty_project/%product_name%/main.m.tt +18 -0
  35. data/lib/nuvado/templates/empty_project/%product_name%.xcodeproj/project.pbxproj.tt +452 -0
  36. data/lib/nuvado/templates/empty_project/%product_name%.xcodeproj/project.xcworkspace/contents.xcworkspacedata.tt +7 -0
  37. data/lib/nuvado/templates/empty_project/%product_name%Tests/%product_name%Tests-Info.plist.tt +22 -0
  38. data/lib/nuvado/templates/empty_project/%product_name%Tests/%product_name%Tests.h.tt +13 -0
  39. data/lib/nuvado/templates/empty_project/%product_name%Tests/%product_name%Tests.m.tt +32 -0
  40. data/lib/nuvado/templates/empty_project/%product_name%Tests/en.lproj/InfoPlist.strings +2 -0
  41. data/lib/nuvado/version.rb +3 -0
  42. data/lib/nuvado.rb +9 -0
  43. data/nuvado.gemspec +35 -0
  44. data/post_install.sh +2 -0
  45. data/test/apps_test.rb +107 -0
  46. data/test/backend_local_key_test.rb +46 -0
  47. data/test/keys_test.rb +102 -0
  48. data/test/login_test.rb +25 -0
  49. data/test/ssh/jmendoza.pub +1 -0
  50. data/test/ssh/kramos.pub +1 -0
  51. data/test/test_helper.rb +24 -0
  52. metadata +272 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7e7e8066f85859ffd40466cb86762fd50143a6dd
4
+ data.tar.gz: 02c3ba2fff1cd6de945a461d5fd3488c83fb4068
5
+ SHA512:
6
+ metadata.gz: 0e0360aba2e61d265372a96d9363da08bd3352820bebf46cbfbe933912c0a0d84230ee6bed8a8b3466eab876bcf74ef465b1acb737c604d7efc79fa3604f3726
7
+ data.tar.gz: 9999a03c71dc552774e01ff3bfecd9a21297214ca9b0c2dba70c6fb3bbdd4b9f6c73f5ba30573f357200465a02a580327d399e24117c1d2e9b60f2abd3874e73
data/.gitignore ADDED
@@ -0,0 +1,23 @@
1
+ *.deb
2
+ .ruby-gemset
3
+ *.gem
4
+ *.rbc
5
+ .bundle
6
+ .config
7
+ .yardoc
8
+ Gemfile.lock
9
+ InstalledFiles
10
+ _yardoc
11
+ coverage
12
+ doc/
13
+ lib/bundler/man
14
+ pkg
15
+ rdoc
16
+ spec/reports
17
+ test/tmp
18
+ test/version_tmp
19
+ tmp
20
+ .rvmrc
21
+ .ruby-version
22
+ .DS_Store
23
+ vendor/
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in nuvado.gemspec
4
+ gem "fpm"
5
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 robertomiranda
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,69 @@
1
+ # Nuvado
2
+
3
+ Client library and command-line tool to deploy and manage apps on Nuvado.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'nuvado'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install nuvado
18
+
19
+ ## Usage
20
+
21
+ ### What you need to know
22
+
23
+ As you will see soon, nuvado leverages much of git's awesomeness to do its job.
24
+ http://try.github.com is a very useful resource to get an overview of what git can do for you. It only
25
+ takes about 15 mins to complete.
26
+
27
+ ### Login
28
+
29
+ Type <code>nuvado login</code> in your terminal and follow the authentication process.
30
+ From then on, any interaction via the CLI will be done with that user.
31
+ You can redo the authentication process at any time to change your current user.
32
+
33
+ ### Uploading a ssh key
34
+
35
+ Type <code>nuvado keys add</code> in your terminal. If you don't have a ssh key available in your system,
36
+ nuvado can create one for you. If you have many, you will be asked to choose which one you want
37
+ to use. Nuvado will ask what name you want to give to your soon-to-be-uploaded ssh key.
38
+
39
+ ### Listing remote and local ssh keys
40
+
41
+ By typing <code>nuvado keys list</code> you can see a list of your local and remote ssh keys.
42
+
43
+ ### Creating a new app
44
+
45
+ Type <code>nuvado apps create [NAME]</code> to create a new app.
46
+ Then, if you are just beginning development, you can <code>git clone -o nuvado [nuvado git server hostname]:your_username/your_app_name</code> and start hacking away.
47
+
48
+ If you have already started development and already use git, nuvado will add a new remote for you.
49
+
50
+ ### Do a build
51
+
52
+ To queue a build you need to run <code>nuvado apps build</code> from your project folder, or <code>nuvado apps build [APP NAME]</code> from somewhere else. In both cases nuvado will output the job id for the build.
53
+
54
+ You can check the status of your last 5 builds by running <code>nuvado apps build_status [APP NAME]</code> (Again, app name is only needed if you are not running the command from your project folder).
55
+
56
+
57
+ ## Contributing
58
+
59
+ 1. Fork it
60
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
61
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
62
+ 4. Push to the branch (`git push origin my-new-feature`)
63
+ 5. Create new Pull Request
64
+
65
+ License
66
+ -------
67
+
68
+ Nuvado is Copyright © 2013 Lacides Charris and Firebase. It is free software,
69
+ and may be redistributed under the terms specified in the MIT-LICENSE file.
data/Rakefile ADDED
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+ require 'rake/testtask'
4
+ Bundler::GemHelper.install_tasks
5
+
6
+ task :console do
7
+ puts "Loading development console..."
8
+ system("irb -r nuvado")
9
+ end
10
+
11
+ task :help do
12
+ puts "Available rake tasks: "
13
+ puts "rake console - Run a IRB console with all enviroment loaded"
14
+ puts "rake spec - Run specs"
15
+ end
16
+
17
+ task :test do
18
+ Dir.chdir('test')
19
+ end
20
+
21
+ Rake::TestTask.new(:test) do |t|
22
+ t.libs << '../lib'
23
+ t.libs << '../test'
24
+ t.test_files = FileList['*_test.rb']
25
+ t.verbose = false
26
+ end
27
+
28
+ desc "Build .deb package for nuvado"
29
+ task :build_deb do
30
+ %x{fpm -s empty -t deb -n nuvado-toolbelt -d git-core -d ruby1.9.1 --after-install post_install.sh -a all}
31
+ end
32
+
33
+ task :default => :test
data/bin/nuvado ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+ require 'nuvado'
3
+
4
+ begin
5
+ Nuvado::Nuvado.start(ARGV)
6
+ rescue Nuvado::SystemExitException => e
7
+ puts e.message
8
+ exit
9
+ rescue Errno::ECONNREFUSED
10
+ puts "Couldn't connect with nuvado's API"
11
+ exit
12
+ end
@@ -0,0 +1,76 @@
1
+ module Nuvado
2
+ class Apps < BaseCommand
3
+
4
+ desc "list", "List your apps"
5
+ def list
6
+ authenticating_action do
7
+ terminal.say Backend::App.all.map(&:name).join("\n")
8
+ end
9
+ end
10
+
11
+ desc "create [NAME]", "Create a new app"
12
+ def create(appname = nil)
13
+ authenticating_action do
14
+ appname ||= terminal.ask("Please type the app name")
15
+ app = Backend::App.new name: appname
16
+ unless app.save
17
+ terminal.say app.errors.full_messages.join(", ")
18
+ return app
19
+ end
20
+ if on_git_repo?
21
+ add_remote("nuvado", app.remote)
22
+ else
23
+ terminal.say app.remote
24
+ end
25
+ app
26
+ end
27
+ end
28
+
29
+ desc "delete [NAME]", "Delete an app"
30
+ def delete(appname = nil)
31
+ authenticating_action do
32
+ appname ||= get_appname
33
+ app = load_app(appname)
34
+ raise SystemExitException.new("App not found") unless app
35
+ app.destroy
36
+ app
37
+ end
38
+ end
39
+
40
+ desc "build [NAME]", "Triggers a build for an app"
41
+ def build(appname = nil)
42
+ authenticating_action do
43
+ appname ||= get_appname
44
+ app = load_app(appname)
45
+ raise SystemExitException.new("App not found") unless app
46
+
47
+ build = Backend::Build.new({:app_id => app.id})
48
+ if build.save
49
+ terminal.say "Build Queued with the job id #{build.id}"
50
+ else
51
+ terminal.say build.errors.full_messages.join(", ")
52
+ end
53
+ build
54
+ end
55
+ end
56
+
57
+ desc "build_status [NAME]", "Shows the status of the last 5 builds for a given app"
58
+ def build_status(appname = nil)
59
+ authenticating_action do
60
+ appname ||= get_appname
61
+ app = load_app(appname)
62
+ raise SystemExitException.new("App not found") unless app
63
+
64
+ builds = Backend::Build.all(:params => {:app_id => app.id, :limit => 5})
65
+ builds.each do |build|
66
+ terminal.say "#{build.id} - #{build.created_at} - #{build.status}\n"
67
+ end
68
+ end
69
+ end
70
+
71
+ private
72
+ def load_app(appname)
73
+ Backend::App.all.find{|app| app.name == appname}
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,6 @@
1
+ module Nuvado
2
+ module Backend
3
+ class App < AuthenticatedResource
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,25 @@
1
+ require "base64"
2
+
3
+ module Nuvado
4
+ module Backend
5
+ class AuthenticatedResource < BasicResource
6
+ class << self
7
+ def configure_authentication(token)
8
+ encoded_token = Base64.strict_encode64(token)
9
+ headers['Accept'] = 'application/json'
10
+ headers['Authorization'] = "Basic #{encoded_token}"
11
+ end
12
+
13
+ def headers
14
+ if defined?(@headers)
15
+ @headers
16
+ elsif superclass != Object && superclass.headers
17
+ superclass.headers
18
+ else
19
+ @headers ||= {}
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,12 @@
1
+ require 'active_resource'
2
+
3
+ module Nuvado
4
+ API_END_POINT = "http://nuvado.io"
5
+ module Backend
6
+ class BasicResource < ActiveResource::Base
7
+ self.include_root_in_json = true
8
+ self.site = API_END_POINT
9
+ self.prefix = "/api/v1/"
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ module Nuvado
2
+ module Backend
3
+ class Build < AuthenticatedResource
4
+ self.prefix = '/api/v1/apps/:app_id/'
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,23 @@
1
+ module Nuvado
2
+ module Backend
3
+ class Git
4
+ def has_git?
5
+ %x{git --version}
6
+ $?.success?
7
+ end
8
+
9
+ def on_git_repo?
10
+ return unless File.exist?('.git')
11
+ true
12
+ end
13
+
14
+ def add_remote(url)
15
+ %x{git remote add nuvado #{url}}
16
+ end
17
+
18
+ def get_remote
19
+ %x{git config remote.nuvado.url}
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,9 @@
1
+ module Nuvado
2
+ module Backend
3
+ class Key < AuthenticatedResource
4
+ def self.from_local_key(local_key, title)
5
+ self.new(:title => title, :content => local_key.blob)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,50 @@
1
+ module Nuvado
2
+ KEY_FOLDER = File.join(OS.home_directory, '.ssh')
3
+ module Backend
4
+ class LocalKey
5
+ attr_accessor :filepath, :blob
6
+ class << self
7
+ def all
8
+ all_filepaths.map{|filepath| from_filepath(filepath)}
9
+ end
10
+
11
+ def all_filepaths
12
+ Dir.glob(File.join(KEY_FOLDER, '*.pub')).sort
13
+ end
14
+
15
+ def find_by_name(filename)
16
+ filepath = File.join(KEY_FOLDER, filename)
17
+ return unless File.exist? filepath
18
+ from_filepath filepath
19
+ end
20
+
21
+ def from_filepath(filepath)
22
+ blob = File.read(filepath)
23
+ self.new(filepath, blob)
24
+ end
25
+
26
+ # lacides: KEY_FOLDER is OS aware, but I'm not sure what happens with FileUtils.mkdir_p or ssh-keygen on windows
27
+ def generate(name = 'id_rsa')
28
+ raise SystemExitException.new("Can't generate. There's already a ssh key with that name") if find_by_name("#{name}.pub")
29
+ FileUtils.mkdir_p(KEY_FOLDER) unless File.exists?(KEY_FOLDER)
30
+ filepath = File.join(KEY_FOLDER, name)
31
+ `ssh-keygen -t rsa -N "" -f \"#{filepath}\"`
32
+ find_by_name("#{name}.pub")
33
+ end
34
+ end
35
+
36
+ def initialize(filepath, blob)
37
+ @filepath = filepath
38
+ @blob = blob
39
+ end
40
+
41
+ def to_s
42
+ filename
43
+ end
44
+
45
+ def filename
46
+ File.basename filepath
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,6 @@
1
+ module Nuvado
2
+ module Backend
3
+ class Session < BasicResource
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,26 @@
1
+ require 'netrc'
2
+
3
+ module Nuvado
4
+ module Backend
5
+ class TokenStore
6
+ def self.read_token
7
+ if OS.unix?
8
+ user, token = Netrc.read[API_END_POINT]
9
+ token
10
+ else
11
+ raise SystemExitException.new("Sorry, your platform is not supported")
12
+ end
13
+ end
14
+
15
+ def self.write_token(user, pass)
16
+ if OS.unix?
17
+ dotnetrc = Netrc.read
18
+ dotnetrc[API_END_POINT] = user, pass
19
+ dotnetrc.save
20
+ else
21
+ raise SystemExitException.new("Sorry, your platform is not supported")
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,6 @@
1
+ module Nuvado
2
+ module Backend
3
+ class User < BasicResource
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,15 @@
1
+ require 'nuvado/backend/git'
2
+ require 'nuvado/backend/local_key'
3
+ require 'nuvado/backend/token_store'
4
+ require 'nuvado/backend/basic_resource'
5
+ require 'nuvado/backend/authenticated_resource'
6
+ require 'nuvado/backend/session'
7
+ require 'nuvado/backend/user'
8
+ require 'nuvado/backend/key'
9
+ require 'nuvado/backend/app'
10
+ require 'nuvado/backend/build'
11
+
12
+ module Nuvado
13
+ module Backend
14
+ end
15
+ end
@@ -0,0 +1,41 @@
1
+ module Nuvado
2
+ class BaseCommand < Thor
3
+ private
4
+ def terminal
5
+ @terminal ||= HighLine.new
6
+ end
7
+
8
+ def authenticating_action
9
+ raise AuthParamsNotSet unless token = Backend::TokenStore.read_token
10
+ Backend::AuthenticatedResource.configure_authentication(token)
11
+
12
+ yield if block_given?
13
+ rescue ActiveResource::UnauthorizedAccess => e
14
+ raise WrongAuthParamsException
15
+ end
16
+
17
+ def get_appname
18
+ get_appname_from_remote || terminal.ask("Please type the app name")
19
+ end
20
+
21
+ def get_appname_from_remote
22
+ return unless on_git_repo?
23
+ return unless git.get_remote =~ /(?<=\/)(.+)(\.git)?$/
24
+ # gituser@hostname:username/appname[.git]
25
+ $1
26
+ end
27
+
28
+ def add_remote(remote, url)
29
+ terminal.say "Adding nuvado remote pointing to #{url}"
30
+ git.add_remote(url)
31
+ end
32
+
33
+ def on_git_repo?
34
+ git.has_git? && git.on_git_repo?
35
+ end
36
+
37
+ def git
38
+ @git ||= Backend::Git.new
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,17 @@
1
+ module Nuvado
2
+ #TODO: Better error messages
3
+
4
+ class SystemExitException < RuntimeError; end
5
+
6
+ class WrongAuthParamsException < SystemExitException
7
+ def initialize
8
+ super "Wrong username/password"
9
+ end
10
+ end
11
+
12
+ class AuthParamsNotSet < SystemExitException
13
+ def initialize
14
+ super "You have not set your auth params, please run 'nuvado login'"
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,39 @@
1
+ require 'uuid'
2
+
3
+ module Nuvado
4
+ class Generate < Thor::Group
5
+ include Thor::Actions
6
+
7
+ def self.source_root
8
+ File.join File.dirname(__FILE__), 'templates'
9
+ end
10
+
11
+ def self.valid_templates
12
+ Dir.glob("#{source_root}/**").map{|f| File.basename(f)}.join ", "
13
+ end
14
+
15
+ argument :product_name
16
+ argument :organization_name, :optional => true
17
+ argument :company_name, :optional => true
18
+
19
+ class_option :template, :default => "empty_project", :desc => "Valid templates: #{valid_templates} "
20
+
21
+ desc "Generate a new ios project from a template"
22
+
23
+ def create_project_from_template
24
+ self.organization_name ||= product_name
25
+ self.company_name ||= product_name
26
+
27
+ directory options[:template], product_name
28
+ end
29
+
30
+ private
31
+ def uuid(id)
32
+ (@uuid ||= {})[id] ||= uuid_generator.generate.gsub("-","")
33
+ end
34
+
35
+ def uuid_generator
36
+ @uuid_generator ||= UUID.new
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,57 @@
1
+ module Nuvado
2
+ class Keys < BaseCommand
3
+
4
+ desc "list [--source=[local|remote]]", "list your keys"
5
+ option :source
6
+ def list
7
+ case options[:source]
8
+ when "local"
9
+ terminal.say Backend::LocalKey.all.map(&:filename).join("\n")
10
+ when "remote"
11
+ authenticating_action do
12
+ terminal.say Backend::Key.all.map(&:title).join("\n")
13
+ end
14
+ else
15
+ terminal.say "Local keys:"
16
+ terminal.say Backend::LocalKey.all.map(&:filename).join("\n")
17
+ terminal.say "Associated Keys:"
18
+ authenticating_action do
19
+ terminal.say Backend::Key.all.map(&:title).join("\n")
20
+ end
21
+ end
22
+ end
23
+
24
+ desc "add [TITLE]", "add a new key"
25
+ def add(title = nil)
26
+ authenticating_action do
27
+ if key = get_or_generate_local_key
28
+ title ||= terminal.ask("Preparing to upload #{key.filename}. What title do you want to give it?")
29
+ remote_key = Backend::Key.from_local_key(key, title)
30
+ unless remote_key.save
31
+ terminal.say remote_key.errors.full_messages.join(", ")
32
+ end
33
+ else
34
+ terminal.say("Ok, remember that you'll need one if you want to upload code")
35
+ end
36
+ end
37
+ end
38
+
39
+ private
40
+ def get_or_generate_local_key
41
+ local_keys = Backend::LocalKey.all
42
+ case local_keys.length
43
+ when 0
44
+ Backend::LocalKey.generate if terminal.agree("Could not find a existing public key. Do you want me to create one? [Yn]")
45
+ when 1
46
+ terminal.say("Found a existing key: #{local_keys.first.filepath}")
47
+ local_keys.first
48
+ else
49
+ terminal.say("Found these keys:")
50
+ terminal.choose do |menu|
51
+ menu.prompt = "Please choose the one you want to use:"
52
+ menu.choices(*local_keys)
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,33 @@
1
+ require 'thor'
2
+ require 'highline'
3
+
4
+ require 'nuvado/base_command'
5
+ require 'nuvado/keys'
6
+ require 'nuvado/apps'
7
+ require 'nuvado/generate'
8
+
9
+ module Nuvado
10
+ class Nuvado < BaseCommand
11
+
12
+ desc "login [USERNAME] [PASSWORD]", "Login to nuvado"
13
+ def login(username = nil, password = nil)
14
+ username ||= terminal.ask("Please type your username")
15
+ password ||= terminal.ask("Please type your password"){|q| q.echo = false}
16
+ token = Backend::Session.create(username: username, password: password).authentication_token
17
+ Backend::TokenStore.write_token username, token
18
+ terminal.say "Login successful!"
19
+ Keys.start(["add"])
20
+ token
21
+ rescue ActiveResource::UnauthorizedAccess => e
22
+ raise WrongAuthParamsException
23
+ end
24
+
25
+ desc "apps SUBCOMMAND [<ARGS>]", "Manage apps"
26
+ subcommand "apps", Apps
27
+
28
+ desc "keys SUBCOMMAND [<ARGS>]", "Manage keys"
29
+ subcommand "keys", Keys
30
+
31
+ register Generate, 'generate', 'generate', 'Generate an application from a template'
32
+ end
33
+ end
data/lib/nuvado/os.rb ADDED
@@ -0,0 +1,22 @@
1
+ module OS
2
+ def self.windows?
3
+ (/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil
4
+ end
5
+
6
+ def self.mac?
7
+ (/darwin/ =~ RUBY_PLATFORM) != nil
8
+ end
9
+
10
+ def self.unix?
11
+ !windows?
12
+ end
13
+
14
+ def self.linux?
15
+ unix? && !mac?
16
+ end
17
+
18
+ # for ssh stuff
19
+ def self.home_directory
20
+ windows? ? ENV['USERPROFILE'].gsub("\\","/") : ENV['HOME']
21
+ end
22
+ end