datapimp 0.0.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +2 -0
- data/Gemfile +6 -0
- data/Guardfile +5 -0
- data/LICENSE.txt +4 -18
- data/README.md +199 -17
- data/Rakefile +24 -0
- data/bin/datapimp +18 -0
- data/datapimp.gemspec +27 -7
- data/lib/datapimp/cli/01_extensions.rb +25 -0
- data/lib/datapimp/cli/config.rb +24 -0
- data/lib/datapimp/cli/setup.rb +35 -0
- data/lib/datapimp/cli/sync.rb +29 -0
- data/lib/datapimp/cli.rb +49 -0
- data/lib/datapimp/clients/amazon.rb +172 -0
- data/lib/datapimp/clients/dropbox.rb +178 -0
- data/lib/datapimp/clients/github.rb +59 -0
- data/lib/datapimp/clients/google.rb +145 -0
- data/lib/datapimp/configuration.rb +210 -0
- data/lib/datapimp/core_ext.rb +5 -0
- data/lib/datapimp/data_sources/dropbox.rb +8 -0
- data/lib/datapimp/data_sources/excel.rb +5 -0
- data/lib/datapimp/data_sources/github.rb +5 -0
- data/lib/datapimp/data_sources/google.rb +5 -0
- data/lib/datapimp/data_sources/json.rb +5 -0
- data/lib/datapimp/data_sources/nokogiri.rb +5 -0
- data/lib/datapimp/data_sources.rb +10 -0
- data/lib/datapimp/sync/dropbox_delta.rb +67 -0
- data/lib/datapimp/sync/dropbox_folder.rb +10 -0
- data/lib/datapimp/sync/google_drive_folder.rb +5 -0
- data/lib/datapimp/sync.rb +30 -0
- data/lib/datapimp/version.rb +1 -1
- data/lib/datapimp.rb +30 -2
- data/packaging/wrapper.sh +32 -0
- data/spec/spec_helper.rb +29 -0
- data/spec/support/test_helpers.rb +7 -0
- data/tasks/distribution/configuration.rb +15 -0
- data/tasks/distribution/executable.rb +28 -0
- data/tasks/distribution/package.rb +85 -0
- data/tasks/distribution/package_helpers.rb +12 -0
- data/tasks/distribution/release.rb +49 -0
- data/tasks/distribution/release_notes.erb +14 -0
- data/tasks/distribution/release_notes.rb +62 -0
- data/tasks/distribution/tarball.rb +47 -0
- data/tasks/distribution/travelling_ruby.rb +87 -0
- data/tasks/package.rake +41 -0
- data/tasks/upload.rake +40 -0
- metadata +300 -26
@@ -0,0 +1,172 @@
|
|
1
|
+
module Datapimp
|
2
|
+
module Clients
|
3
|
+
class Amazon
|
4
|
+
include Singleton
|
5
|
+
|
6
|
+
require 'fog/aws'
|
7
|
+
|
8
|
+
def aws_access_key_id
|
9
|
+
options[:aws_access_key_id] || options[:access_key_id] || Datapimp.config.aws_access_key_id
|
10
|
+
end
|
11
|
+
|
12
|
+
def aws_secret_access_key
|
13
|
+
options[:aws_secret_access_key] || options[:secret_access_key] || Datapimp.config.aws_secret_access_key
|
14
|
+
end
|
15
|
+
|
16
|
+
def storage
|
17
|
+
return @storage if @storage
|
18
|
+
|
19
|
+
# Silence fog warnings
|
20
|
+
Fog::Logger.define_singleton_method(:warning) do |*args|
|
21
|
+
nil
|
22
|
+
end
|
23
|
+
|
24
|
+
@storage = Fog::Storage.new({
|
25
|
+
provider: 'AWS',
|
26
|
+
aws_access_key_id: aws_access_key_id,
|
27
|
+
aws_secret_access_key: aws_secret_access_key,
|
28
|
+
path_style: true
|
29
|
+
})
|
30
|
+
|
31
|
+
|
32
|
+
@storage
|
33
|
+
end
|
34
|
+
|
35
|
+
def cdn
|
36
|
+
@cdn ||= Fog::CDN.new({
|
37
|
+
provider: 'AWS',
|
38
|
+
aws_access_key_id: aws_access_key_id,
|
39
|
+
aws_secret_access_key: aws_secret_access_key
|
40
|
+
})
|
41
|
+
end
|
42
|
+
|
43
|
+
def s3_bucket_website_url
|
44
|
+
if s3_bucket.is_a?(Fog::Storage::AWS::Directory)
|
45
|
+
website_url_for(s3_bucket)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def site_description
|
50
|
+
options[:description] || options[:site_name] || s3_bucket.key
|
51
|
+
end
|
52
|
+
|
53
|
+
# the domain, and the domain with www
|
54
|
+
def site_domain_aliases
|
55
|
+
options[:aliases]
|
56
|
+
end
|
57
|
+
|
58
|
+
def s3_bucket
|
59
|
+
if bucket_name = options[:bucket_name] || Datapimp.config.get("bucket_name")
|
60
|
+
if bucket = find_bucket_by_name(bucket_name)
|
61
|
+
return bucket
|
62
|
+
else
|
63
|
+
"There is no bucket named: #{ bucket_name }. You can create one by running 'datapimp setup amazon --create-bucket=BUCKET_NAME"
|
64
|
+
end
|
65
|
+
else
|
66
|
+
raise 'Could not determine bucketname for Datapimp.amazon.s3_bucket'
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def create_cdn_for(website_url, comment, aliases)
|
71
|
+
aliases = aliases.join(",") if aliases.is_a?(Array)
|
72
|
+
|
73
|
+
existing = cdn.distributions.find do |distribution|
|
74
|
+
distribution.comment == comment
|
75
|
+
end
|
76
|
+
|
77
|
+
return existing if existing
|
78
|
+
|
79
|
+
cdn.distributions.create(cdn_options(website_url: website_url, comment: comment, aliases: aliases))
|
80
|
+
end
|
81
|
+
|
82
|
+
def cdn_options(o={})
|
83
|
+
{
|
84
|
+
enabled: true,
|
85
|
+
custom_origin: {
|
86
|
+
'DNSName'=> o.fetch(:website_url) { s3_bucket_website_url },
|
87
|
+
'OriginProtocolPolicy'=>'http-only'
|
88
|
+
},
|
89
|
+
comment: o.fetch(:comment) { site_description },
|
90
|
+
caller_reference: Time.now.to_i.to_s,
|
91
|
+
cname: o.fetch(:aliases) { site_domain_aliases },
|
92
|
+
default_root_object: 'index.html'
|
93
|
+
}
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.client(options={})
|
97
|
+
@client ||= begin
|
98
|
+
instance.with_options(options)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
|
103
|
+
def self.method_missing(meth, *args, &block)
|
104
|
+
if client.respond_to?(meth)
|
105
|
+
return client.send(meth, *args, &block)
|
106
|
+
end
|
107
|
+
|
108
|
+
super
|
109
|
+
end
|
110
|
+
|
111
|
+
def website_host_for(bucket_or_bucket_name)
|
112
|
+
URI.parse(website_url_for(bucket_or_bucket_name)).host
|
113
|
+
end
|
114
|
+
|
115
|
+
def website_url_for(bucket_or_bucket_name)
|
116
|
+
bucket = bucket_or_bucket_name
|
117
|
+
|
118
|
+
if bucket_or_bucket_name.is_a?(String)
|
119
|
+
bucket = storage.directories.get(bucket_or_bucket_name)
|
120
|
+
end
|
121
|
+
|
122
|
+
if bucket
|
123
|
+
"http://#{bucket.key}.s3-website-#{ bucket.location }.amazonaws.com"
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def find_or_create_bucket(bucket_name)
|
128
|
+
find_bucket_by_name(bucket_name) || create_bucket(bucket_name)
|
129
|
+
end
|
130
|
+
|
131
|
+
def find_bucket_by_name(bucket_name)
|
132
|
+
storage.directories.get(bucket_name) rescue nil
|
133
|
+
end
|
134
|
+
|
135
|
+
def create_bucket(bucket_name)
|
136
|
+
storage.directories.create(key: bucket_name, public: true).tap do |bucket|
|
137
|
+
storage.put_bucket_website(bucket_name, 'index.html', key: 'error.html')
|
138
|
+
#storage.put_bucket_cors(bucket_name, {"AllowedOrigin"=>"*","AllowedMethod"=>"GET","AllowedHeader"=>"Authorization"})
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def create_redirect_bucket(bucket_name, redirect_to_bucket_name)
|
143
|
+
create_bucket(redirect_to_bucket_name) unless find_bucket_by_name(redirect_to_bucket_name)
|
144
|
+
create_bucket(bucket_name)
|
145
|
+
end
|
146
|
+
|
147
|
+
def with_options(opts={})
|
148
|
+
options.merge!(opts)
|
149
|
+
self
|
150
|
+
end
|
151
|
+
|
152
|
+
def options
|
153
|
+
@options ||= {}
|
154
|
+
end
|
155
|
+
|
156
|
+
def has_application_keys?
|
157
|
+
(Datapimp.config.aws_access_key_id.to_s.length > 0 && Datapimp.config.aws_secret_access_key.to_s.length > 0)
|
158
|
+
end
|
159
|
+
|
160
|
+
def interactive_setup(options={})
|
161
|
+
secret_key = Datapimp.config.aws_secret_access_key.to_s
|
162
|
+
access_key_id = Datapimp.config.aws_access_key_id.to_s
|
163
|
+
|
164
|
+
secret_key = ask("What is the AWS Secret Access Key?") unless secret_key.length > 8
|
165
|
+
access_key_id = ask("What is the AWS Access Key ID?") unless access_key_id.length > 8
|
166
|
+
|
167
|
+
Datapimp.config.set(:aws_access_key_id, access_key_id) if access_key_id.length > 8
|
168
|
+
Datapimp.config.set(:aws_secret_access_key, secret_key) if secret_key.length > 8
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
@@ -0,0 +1,178 @@
|
|
1
|
+
module Datapimp
|
2
|
+
module Clients
|
3
|
+
class Dropbox
|
4
|
+
include Singleton
|
5
|
+
|
6
|
+
def self.method_missing(meth, *args, &block)
|
7
|
+
if client.respond_to?(meth)
|
8
|
+
return client.send(meth, *args, &block)
|
9
|
+
end
|
10
|
+
|
11
|
+
super
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.client(options={})
|
15
|
+
require 'dropbox-api' unless defined?(::Dropbox::API)
|
16
|
+
@client ||= begin
|
17
|
+
::Dropbox::API::Config.app_key = options.fetch(:dropbox_app_key) { Datapimp.config.dropbox_app_key }
|
18
|
+
::Dropbox::API::Config.app_secret = options.fetch(:dropbox_app_secret) { Datapimp.config.dropbox_app_secret }
|
19
|
+
::Dropbox::API::Config.mode = options.fetch(:dropbox_app_type) { Datapimp.config.dropbox_app_type }
|
20
|
+
instance.with_options(options)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def sandboxed_app?
|
25
|
+
entry = api.ls.first
|
26
|
+
entry && entry.root == "app_folder"
|
27
|
+
end
|
28
|
+
|
29
|
+
def api
|
30
|
+
@api ||= begin
|
31
|
+
token = options.fetch(:token) { Datapimp.config.dropbox_client_token }
|
32
|
+
secret = options.fetch(:secret) { Datapimp.config.dropbox_client_secret }
|
33
|
+
::Dropbox::API::Client.new(token: token , secret: secret)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def find(path)
|
38
|
+
api.find(path)
|
39
|
+
rescue ::Dropbox::API::Error::NotFound
|
40
|
+
nil
|
41
|
+
end
|
42
|
+
|
43
|
+
def push_from(local_path, options={})
|
44
|
+
path_prefix = options.fetch(:prefix)
|
45
|
+
root = options[:root]
|
46
|
+
|
47
|
+
unless find(path_prefix)
|
48
|
+
api.mkdir(path_prefix)
|
49
|
+
end
|
50
|
+
|
51
|
+
uploader = lambda do |node|
|
52
|
+
next if node.to_s == ".DS_Store"
|
53
|
+
|
54
|
+
if node.directory?
|
55
|
+
Array(node.children).each(&uploader)
|
56
|
+
elsif node.file?
|
57
|
+
relative = node.relative_path_from(local_path)
|
58
|
+
target = "#{path_prefix}/#{relative}"
|
59
|
+
target = target.gsub(/^\//,'')
|
60
|
+
api.upload(target, node.read)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
Pathname(local_path).children.each(&uploader)
|
65
|
+
end
|
66
|
+
|
67
|
+
def create_site_folder(folder, allow_overwrite=false)
|
68
|
+
found = find(folder)
|
69
|
+
|
70
|
+
unless (!found || (found && !allow_overwrite))
|
71
|
+
api.mkdir("/#{folder}")
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def sync(local_path, remote_path, options={})
|
76
|
+
sync_folders(local_path, remote_path, options)
|
77
|
+
end
|
78
|
+
|
79
|
+
# Instructs Datapimp to create a syncable folder
|
80
|
+
# between the local and remote path, and optionally
|
81
|
+
# modifies the middleman config for the site
|
82
|
+
def sync_folders(local_path, remote_path, options={})
|
83
|
+
app = options[:app]
|
84
|
+
|
85
|
+
folder = Datapimp::Sync::Folder.new(local_path: local_path,
|
86
|
+
remote_path: remote_path,
|
87
|
+
app: app).synced
|
88
|
+
|
89
|
+
if !!options[:append_config] == true
|
90
|
+
Datapimp.append_config(folder.config_line)
|
91
|
+
end
|
92
|
+
|
93
|
+
folder
|
94
|
+
end
|
95
|
+
|
96
|
+
def method_missing meth, *args, &block
|
97
|
+
if api.respond_to?(meth)
|
98
|
+
return api.send(meth, *args, &block)
|
99
|
+
end
|
100
|
+
|
101
|
+
super
|
102
|
+
end
|
103
|
+
|
104
|
+
def authorize(token, secret)
|
105
|
+
@api = nil if @api
|
106
|
+
options[:token] = token
|
107
|
+
options[:secret] = secret
|
108
|
+
self
|
109
|
+
end
|
110
|
+
|
111
|
+
def options
|
112
|
+
@options ||= {}
|
113
|
+
end
|
114
|
+
|
115
|
+
def with_options(opts={})
|
116
|
+
options.merge!(opts)
|
117
|
+
self
|
118
|
+
end
|
119
|
+
|
120
|
+
def requires_setup?
|
121
|
+
!(dropbox_app_key.length > 0 && dropbox_app_secret.length > 0)
|
122
|
+
end
|
123
|
+
|
124
|
+
def dropbox_app_key
|
125
|
+
Datapimp.config.dropbox_app_key.to_s
|
126
|
+
end
|
127
|
+
|
128
|
+
def dropbox_app_secret
|
129
|
+
Datapimp.config.dropbox_app_secret.to_s
|
130
|
+
end
|
131
|
+
|
132
|
+
def setup(options={})
|
133
|
+
interactive_setup(options)
|
134
|
+
end
|
135
|
+
|
136
|
+
def interactive_setup(options={})
|
137
|
+
if requires_setup?
|
138
|
+
if dropbox_app_key.length == 0
|
139
|
+
if answer = options[:dropbox_app_key] || ask("What is the dropbox app key?", String)
|
140
|
+
Datapimp.config.set("dropbox_app_key", answer)
|
141
|
+
end
|
142
|
+
if answer = options[:dropbox_app_secret] || ask("What is the dropbox app secret?", String)
|
143
|
+
Datapimp.config.set("dropbox_app_secret", answer)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
raise 'Missing dropbox application values' if requires_setup?
|
149
|
+
|
150
|
+
::Dropbox::API::Config.app_key = Datapimp.config.dropbox_app_key
|
151
|
+
::Dropbox::API::Config.app_secret = Datapimp.config.dropbox_app_secret
|
152
|
+
|
153
|
+
consumer = ::Dropbox::API::OAuth.consumer(:authorize)
|
154
|
+
request_token = consumer.get_request_token
|
155
|
+
puts "\nGo to this url and click 'Authorize' to get the token:"
|
156
|
+
puts request_token.authorize_url
|
157
|
+
Launchy.open(request_token.authorize_url)
|
158
|
+
|
159
|
+
query = request_token.authorize_url.split('?').last
|
160
|
+
params = CGI.parse(query)
|
161
|
+
token = params['oauth_token'].first
|
162
|
+
print "\nOnce you authorize the app on Dropbox, press enter... "
|
163
|
+
STDIN.gets.chomp
|
164
|
+
|
165
|
+
access_token = request_token.get_access_token(:oauth_verifier => token)
|
166
|
+
|
167
|
+
Datapimp.config.set 'dropbox_client_token', access_token.token
|
168
|
+
Datapimp.config.set 'dropbox_client_secret', access_token.secret
|
169
|
+
|
170
|
+
puts "\nAuthorization complete!:\n\n"
|
171
|
+
puts " Dropbox::API::Config.app_key = '#{consumer.key}'"
|
172
|
+
puts " Dropbox::API::Config.app_secret = '#{consumer.secret}'"
|
173
|
+
puts " client = Dropbox::API::Client.new(:token => '#{access_token.token}', :secret => '#{access_token.secret}')"
|
174
|
+
puts "\n"
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Datapimp
|
2
|
+
module Clients
|
3
|
+
class Github
|
4
|
+
include Singleton
|
5
|
+
|
6
|
+
def self.method_missing(meth, *args, &block)
|
7
|
+
if client.respond_to?(meth)
|
8
|
+
return client.send(meth, *args, &block)
|
9
|
+
end
|
10
|
+
|
11
|
+
super
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.client(options={})
|
15
|
+
require 'octokit' unless defined?(::Oktokit)
|
16
|
+
|
17
|
+
@client ||= begin
|
18
|
+
instance.with_options(options)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def options
|
23
|
+
@options ||= {}
|
24
|
+
end
|
25
|
+
|
26
|
+
def with_options(opts={})
|
27
|
+
options.merge!(opts)
|
28
|
+
self
|
29
|
+
end
|
30
|
+
|
31
|
+
def api
|
32
|
+
@api ||= begin
|
33
|
+
Octokit::Client.new(access_token: Datapimp.config.github_access_token)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def setup(options={})
|
38
|
+
access_token = options[:github_access_token] || Datapimp.config.github_access_token
|
39
|
+
|
40
|
+
unless access_token.to_s.length == 40
|
41
|
+
puts "You should generate an access token to use with the Github client."
|
42
|
+
puts "Access tokens allow you to revoke and/or limit access if needed."
|
43
|
+
puts "To learn more about access tokens, and how to generate them, visit: https://help.github.com/articles/creating-an-access-token-for-command-line-use/"
|
44
|
+
|
45
|
+
if respond_to?(:ask)
|
46
|
+
access_token = ask("Enter a 40 character access token when you have one", String)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
unless access_token.to_s.length == 40
|
51
|
+
puts "Can not proceed without a valid access token: error code #{ access_token.length }"
|
52
|
+
return
|
53
|
+
end
|
54
|
+
|
55
|
+
Datapimp.config.set(:github_access_token, access_token)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,145 @@
|
|
1
|
+
module Datapimp
|
2
|
+
module Clients
|
3
|
+
class Google
|
4
|
+
include Singleton
|
5
|
+
|
6
|
+
def self.method_missing(meth, *args, &block)
|
7
|
+
if client.respond_to?(meth)
|
8
|
+
return client.send(meth, *args, &block)
|
9
|
+
end
|
10
|
+
|
11
|
+
super
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.client(options={})
|
15
|
+
require 'google_drive' unless defined?(::GoogleDrive)
|
16
|
+
|
17
|
+
@client ||= begin
|
18
|
+
instance.with_options(options)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def refreshable?
|
23
|
+
has_application_keys? && has_refresh_token?
|
24
|
+
end
|
25
|
+
|
26
|
+
# Runs through an interactive session where we get the
|
27
|
+
# necessary tokens needed to integrate with google drive.
|
28
|
+
def setup(options={})
|
29
|
+
get_application_keys unless has_application_keys?
|
30
|
+
|
31
|
+
if options[:client_id]
|
32
|
+
Datapimp.config.set "google_client_id", options[:client_id]
|
33
|
+
end
|
34
|
+
|
35
|
+
if options[:client_secret]
|
36
|
+
Datapimp.config.set "google_client_secret", options[:client_secret]
|
37
|
+
end
|
38
|
+
|
39
|
+
if has_refresh_token?
|
40
|
+
refresh_access_token!
|
41
|
+
elsif respond_to?(:ask)
|
42
|
+
Launchy.open(auth_client.authorization_uri)
|
43
|
+
say("\n1. Open this page:\n%s\n\n" % auth_client.authorization_uri)
|
44
|
+
auth_client.code = ask("2. Enter the authorization code shown in the page: ", String)
|
45
|
+
auth_client.fetch_access_token!
|
46
|
+
Datapimp.config.set "google_refresh_token", auth_client.refresh_token
|
47
|
+
Datapimp.config.set "google_access_token", auth_client.access_token
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def session
|
52
|
+
api
|
53
|
+
end
|
54
|
+
|
55
|
+
def api
|
56
|
+
@api ||= begin
|
57
|
+
refresh_access_token!
|
58
|
+
GoogleDrive.login_with_oauth(Datapimp.config.google_access_token)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def method_missing meth, *args, &block
|
63
|
+
if api.respond_to?(meth)
|
64
|
+
return api.send(meth, *args, &block)
|
65
|
+
end
|
66
|
+
|
67
|
+
super
|
68
|
+
end
|
69
|
+
|
70
|
+
def authorize(token, secret)
|
71
|
+
@api = nil if @api
|
72
|
+
options[:token] = token
|
73
|
+
options[:secret] = secret
|
74
|
+
self
|
75
|
+
end
|
76
|
+
|
77
|
+
def options
|
78
|
+
@options ||= {}
|
79
|
+
end
|
80
|
+
|
81
|
+
def with_options(opts={})
|
82
|
+
options.merge!(opts)
|
83
|
+
self
|
84
|
+
end
|
85
|
+
|
86
|
+
def has_application_keys?
|
87
|
+
(Datapimp.config.google_client_id.to_s.length > 0 && Datapimp.config.google_client_secret.to_s.length > 0)
|
88
|
+
end
|
89
|
+
|
90
|
+
def get_application_keys
|
91
|
+
unless Datapimp.config.google_client_id.to_s.length > 0
|
92
|
+
google_client_id = ask("What is the Google Client ID?", String)
|
93
|
+
Datapimp.config.set "google_client_id", google_client_id
|
94
|
+
end
|
95
|
+
|
96
|
+
unless Datapimp.config.google_client_secret.to_s.length > 0
|
97
|
+
google_client_secret = ask("What is the Google Client Secret?", String)
|
98
|
+
Datapimp.config.set "google_client_secret", google_client_secret
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def auth_client
|
103
|
+
return @auth_client if @auth_client
|
104
|
+
|
105
|
+
client = ::Google::APIClient.new(
|
106
|
+
:application_name => "google_drive Ruby library",
|
107
|
+
:application_version => "0.3.11"
|
108
|
+
)
|
109
|
+
|
110
|
+
client_id = "452925651630-egr1f18o96acjjvphpbbd1qlsevkho1d.apps.googleusercontent.com"
|
111
|
+
client_secret = "1U3-Krii5x1oLPrwD5zgn-ry"
|
112
|
+
|
113
|
+
@auth_client = auth = client.authorization
|
114
|
+
auth.client_id = client_id #Datapimp.config.google_client_id
|
115
|
+
auth.client_secret = client_secret #Datapimp.config.google_client_secret
|
116
|
+
auth.scope =
|
117
|
+
"https://www.googleapis.com/auth/drive " +
|
118
|
+
"https://spreadsheets.google.com/feeds/ " +
|
119
|
+
"https://docs.google.com/feeds/ " +
|
120
|
+
"https://docs.googleusercontent.com/"
|
121
|
+
|
122
|
+
auth.redirect_uri = "urn:ietf:wg:oauth:2.0:oob"
|
123
|
+
|
124
|
+
auth
|
125
|
+
end
|
126
|
+
|
127
|
+
def refresh_token
|
128
|
+
Datapimp.config.google_refresh_token.to_s
|
129
|
+
end
|
130
|
+
|
131
|
+
def has_refresh_token?
|
132
|
+
refresh_token.length > 0
|
133
|
+
end
|
134
|
+
|
135
|
+
def refresh_access_token!
|
136
|
+
if has_refresh_token?
|
137
|
+
auth_client.refresh_token = refresh_token
|
138
|
+
auth_client.fetch_access_token!
|
139
|
+
Datapimp.config.set "google_access_token", auth_client.access_token
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|