fallcli 0.1.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0ba9483a4dca769bd5b81f3e085a81002d1bf187
4
+ data.tar.gz: f192f00a01c5c3ea3a76223b35066bc81338fa82
5
+ SHA512:
6
+ metadata.gz: e612c373df9e6a0f3c3822401e6400e7c6cd31ba63c63ce8ffbf16ff93bef8cd6338c777b707c699c451dab1a4e7ac1d7f6f624bab3b28432d8a66708d5a67d4
7
+ data.tar.gz: 9de372728cbdfe3b54a56846f69f8aa2dc5b4d577a51abec21627d5f43124e0b91031480b1372b6c7f857ce9e5194e4e345e62c7fdf3832e87b2f57956d5507c
@@ -0,0 +1,12 @@
1
+ *.gem
2
+ *.rbc
3
+ *~
4
+ *.swp
5
+ *.swo
6
+ .bundle
7
+ .rvmrc
8
+ Gemfile.lock
9
+ doc/*
10
+ log/*
11
+ pkg/*
12
+ coverage/*
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.0
4
+ - 2.1.0
5
+ - 2.0.0
6
+ matrix:
7
+ allow_failures:
8
+ - rvm: 2.2.0
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Peter Souter
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.
@@ -0,0 +1,45 @@
1
+ # FallCLI
2
+ [![Build Status](https://travis-ci.org/petems/fallcli.svg)](https://travis-ci.org/petems/fallcli)
3
+
4
+ A hack for the [London Dropbox Hackathon](http://lanyrd.com/2015/london-dropbox-hackathon/)
5
+
6
+ I'm probably going to refactor this into [Slipsquare](https://github.com/petems/slipsquare) in the future, as I recycled a lot of code :smile:
7
+
8
+ ### Installation
9
+
10
+ gem install fallcli
11
+
12
+ ### Configuration
13
+
14
+ Run the configuration utility, `fallcli authorize`.
15
+
16
+ ### File browser
17
+
18
+ ```
19
+ $ fallcli browser
20
+ ```
21
+
22
+ Screenshot:
23
+ ![screenshot 2015-01-25 06 02 36](https://cloud.githubusercontent.com/assets/1064715/5890542/2949c490-a458-11e4-9e4c-935f6c623f77.png)
24
+
25
+ ### Upload Browser
26
+
27
+ ```
28
+ $ slipsquare uploader-browser
29
+ ```
30
+
31
+ Screenshot:
32
+ ![screenshot 2015-01-25 06 04 05](https://cloud.githubusercontent.com/assets/1064715/5890539/24dfc6e8-a458-11e4-8114-8f740f59db70.png)
33
+
34
+ ## Help
35
+
36
+ For a complete overview of all of the available commands, run:
37
+
38
+ $ slipsquare help
39
+
40
+ Feel free to open issues in case of bugs or improvments.
41
+
42
+ ## Contributing
43
+
44
+ See the [contributing guide](CONTRIBUTING.md). Pull-requests welcome!
45
+
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ Signal.trap("INT") { exit 1 }
4
+
5
+ require "fallcli"
6
+
7
+ FallCli::CLI.start(ARGV)
@@ -0,0 +1,35 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'fallcli/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "fallcli"
8
+ gem.version = FallCli::VERSION
9
+ gem.authors = ["Peter Souter"]
10
+ gem.email = ["p.morsou@gmail.com"]
11
+ gem.description = %q{A curses CLI app for Dropbox}
12
+ gem.summary = %q{FallCli is a curses CLI app for Dropbox}
13
+ gem.homepage = "https://github.com/petems/fallcli"
14
+ gem.license = 'MIT'
15
+
16
+ gem.files = `git ls-files`.split($/)
17
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
18
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
+ gem.require_paths = ["lib"]
20
+
21
+ gem.add_dependency "thor", "~> 0.18.1"
22
+ gem.add_dependency "middleware" , "~> 0.1.0"
23
+
24
+ gem.add_dependency "dropbox-api-petems", "1.1.0"
25
+ gem.add_dependency "dispel", "0.0.7"
26
+ gem.add_dependency "ruby-progressbar", "~> 1.2.0"
27
+
28
+ gem.add_development_dependency "rake", "~> 10.1.0"
29
+ gem.add_development_dependency "rspec-core", "~> 2.13.0"
30
+ gem.add_development_dependency "rspec-expectations", "~> 2.13.0"
31
+ gem.add_development_dependency "rspec-mocks", "~> 2.13.0"
32
+ gem.add_development_dependency "webmock", "~> 1.11.0"
33
+ gem.add_development_dependency "coveralls", "~> 0.7.1"
34
+
35
+ end
@@ -0,0 +1,6 @@
1
+ require 'fallcli/cli'
2
+ require 'fallcli/config'
3
+ require 'fallcli/version'
4
+
5
+ module FallCli
6
+ end
@@ -0,0 +1,29 @@
1
+ module FallCli
2
+ class BrowserHelper
3
+ attr_accessor :position
4
+
5
+ def initialize items
6
+ @files = Array.new
7
+ items.each { |item| @files << item }
8
+ @position = 0
9
+ end
10
+
11
+ def show_files
12
+ @files.each_with_index.map do |item, index|
13
+ position == index ? "[#{pretty_dropbox_file(item)}]" : " #{pretty_dropbox_file(item)} "
14
+ end
15
+ end
16
+
17
+ def pretty_dropbox_file file
18
+ "#{file.path} | #{file.mime_type} | #{file.size}"
19
+ end
20
+
21
+ def position_up
22
+ @position -= 1 unless @position < 1
23
+ end
24
+
25
+ def position_down
26
+ @position += 1 unless @position == (@files.size - 1)
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,69 @@
1
+ require 'thor'
2
+
3
+ module FallCli
4
+ autoload :Middleware, "fallcli/middleware"
5
+
6
+ class CLI < Thor
7
+ include Thor::Actions
8
+ ENV['THOR_COLUMNS'] = '120'
9
+
10
+ !check_unknown_options
11
+
12
+ map "--version" => :version,
13
+ "-v" => :version
14
+
15
+ desc "help [COMMAND]", "Describe commands or a specific command"
16
+ def help(meth=nil)
17
+ super
18
+ if !meth
19
+ say "To learn more or to contribute, please see github.com/petems/fallcli"
20
+ end
21
+ end
22
+
23
+ desc "authorize", "Authorize a Dropbox account with fallcli"
24
+ long_desc "This takes you through a workflow for adding configuration
25
+ details to fallcli."
26
+ def authorize
27
+ Middleware.sequence_authorize.call({})
28
+ end
29
+
30
+ desc "browser", "Run the browser"
31
+ long_desc "This is the file browser that renders a CLI to browse your Dropbox
32
+ files, and you can navigate using the arrow keys"
33
+ def browser
34
+ Middleware.sequence_browser.call({})
35
+ end
36
+
37
+ desc "uploader-browser", "Run the upload-browser"
38
+ long_desc "This is the file browser that renders your local file system files
39
+ files, and you can upload with the CLI"
40
+ def uploader_browser
41
+ Middleware.sequence_upload_browser.call({})
42
+ end
43
+
44
+ desc "verify", "Check your given credentials are valid"
45
+ long_desc "This checks that the credentials in ~/.fallcli are correct"
46
+ def verify
47
+ Middleware.sequence_verify.call({})
48
+ end
49
+
50
+ desc "get-keys", "Get your app and secret keys"
51
+ def get_keys
52
+ say "Please open this URL from your Browser, and login: https://www.dropbox.com/developers/apps"
53
+ say "Click \"Create app\" button, and choose the following options:"
54
+ say "Type: Dropbox API app"
55
+ say "Data: Files and Datastores"
56
+ say "Permission type: Full Dropbox"
57
+ say "File Types: All file types"
58
+ say "App name: FallCli#{Time.now.to_i}"
59
+ say "Cick on the \"Create\" button, and note down the 'app key' and 'app secret'"
60
+ end
61
+
62
+ desc "version", "Show version"
63
+ def version
64
+ say "FallCli #{FallCli::VERSION}"
65
+ end
66
+
67
+ end
68
+ end
69
+
@@ -0,0 +1,69 @@
1
+ require 'singleton'
2
+ require 'fileutils'
3
+
4
+ module FallCli
5
+ # This is the configuration object. It reads in configuration
6
+ # from a .fallcli file located in the user's home directory
7
+
8
+ class Configuration
9
+ include Singleton
10
+ attr_reader :data
11
+ attr_reader :path
12
+
13
+ FILE_NAME = '.fallcli/config'
14
+
15
+ def initialize
16
+ @path = ENV["FALLCLI_CONFIG_PATH"] || File.join(File.expand_path("~"), FILE_NAME)
17
+ @data = self.load_config_file
18
+ end
19
+
20
+ # If we can't load the config file, self.data is nil, which we can
21
+ # check for in CheckConfiguration
22
+ def load_config_file
23
+ require 'yaml'
24
+ YAML.load_file(@path)
25
+ rescue Errno::ENOENT
26
+ return
27
+ end
28
+
29
+ def app_key
30
+ @data['authentication']['app_key']
31
+ end
32
+
33
+ def secret_key
34
+ @data['authentication']['secret_key']
35
+ end
36
+
37
+ def app_token
38
+ @data['client']['app_token']
39
+ end
40
+
41
+ def app_secret
42
+ @data['client']['app_secret']
43
+ end
44
+
45
+ # Re-runs initialize
46
+ def reset!
47
+ self.send(:initialize)
48
+ end
49
+
50
+ # Re-loads the config
51
+ def reload!
52
+ @data = self.load_config_file
53
+ end
54
+
55
+ # Writes a config file
56
+ def create_config_file(app_key, secret_key, app_token, app_secret)
57
+ FileUtils.mkdir_p File.join(File.expand_path("~"),'.fallcli/')
58
+ require 'yaml'
59
+ File.open(@path, File::RDWR|File::TRUNC|File::CREAT, 0600) do |file|
60
+ data = {
61
+ "authentication" => { "app_key" => app_key, "secret_key" => secret_key },
62
+ "client" => { "app_token" => app_token, "app_secret" => app_secret }
63
+ }
64
+ file.write data.to_yaml
65
+ end
66
+ end
67
+
68
+ end
69
+ end
@@ -0,0 +1,55 @@
1
+ require "middleware"
2
+
3
+ module FallCli
4
+ module Middleware
5
+ autoload :Base, "fallcli/middleware/base"
6
+
7
+ autoload :AskForCredentials, "fallcli/middleware/ask_for_credentials"
8
+ autoload :Browser, "fallcli/middleware/browser"
9
+ autoload :CheckConfiguration, "fallcli/middleware/check_configuration"
10
+ autoload :CheckCredentials, "fallcli/middleware/check_credentials"
11
+ autoload :InjectClient, "fallcli/middleware/inject_client"
12
+ autoload :InjectConfiguration, "fallcli/middleware/inject_configuration"
13
+ autoload :UploaderBrowser, "fallcli/middleware/upload_browser"
14
+
15
+ def self.sequence_authorize
16
+ ::Middleware::Builder.new do
17
+ use InjectConfiguration
18
+ use AskForCredentials
19
+ use InjectConfiguration
20
+ use CheckConfiguration
21
+ use InjectClient
22
+ use CheckCredentials
23
+ end
24
+ end
25
+
26
+ def self.sequence_browser
27
+ ::Middleware::Builder.new do
28
+ use InjectConfiguration
29
+ use CheckConfiguration
30
+ use InjectClient
31
+ use Browser
32
+ end
33
+ end
34
+
35
+ def self.sequence_upload_browser
36
+ ::Middleware::Builder.new do
37
+ use InjectConfiguration
38
+ use CheckConfiguration
39
+ use InjectClient
40
+ use CheckCredentials
41
+ use UploaderBrowser
42
+ end
43
+ end
44
+
45
+ def self.sequence_verify
46
+ ::Middleware::Builder.new do
47
+ use InjectConfiguration
48
+ use CheckConfiguration
49
+ use InjectClient
50
+ use CheckCredentials
51
+ end
52
+ end
53
+
54
+ end
55
+ end
@@ -0,0 +1,39 @@
1
+ require "dropbox-api"
2
+ require "cgi"
3
+
4
+ module FallCli
5
+ module Middleware
6
+ # Ask for user credentials from the command line, then write them out.
7
+ class AskForCredentials < Base
8
+ def call(env)
9
+
10
+ say "If you dont know your app and secret key, try `fallcli get-keys`"
11
+
12
+ app_key = ask "Enter your App key:"
13
+ secret_key = ask "Enter your Secret key:"
14
+
15
+ Dropbox::API::Config.app_key = app_key
16
+ Dropbox::API::Config.app_secret = secret_key
17
+
18
+ consumer = Dropbox::API::OAuth.consumer(:authorize)
19
+ request_token = consumer.get_request_token
20
+ say "Go to this url and click 'Authorize' to get the token:"
21
+ say request_token.authorize_url, :green
22
+ query = request_token.authorize_url.split('?').last
23
+ params = CGI.parse(query)
24
+ token = params['oauth_token'].first
25
+ yes? "Once you authorize the app on Dropbox, type yes... "
26
+ access_token = request_token.get_access_token(:oauth_verifier => token)
27
+
28
+ # Write the config file.
29
+ env['config'].create_config_file(app_key, secret_key, access_token.token, access_token.secret)
30
+ env['config'].reload!
31
+
32
+ say "Credentials saved to ~/.fallcli"
33
+
34
+ @app.call(env)
35
+ end
36
+ end
37
+ end
38
+ end
39
+
@@ -0,0 +1,28 @@
1
+ module FallCli
2
+ module Middleware
3
+ # A base middleware class to initalize.
4
+ class Base
5
+ # Some colors for making things pretty.
6
+ CLEAR = "\e[0m"
7
+ RED = "\e[31m"
8
+ GREEN = "\e[32m"
9
+ YELLOW = "\e[33m"
10
+
11
+ # We want access to all of the fun thor cli helper methods,
12
+ # like say, yes?, ask, etc.
13
+ include Thor::Shell
14
+
15
+ def initialize(app)
16
+ @app = app
17
+ # This resets the color to "clear" on the user's terminal.
18
+ say "", :clear, false
19
+ end
20
+
21
+ def call(env)
22
+ @app.call(env)
23
+ end
24
+
25
+ end
26
+ end
27
+ end
28
+