gspush 0.0.1 → 0.0.2

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.
data/bin/gspush CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require File.dirname(__FILE__) + '/../lib/gspush'
3
+ require File.expand_path(File.dirname(__FILE__) + '/../lib/gspush')
4
4
 
5
5
  Gspush::CLI.execute(ARGV)
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.expand_path(File.dirname(__FILE__) + '/../lib/gspush/oauth2')
4
+
5
+ # FIXME: give file path
6
+ Gspush::Oauth2.generate
7
+
@@ -16,5 +16,8 @@ Gem::Specification.new do |gem|
16
16
  gem.version = Gspush::VERSION
17
17
 
18
18
  gem.add_dependency "google_drive"
19
- gem.add_development_dependency "rspec"
19
+
20
+ ["rspec", "fakefs"].each do |g|
21
+ gem.add_development_dependency g
22
+ end
20
23
  end
@@ -1,7 +1,11 @@
1
1
  require 'optparse'
2
2
  require 'google_drive'
3
+ require 'oauth2'
4
+ require 'yaml'
5
+ require 'highline'
3
6
 
4
7
  require_relative './gspush/version'
8
+ require_relative './gspush/oauth2'
5
9
 
6
10
  class Gspush
7
11
  class WorksheetNotFound < StandardError; end
@@ -16,6 +20,9 @@ class Gspush
16
20
  @username = options[:username]
17
21
  @password = options[:password]
18
22
 
23
+ @oauth2 = options[:oauth2]
24
+ @oauth_token_file = options[:oauth_token_file]
25
+
19
26
  @prepend_timestamp = options[:prepend_timestamp]
20
27
  @sheet_title = options[:sheet_title]
21
28
 
@@ -40,7 +47,7 @@ class Gspush
40
47
  end
41
48
 
42
49
  def save
43
- spreadsheet = open(@url, @username, @password)
50
+ spreadsheet = open(@url)
44
51
 
45
52
  sheet = select_worksheet(spreadsheet)
46
53
  raise WorksheetNotFound if sheet.nil?
@@ -53,9 +60,14 @@ class Gspush
53
60
 
54
61
  private
55
62
 
56
- def open(url, username, password)
57
- session = GoogleDrive.login(username, password)
58
- spreadsheet = session.spreadsheet_by_url(url)
63
+ def open(url)
64
+ session = if @oauth2
65
+ oauth = Gspush::Oauth2.new(@oauth_token_file)
66
+ GoogleDrive.login_with_oauth(oauth.token)
67
+ else
68
+ GoogleDrive.login(username, password)
69
+ end
70
+ session.spreadsheet_by_url(url)
59
71
  end
60
72
 
61
73
  def select_worksheet(spreadsheet)
@@ -89,6 +101,8 @@ class Gspush
89
101
  opt.on('-d delim', 'input delimiter') {|v| options[:delimiter] = v }
90
102
  opt.on('-u username', 'Google Drive username(email)') {|v| options[:username] = v }
91
103
  opt.on('-p password', 'user password') {|v| options[:password] = v } # XXX how should i get this?
104
+ opt.on('-o', 'using oauth2 authorize') {|v| options[:oauth2] = v }
105
+ opt.on('-f oauth_token_file', 'oauth2 token file path') {|v| options[:oauth_token_file] = v }
92
106
  opt.on('-s sheet_title', 'worksheet title (default: first worksheet)') {|v| options[:sheet_title] = v }
93
107
  opt.on('-t', 'prepend timestamp cell') {|v| options[:prepend_timestamp] = v }
94
108
 
@@ -97,7 +111,7 @@ class Gspush
97
111
 
98
112
  argv = opt.parse(argv_original)
99
113
 
100
- if argv.empty?
114
+ if argv.empty? && !options[:generate_token_file]
101
115
  puts opt.banner
102
116
  exit 1
103
117
  end
@@ -0,0 +1,109 @@
1
+ require 'highline'
2
+ require 'oauth2'
3
+
4
+ class Gspush
5
+ class Oauth2
6
+ attr_accessor :access_token, :refresh_token, :expires_at
7
+ attr_accessor :client_id, :client_secret, :redirect_uri
8
+
9
+ def initialize(file_path = nil)
10
+ @file_path = file_path || "#{ENV["HOME"]}/.gspushrc"
11
+ @redirect_uri = "urn:ietf:wg:oauth:2.0:oob"
12
+ end
13
+
14
+ def token
15
+ self.load or raise "First you need gspush_generate to create oauth2 configuration"
16
+ token = OAuth2::AccessToken.from_hash(client, to_hash)
17
+
18
+ if expired?
19
+ token.refresh!
20
+ save
21
+ end
22
+
23
+ token
24
+ end
25
+
26
+ def self.generate
27
+ puts "Input your application information"
28
+ puts "(see https://code.google.com/apis/console )"
29
+
30
+ oauth2 = new
31
+
32
+ hi = HighLine.new
33
+ oauth2.client_id = hi.ask("Client ID? > ")
34
+ oauth2.client_secret = hi.ask("Client Secret? > ")
35
+
36
+ oauth2.get_access_token
37
+ oauth2.save
38
+ end
39
+
40
+ def save
41
+ File.open(@file_path, 'w') do |f|
42
+ f.print to_hash.to_yaml
43
+ end
44
+ puts "ok saved in #{@file_path}"
45
+ end
46
+
47
+ def load
48
+ if FileTest.exist?(@file_path)
49
+ o = YAML.load(File.read(@file_path))
50
+ @access_token = o[:access_token]
51
+ @refresh_token = o[:refresh_token]
52
+ @expires_at = o[:expires_at]
53
+ @client_id = o[:client_id]
54
+ @client_secret = o[:client_secret]
55
+ @redirect_uri = o[:redirect_uri]
56
+ true
57
+ else
58
+ false
59
+ end
60
+ end
61
+
62
+ def client
63
+ OAuth2::Client.new(
64
+ @client_id, @client_secret,
65
+ :site => "https://accounts.google.com",
66
+ :token_url => "/o/oauth2/token",
67
+ :authorize_url => "/o/oauth2/auth")
68
+ end
69
+
70
+ def get_access_token
71
+ auth_url = client.auth_code.authorize_url(
72
+ :redirect_uri => @redirect_uri,
73
+ :scope =>
74
+ ["https://docs.google.com/feeds/",
75
+ "https://docs.googleusercontent.com/",
76
+ "https://spreadsheets.google.com/feeds/"].join(" "))
77
+ hi = HighLine.new
78
+
79
+ puts "Access in your browser: #{auth_url}"
80
+ authorization_code = hi.ask("And please input authorization code: ")
81
+
82
+ auth_token = client.auth_code.get_token(
83
+ authorization_code, :redirect_uri => @redirect_uri)
84
+
85
+ @access_token = auth_token.token
86
+ @refresh_token = auth_token.refresh_token
87
+ @expires_at = auth_token.expires_at
88
+
89
+ @access_token
90
+ end
91
+
92
+ def expired?
93
+ @expires_at && Time.now.to_i > @expires_at
94
+ end
95
+
96
+ def to_hash
97
+ {
98
+ :client_id => client_id,
99
+ :client_secret => client_secret,
100
+ :redirect_uri => redirect_uri,
101
+ :access_token => access_token,
102
+ :refresh_token => refresh_token,
103
+ :expires_at => expires_at,
104
+ }
105
+ end
106
+ end
107
+ end
108
+
109
+
@@ -1,3 +1,3 @@
1
1
  class Gspush
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -1,4 +1,4 @@
1
- require 'gspush'
1
+ require 'spec_helper'
2
2
 
3
3
  describe Gspush do
4
4
  let(:url) { 'http://example.com/ '} # FIXME
@@ -0,0 +1,10 @@
1
+ require 'rspec'
2
+ require 'gspush'
3
+
4
+ # Requires supporting files with custom matchers and macros, etc,
5
+ # in ./support/ and its subdirectories.
6
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
7
+
8
+ RSpec.configure do |config|
9
+ end
10
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gspush
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-28 00:00:00.000000000 Z
12
+ date: 2012-10-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: google_drive
@@ -43,11 +43,28 @@ dependencies:
43
43
  - - ! '>='
44
44
  - !ruby/object:Gem::Version
45
45
  version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: fakefs
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
46
62
  description: Push command to Google Spreadsheet
47
63
  email:
48
64
  - holysugar@gmail.com
49
65
  executables:
50
66
  - gspush
67
+ - gspush_generate
51
68
  extensions: []
52
69
  extra_rdoc_files: []
53
70
  files:
@@ -57,10 +74,13 @@ files:
57
74
  - README.md
58
75
  - Rakefile
59
76
  - bin/gspush
77
+ - bin/gspush_generate
60
78
  - gspush.gemspec
61
79
  - lib/gspush.rb
80
+ - lib/gspush/oauth2.rb
62
81
  - lib/gspush/version.rb
63
82
  - spec/gspush_spec.rb
83
+ - spec/spec_helper.rb
64
84
  homepage: https://github.com/holysugar/gspush
65
85
  licenses: []
66
86
  post_install_message:
@@ -87,3 +107,4 @@ specification_version: 3
87
107
  summary: Phsh command to Google Spreadsheet
88
108
  test_files:
89
109
  - spec/gspush_spec.rb
110
+ - spec/spec_helper.rb