From 62f09a70f71e88eafa4df5ab02913dfab8510b76 Mon Sep 17 00:00:00 2001 From: basnal Date: Tue, 1 Jul 2014 11:30:30 +0530 Subject: [PATCH 01/13] Environment setup for google_oauth #5 --- config/initializers/google_oauth.rb | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 config/initializers/google_oauth.rb diff --git a/config/initializers/google_oauth.rb b/config/initializers/google_oauth.rb new file mode 100644 index 0000000..ae4cf59 --- /dev/null +++ b/config/initializers/google_oauth.rb @@ -0,0 +1,9 @@ +Rails.application.config.middleware.use OmniAuth::Builder do + provider :google_oauth2, ENV['GOOGLE_ID'], ENV['GOOGLE_KEY'], + { + name: "google", + scope: "userinfo.profile,userinfo.email,drive,https://spreadsheets.google.com/feeds", + prompt: "consent", + access_type: "offline", + } +end \ No newline at end of file From c77b66f919300c1ba1cf9a2cec15ff74be2e6113 Mon Sep 17 00:00:00 2001 From: basnal Date: Tue, 1 Jul 2014 11:31:37 +0530 Subject: [PATCH 02/13] ENvironment and gem setup for google_oauth2 --- Gemfile | 1 + Gemfile.lock | 12 ++++++++++++ config/environments/development.rb | 2 ++ config/environments/production.rb | 2 ++ config/environments/test.rb | 2 ++ 5 files changed, 19 insertions(+) diff --git a/Gemfile b/Gemfile index 1304933..5318e08 100644 --- a/Gemfile +++ b/Gemfile @@ -42,6 +42,7 @@ gem 'spring', group: :development # gem 'debugger', group: [:development, :test] # Use google_drive to read/write files or spreadsheets from google drive +gem 'omniauth-google-oauth2' gem 'google_drive' # Use linkedin to interface with linkedin api diff --git a/Gemfile.lock b/Gemfile.lock index a16b62d..f1da97d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -120,6 +120,17 @@ GEM multi_json (~> 1.3) multi_xml (~> 0.5) rack (~> 1.2) + omniauth (1.2.1) + hashie (>= 1.2, < 3) + rack (~> 1.0) + omniauth-google-oauth2 (0.2.4) + omniauth (~> 1.0) + omniauth-oauth2 (~> 1.1) + omniauth-oauth2 (1.1.2) + faraday (>= 0.8, < 0.10) + multi_json (~> 1.3) + oauth2 (~> 0.9.3) + omniauth (~> 1.2) optionable (0.2.0) origin (2.1.1) orm_adapter (0.5.0) @@ -239,6 +250,7 @@ DEPENDENCIES jquery-rails linkedin mongoid + omniauth-google-oauth2 rails (= 4.1.2) rspec-rails sass-rails (~> 4.0.3) diff --git a/config/environments/development.rb b/config/environments/development.rb index a384d95..468c07b 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -1,4 +1,6 @@ Rails.application.configure do + ENV["GOOGLE_ID"] = '367225507767-119uvbhdadqbft2kn4759rodoiivksn9.apps.googleusercontent.com' + ENV["GOOGLE_KEY"] = '1yX7HzuzWi3yD1OqJ21ZgpSS' # Settings specified here will take precedence over those in config/application.rb. # In the development environment your application's code is reloaded on diff --git a/config/environments/production.rb b/config/environments/production.rb index 4f67ce3..36e53ba 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -1,4 +1,6 @@ Rails.application.configure do + ENV["GOOGLE_ID"] = '367225507767-119uvbhdadqbft2kn4759rodoiivksn9.apps.googleusercontent.com' + ENV["GOOGLE_KEY"] = '1yX7HzuzWi3yD1OqJ21ZgpSS' # Settings specified here will take precedence over those in config/application.rb. # Code is not reloaded between requests. diff --git a/config/environments/test.rb b/config/environments/test.rb index 053f5b6..f2d8184 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -1,4 +1,6 @@ Rails.application.configure do + ENV["GOOGLE_ID"] = '367225507767-119uvbhdadqbft2kn4759rodoiivksn9.apps.googleusercontent.com' + ENV["GOOGLE_KEY"] = '1yX7HzuzWi3yD1OqJ21ZgpSS' # Settings specified here will take precedence over those in config/application.rb. # The test environment is used exclusively to run your application's From abe2bfd654cf616d17837a3fad165c29ded5d153 Mon Sep 17 00:00:00 2001 From: basnal Date: Tue, 8 Jul 2014 15:24:09 +0530 Subject: [PATCH 03/13] Integrated Google Oauth in separate branch --- Gemfile | 6 +- Gemfile.lock | 54 ++++++++- app/assets/javascripts/callbacks.js.coffee | 3 + app/assets/stylesheets/callbacks.css.scss | 3 + app/controllers/application_controller.rb | 1 + app/controllers/callbacks_controller.rb | 114 ++++++++++++++++++ app/controllers/home_controller.rb | 18 +++ app/helpers/callbacks_helper.rb | 2 + app/models/token.rb | 8 ++ app/views/callbacks/create.html.haml | 4 + app/views/callbacks/createv1.html.erb | 9 ++ app/views/callbacks/failure.html.haml | 1 + app/views/callbacks/index.html.haml | 14 +++ app/views/callbacks/setSheet.html.erb | 5 + app/views/callbacks/test.html.haml | 4 + app/views/create.html.erb | 9 ++ app/views/failure.html.erb | 1 + app/views/home/add_from_google.html.haml | 7 ++ app/views/layouts/application.html.haml | 17 ++- app/views/setSheet.html.erb | 5 + config/initializers/google_oauth.rb | 6 +- config/routes.rb | 9 ++ spec/controllers/callbacks_controller_spec.rb | 5 + spec/factories/tokens.rb | 6 + spec/helpers/callbacks_helper_spec.rb | 15 +++ spec/models/token_spec.rb | 5 + 26 files changed, 319 insertions(+), 12 deletions(-) create mode 100644 app/assets/javascripts/callbacks.js.coffee create mode 100644 app/assets/stylesheets/callbacks.css.scss create mode 100644 app/controllers/callbacks_controller.rb create mode 100644 app/helpers/callbacks_helper.rb create mode 100644 app/models/token.rb create mode 100644 app/views/callbacks/create.html.haml create mode 100644 app/views/callbacks/createv1.html.erb create mode 100644 app/views/callbacks/failure.html.haml create mode 100644 app/views/callbacks/index.html.haml create mode 100644 app/views/callbacks/setSheet.html.erb create mode 100644 app/views/callbacks/test.html.haml create mode 100644 app/views/create.html.erb create mode 100644 app/views/failure.html.erb create mode 100644 app/views/home/add_from_google.html.haml create mode 100644 app/views/setSheet.html.erb create mode 100644 spec/controllers/callbacks_controller_spec.rb create mode 100644 spec/factories/tokens.rb create mode 100644 spec/helpers/callbacks_helper_spec.rb create mode 100644 spec/models/token_spec.rb diff --git a/Gemfile b/Gemfile index 5318e08..ad977a6 100644 --- a/Gemfile +++ b/Gemfile @@ -43,9 +43,11 @@ gem 'spring', group: :development # Use google_drive to read/write files or spreadsheets from google drive gem 'omniauth-google-oauth2' -gem 'google_drive' +gem 'google-api-client', require: 'google/api_client' +gem 'google_drive', git: 'git://github.com/SixiS/google-drive-ruby' # Use linkedin to interface with linkedin api +#gem 'omniauth-linkedin-oauth2' gem 'linkedin' # Use sendrid to access sendgrid api to send mails and get their status @@ -81,3 +83,5 @@ group :development, :test do end gem 'simple_form' +gem 'pry' +gem 'rest_client' diff --git a/Gemfile.lock b/Gemfile.lock index f1da97d..e0d401c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,3 +1,12 @@ +GIT + remote: git://github.com/SixiS/google-drive-ruby + revision: 7a58b426959727aef9d7e99a9942e945f836875a + specs: + google_drive (0.3.9) + nokogiri (>= 1.4.4, != 1.5.2, != 1.5.1) + oauth (>= 0.3.6) + oauth2 (>= 0.5.0) + GEM remote: https://rubygems.org/ specs: @@ -27,7 +36,12 @@ GEM minitest (~> 5.1) thread_safe (~> 0.1) tzinfo (~> 1.1) + addressable (2.3.6) arel (5.0.1.20140414130214) + autoparse (0.3.3) + addressable (>= 2.3.1) + extlib (>= 0.9.15) + multi_json (>= 1.0.0) bcrypt (3.1.7) bootstrap-sass (3.2.0.0) sass (~> 3.2) @@ -35,6 +49,7 @@ GEM builder (3.2.2) celluloid (0.15.2) timers (~> 1.1.0) + coderay (1.1.0) coffee-rails (4.0.1) coffee-script (>= 2.2.0) railties (>= 4.0.0, < 5.0) @@ -57,6 +72,7 @@ GEM docile (1.1.5) erubis (2.7.0) execjs (2.2.1) + extlib (0.9.16) factory_girl (4.4.0) activesupport (>= 3.0.0) factory_girl_rails (4.4.1) @@ -66,10 +82,17 @@ GEM i18n (~> 0.5) faraday (0.9.0) multipart-post (>= 1.2, < 3) - google_drive (0.3.9) - nokogiri (>= 1.4.4, != 1.5.2, != 1.5.1) - oauth (>= 0.3.6) - oauth2 (>= 0.5.0) + google-api-client (0.7.1) + addressable (>= 2.3.2) + autoparse (>= 0.3.3) + extlib (>= 0.9.15) + faraday (>= 0.9.0) + jwt (>= 0.1.5) + launchy (>= 2.1.1) + multi_json (>= 1.0.0) + retriable (>= 1.4) + signet (>= 0.5.0) + uuidtools (>= 2.1.0) haml (4.0.5) tilt haml-rails (0.5.3) @@ -88,6 +111,8 @@ GEM thor (>= 0.14, < 2.0) json (1.8.1) jwt (1.0.0) + launchy (2.4.2) + addressable (~> 2.3) libv8 (3.16.14.3) linkedin (0.4.7) hashie (~> 2.0) @@ -96,6 +121,7 @@ GEM mail (2.5.4) mime-types (~> 1.16) treetop (~> 1.4.8) + method_source (0.8.2) mime-types (1.25.1) mini_portile (0.6.0) minitest (5.3.5) @@ -111,6 +137,7 @@ GEM multi_json (1.10.1) multi_xml (0.5.5) multipart-post (2.0.0) + netrc (0.7.7) nokogiri (1.6.2.1) mini_portile (= 0.6.0) oauth (0.4.7) @@ -135,6 +162,10 @@ GEM origin (2.1.1) orm_adapter (0.5.0) polyglot (0.3.5) + pry (0.10.0) + coderay (~> 1.1.0) + method_source (~> 0.8.1) + slop (~> 3.4) rack (1.5.2) rack-test (0.6.2) rack (>= 1.0) @@ -160,6 +191,9 @@ GEM redis-namespace (1.5.0) redis (~> 3.0, >= 3.0.4) ref (1.0.5) + rest_client (1.7.3) + netrc (~> 0.7.7) + retriable (1.4.1) rspec-core (3.0.2) rspec-support (~> 3.0.0) rspec-expectations (3.0.2) @@ -194,6 +228,11 @@ GEM json redis (>= 3.0.6) redis-namespace (>= 1.3.1) + signet (0.5.1) + addressable (>= 2.2.3) + faraday (>= 0.9.0.rc5) + jwt (>= 0.1.5) + multi_json (>= 1.0.0) simple_form (3.0.2) actionpack (~> 4.0) activemodel (~> 4.0) @@ -202,6 +241,7 @@ GEM multi_json simplecov-html (~> 0.8.0) simplecov-html (0.8.0) + slop (3.5.0) spring (1.1.3) sprockets (2.11.0) hike (~> 1.2) @@ -229,6 +269,7 @@ GEM uglifier (2.5.1) execjs (>= 0.3.0) json (>= 1.8.0) + uuidtools (2.1.4) warden (1.2.3) rack (>= 1.0) @@ -243,7 +284,8 @@ DEPENDENCIES devise_invitable factory_girl_rails faker - google_drive + google-api-client + google_drive! haml haml-rails jbuilder (~> 2.0) @@ -251,7 +293,9 @@ DEPENDENCIES linkedin mongoid omniauth-google-oauth2 + pry rails (= 4.1.2) + rest_client rspec-rails sass-rails (~> 4.0.3) sdoc (~> 0.4.0) diff --git a/app/assets/javascripts/callbacks.js.coffee b/app/assets/javascripts/callbacks.js.coffee new file mode 100644 index 0000000..24f83d1 --- /dev/null +++ b/app/assets/javascripts/callbacks.js.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/stylesheets/callbacks.css.scss b/app/assets/stylesheets/callbacks.css.scss new file mode 100644 index 0000000..e4c4d53 --- /dev/null +++ b/app/assets/stylesheets/callbacks.css.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the callbacks controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index d83690e..2ec37e2 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -2,4 +2,5 @@ class ApplicationController < ActionController::Base # Prevent CSRF attacks by raising an exception. # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception + end diff --git a/app/controllers/callbacks_controller.rb b/app/controllers/callbacks_controller.rb new file mode 100644 index 0000000..7daa138 --- /dev/null +++ b/app/controllers/callbacks_controller.rb @@ -0,0 +1,114 @@ +class CallbacksController < ApplicationController + + def index + #Token.delete_all + tkn = Token.first + + if tkn.nil? + redirect_to "/auth/google" and return + else + if tkn['spreadsheet_id'].nil? + @ws = getSheet(tkn) + render action: 'create' and return + end + end + @sheets = Token.all.to_a + end + + def omniauth + tkn = Token.new + req = request.env["omniauth.auth"] + auth_token = request.env["omniauth.auth"].fetch("credentials") + tkn["access_token"] = auth_token.fetch("token") + tkn["refresh_token"] = auth_token.fetch("refresh_token") + tkn["expires_at"] = auth_token.fetch("expires_at") + + if tkn.save + @ws = getSheet(tkn) + else + @ws = {error: "not able to save"} + end + + render action: 'create' and return + end + + def getSheet(tkn) + client = Google::APIClient.new + client.authorization.access_token = tkn['access_token'] + #session = GoogleDrive.login_with_oauth(tkn["access_token"]) + drive = client.discovered_api('drive', 'v3') + + wks = client.execute( + api_method: drive.files.list, + parameters: {}, + headers: {'Content-Type'=>'application/json'} + ) + JSON.parse(wks.data.to_json) + end + + def setSheet + tkn = Token.first + tkn['spreadsheet_id'] = params['id'] + tkn.save + + insertEmailInDatabase(tkn) + + redirect_to users_path + end + + def insertEmailInDatabase(tkn) + @tkn = tkn + session = GoogleDrive.login_with_oauth(@tkn["access_token"]) + @ws = session.spreadsheet_by_key(@tkn['spreadsheet_id']).worksheets[0] + + rowcount = @ws.rows.count + usercount = User.count + #if rowcount > usercount + (rowcount).times do |i| + User.create(email_id: @ws[i + 1, 1], # + usercount, 1], + is_subscribed: true, + joined_on: Date.today, + source: "Google Spreadsheet") + end + #end + + #render action: "test" + end + + def refresh_token(tkn) + data = { + client_id: ENV['GOOGLE_ID'], + client_secret: ENV['GOOGLE_KEY'], + refresh_token: tkn['refresh_token'], + grant_type: 'refresh_token' + } + re = ActiveSupport::JSON.decode(RestClient.post 'https://accounts.google.com/o/oauth2/token', data) +=begin + client = Google::APIClient.new + client.authorization.access_token = tkn['access_token'] + client.authorization.client_id = ENV["GOOGLE_ID"] + client.authorization.client_secret = ENV["GOOGLE_KEY"] + client.authorization.refresh_token = tkn["refresh_token"] + re = client.authorization.update_token! +=end + sheets = Token.where(spreadsheet_id: tkn['spreadsheet_id'])[0] + sheets['access_token'] = re['access_token'] + sheets['expires_at'] = (Time.now + re['expires_in'].second).localtime + sheets.save + + re + end + + def update + tkn = Token.where(spreadsheet_id: params['id']) + @tkn = tkn[0] + unless Time.now > tkn[0]['expires_at'] + @ref = refresh_token tkn[0] + end + tkn = Token.where(spreadsheet_id: params['id']) + insertEmailInDatabase(tkn[0]) + redirect_to users_path + #render action: 'test' + end + +end diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index 95f2992..8d69641 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -1,4 +1,22 @@ class HomeController < ApplicationController def index end + + def add_from_google + @sheets = Token.first + @client = Google::APIClient.new + @client.authorization.access_token = @sheets['access_token'] + @client.authorization.client_id = ENV["GOOGLE_ID"] + @client.authorization.client_secret = ENV["GOOGLE_KEY"] + @client.authorization.refresh_token = @sheets["refresh_token"] + @re = @client.auto_refresh_token + #session = GoogleDrive.login_with_oauth(tkn["access_token"]) + drive = @client.discovered_api('drive', 'v2') + + @wks = @client.execute( + api_method: drive.files.watch, + parameters: {fileId: @sheets["spreadsheet_id"]}, + headers: {'Content-Type'=>'application/json'} + ) + end end diff --git a/app/helpers/callbacks_helper.rb b/app/helpers/callbacks_helper.rb new file mode 100644 index 0000000..6c9550c --- /dev/null +++ b/app/helpers/callbacks_helper.rb @@ -0,0 +1,2 @@ +module CallbacksHelper +end diff --git a/app/models/token.rb b/app/models/token.rb new file mode 100644 index 0000000..a356603 --- /dev/null +++ b/app/models/token.rb @@ -0,0 +1,8 @@ +class Token + include Mongoid::Document + + field :spreadsheet_id, type: String + field :refresh_token, type: String + field :expires_at, type: Time + field :access_token, type: String +end \ No newline at end of file diff --git a/app/views/callbacks/create.html.haml b/app/views/callbacks/create.html.haml new file mode 100644 index 0000000..416830f --- /dev/null +++ b/app/views/callbacks/create.html.haml @@ -0,0 +1,4 @@ +-count = @ws["items"].count +-count.times do |i| + =link_to @ws["items"][i]["title"], set_sheet_path(@ws["items"][i]["id"]) if @ws["items"][i]["mimeType"].include?("spreadsheet") + %br \ No newline at end of file diff --git a/app/views/callbacks/createv1.html.erb b/app/views/callbacks/createv1.html.erb new file mode 100644 index 0000000..2cdb756 --- /dev/null +++ b/app/views/callbacks/createv1.html.erb @@ -0,0 +1,9 @@ +<% #@ws['items'].each do |i| %> + <% #i.each do |j| %> + <%#=j%> + <%# end %> +<%# end %> + +<% @ws['items'].each do |i| %> + <%= link_to i['title'], set_sheet_path(i['id']) if i['mimeType'].include?("spreadsheet") %>
+<% end %> \ No newline at end of file diff --git a/app/views/callbacks/failure.html.haml b/app/views/callbacks/failure.html.haml new file mode 100644 index 0000000..2395e1d --- /dev/null +++ b/app/views/callbacks/failure.html.haml @@ -0,0 +1 @@ +this is callbacks#failure \ No newline at end of file diff --git a/app/views/callbacks/index.html.haml b/app/views/callbacks/index.html.haml new file mode 100644 index 0000000..42a9da8 --- /dev/null +++ b/app/views/callbacks/index.html.haml @@ -0,0 +1,14 @@ +=@msg +=#debug @ref + +%br += Time.now +%table.table + -@sheets.count.times do |i| + %tr + %td + = @sheets[i]["access_token"] + %td + = link_to "Update", callback_update_path(@sheets[i]["spreadsheet_id"]) + %td + = @sheets[i]["expires_at"] \ No newline at end of file diff --git a/app/views/callbacks/setSheet.html.erb b/app/views/callbacks/setSheet.html.erb new file mode 100644 index 0000000..3fd2d7a --- /dev/null +++ b/app/views/callbacks/setSheet.html.erb @@ -0,0 +1,5 @@ +<% @ws.rows.each do |r| %> + <% r.each do |c| %> + <%= c %>
+ <%end%> +<%end%> \ No newline at end of file diff --git a/app/views/callbacks/test.html.haml b/app/views/callbacks/test.html.haml new file mode 100644 index 0000000..d3356e4 --- /dev/null +++ b/app/views/callbacks/test.html.haml @@ -0,0 +1,4 @@ +=debug @tkn +=debug @ref.class +=debug @ref +=debug @tkn['expires_at'].localtime \ No newline at end of file diff --git a/app/views/create.html.erb b/app/views/create.html.erb new file mode 100644 index 0000000..2cdb756 --- /dev/null +++ b/app/views/create.html.erb @@ -0,0 +1,9 @@ +<% #@ws['items'].each do |i| %> + <% #i.each do |j| %> + <%#=j%> + <%# end %> +<%# end %> + +<% @ws['items'].each do |i| %> + <%= link_to i['title'], set_sheet_path(i['id']) if i['mimeType'].include?("spreadsheet") %>
+<% end %> \ No newline at end of file diff --git a/app/views/failure.html.erb b/app/views/failure.html.erb new file mode 100644 index 0000000..812fb59 --- /dev/null +++ b/app/views/failure.html.erb @@ -0,0 +1 @@ +this is callbacks#failure diff --git a/app/views/home/add_from_google.html.haml b/app/views/home/add_from_google.html.haml new file mode 100644 index 0000000..47f8914 --- /dev/null +++ b/app/views/home/add_from_google.html.haml @@ -0,0 +1,7 @@ +=@sheets["spreadsheet_id"] +%br +=#@client.authorization.methods +=debug @re +%br + +=#debug @wks \ No newline at end of file diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 968ff69..051cbd9 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -19,9 +19,18 @@ %li %a{href: "#"} %h4 Newsletters - %li - %a{href: "#{new_user_path}"} - %h4 Add New User + %li.dropdown + %a.dropdown-toggle{"data-toggle" => "dropdown", href: "#"} + %h4 + Add Users + %span.caret + %ul.dropdown-menu{role: "menu", "aria-labelledby" => "dropdownMenu1" } + %li + %a{role: "menuitem", tabindex: "-1", href: "#{new_user_path}"}Manually + %li + %a{role: "menuitem", tabindex: "-2", href: "#{callback_index_path}"}Google Spreadsheets + %li + %a{role: "menuitem", tabindex: "-1", href: "#{linkedin_path}"}Linkedin Connections %li %a{href: "#{users_path}"} %h4 All Users @@ -31,7 +40,7 @@ %li.active %a{href: "#"} Subscriber count : - 1000 + =User.count %div.container %div.row %div.col-sm-9= yield diff --git a/app/views/setSheet.html.erb b/app/views/setSheet.html.erb new file mode 100644 index 0000000..3fd2d7a --- /dev/null +++ b/app/views/setSheet.html.erb @@ -0,0 +1,5 @@ +<% @ws.rows.each do |r| %> + <% r.each do |c| %> + <%= c %>
+ <%end%> +<%end%> \ No newline at end of file diff --git a/config/initializers/google_oauth.rb b/config/initializers/google_oauth.rb index ae4cf59..12de4e8 100644 --- a/config/initializers/google_oauth.rb +++ b/config/initializers/google_oauth.rb @@ -2,8 +2,10 @@ provider :google_oauth2, ENV['GOOGLE_ID'], ENV['GOOGLE_KEY'], { name: "google", - scope: "userinfo.profile,userinfo.email,drive,https://spreadsheets.google.com/feeds", - prompt: "consent", + scope: 'userinfo.profile,userinfo.email,drive,https://spreadsheets.google.com/feeds', + prompt: 'consent', access_type: "offline", } + + #provider :linkedin, '75cmlzl0cpmwa2', 'I5y0aRBkfpgMmTqp', redirect_uri: 'http://localhost:8080/auth/linkedin/callback', scope:'r_emailaddress r_network r_contactinfo rw_company_admin rw_nus rw_groups w_messages r_basicprofile r_fullprofile' end \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 87b8e4e..3c7b591 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,7 +1,16 @@ Rails.application.routes.draw do + + get '/home/sheets', to: 'home#add_from_google', as: 'add_from_google' + get '/auth/:provider/callback', to: 'callbacks#omniauth' + get '/linkedin', to: 'callbacks#linkedin', as: 'linkedin' + get '/callbacks/sheet/:id', to: 'callbacks#setSheet', as: 'set_sheet' + get '/callbacks/index', to: 'callbacks#index', as: 'callback_index' + get '/callbacks/update/:id', to: 'callbacks#update', as: 'callback_update' + resources :users resources :newsletters resources :home + root :to => "home#index" # The priority is based upon order of creation: first created -> highest priority. diff --git a/spec/controllers/callbacks_controller_spec.rb b/spec/controllers/callbacks_controller_spec.rb new file mode 100644 index 0000000..08d5496 --- /dev/null +++ b/spec/controllers/callbacks_controller_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe CallbacksController, :type => :controller do + +end diff --git a/spec/factories/tokens.rb b/spec/factories/tokens.rb new file mode 100644 index 0000000..37cbfd0 --- /dev/null +++ b/spec/factories/tokens.rb @@ -0,0 +1,6 @@ +# Read about factories at https://github.com/thoughtbot/factory_girl + +FactoryGirl.define do + factory :token do + end +end diff --git a/spec/helpers/callbacks_helper_spec.rb b/spec/helpers/callbacks_helper_spec.rb new file mode 100644 index 0000000..d10c6fd --- /dev/null +++ b/spec/helpers/callbacks_helper_spec.rb @@ -0,0 +1,15 @@ +require 'rails_helper' + +# Specs in this file have access to a helper object that includes +# the CallbacksHelper. For example: +# +# describe CallbacksHelper do +# describe "string concat" do +# it "concats two strings with spaces" do +# expect(helper.concat_strings("this","that")).to eq("this that") +# end +# end +# end +RSpec.describe CallbacksHelper, :type => :helper do + pending "add some examples to (or delete) #{__FILE__}" +end diff --git a/spec/models/token_spec.rb b/spec/models/token_spec.rb new file mode 100644 index 0000000..76bf2eb --- /dev/null +++ b/spec/models/token_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe Token, :type => :model do + pending "add some examples to (or delete) #{__FILE__}" +end From c8c50db8aed99bc8443e7e3faa944e0f66e403f2 Mon Sep 17 00:00:00 2001 From: basnal Date: Tue, 8 Jul 2014 15:53:37 +0530 Subject: [PATCH 04/13] Drive version set back to 2 --- app/controllers/callbacks_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/callbacks_controller.rb b/app/controllers/callbacks_controller.rb index 7daa138..b491164 100644 --- a/app/controllers/callbacks_controller.rb +++ b/app/controllers/callbacks_controller.rb @@ -36,7 +36,7 @@ def getSheet(tkn) client = Google::APIClient.new client.authorization.access_token = tkn['access_token'] #session = GoogleDrive.login_with_oauth(tkn["access_token"]) - drive = client.discovered_api('drive', 'v3') + drive = client.discovered_api('drive', 'v2') wks = client.execute( api_method: drive.files.list, From be8827b7ea383bcdd3daf00f34a233f52d691e46 Mon Sep 17 00:00:00 2001 From: basnal Date: Wed, 9 Jul 2014 11:18:45 +0530 Subject: [PATCH 05/13] cleaned up code --- app/controllers/callbacks_controller.rb | 29 +++++++------------------ 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/app/controllers/callbacks_controller.rb b/app/controllers/callbacks_controller.rb index b491164..73aaea1 100644 --- a/app/controllers/callbacks_controller.rb +++ b/app/controllers/callbacks_controller.rb @@ -1,7 +1,6 @@ class CallbacksController < ApplicationController def index - #Token.delete_all tkn = Token.first if tkn.nil? @@ -17,7 +16,6 @@ def index def omniauth tkn = Token.new - req = request.env["omniauth.auth"] auth_token = request.env["omniauth.auth"].fetch("credentials") tkn["access_token"] = auth_token.fetch("token") tkn["refresh_token"] = auth_token.fetch("refresh_token") @@ -35,7 +33,6 @@ def omniauth def getSheet(tkn) client = Google::APIClient.new client.authorization.access_token = tkn['access_token'] - #session = GoogleDrive.login_with_oauth(tkn["access_token"]) drive = client.discovered_api('drive', 'v2') wks = client.execute( @@ -62,17 +59,14 @@ def insertEmailInDatabase(tkn) @ws = session.spreadsheet_by_key(@tkn['spreadsheet_id']).worksheets[0] rowcount = @ws.rows.count - usercount = User.count - #if rowcount > usercount - (rowcount).times do |i| - User.create(email_id: @ws[i + 1, 1], # + usercount, 1], - is_subscribed: true, - joined_on: Date.today, - source: "Google Spreadsheet") - end - #end - #render action: "test" + (rowcount).times do |i| + User.create(email_id: @ws[i + 1, 1], + is_subscribed: true, + joined_on: Date.today, + source: "Google Spreadsheet") + end + end def refresh_token(tkn) @@ -83,14 +77,7 @@ def refresh_token(tkn) grant_type: 'refresh_token' } re = ActiveSupport::JSON.decode(RestClient.post 'https://accounts.google.com/o/oauth2/token', data) -=begin - client = Google::APIClient.new - client.authorization.access_token = tkn['access_token'] - client.authorization.client_id = ENV["GOOGLE_ID"] - client.authorization.client_secret = ENV["GOOGLE_KEY"] - client.authorization.refresh_token = tkn["refresh_token"] - re = client.authorization.update_token! -=end + sheets = Token.where(spreadsheet_id: tkn['spreadsheet_id'])[0] sheets['access_token'] = re['access_token'] sheets['expires_at'] = (Time.now + re['expires_in'].second).localtime From b49aabae2506e6501f5da83e9060ddc52444d37e Mon Sep 17 00:00:00 2001 From: basnal Date: Fri, 11 Jul 2014 10:46:42 +0530 Subject: [PATCH 06/13] Code was re organised #11 --- .gitignore | 1 + Gemfile | 14 +- Gemfile.lock | 9 ++ app/assets/javascripts/spreadsheets.js.coffee | 6 + app/assets/stylesheets/bootstrap_config.scss | 1 + app/assets/stylesheets/spreadsheets.css.scss | 3 + app/controllers/application_controller.rb | 1 - app/controllers/callbacks_controller.rb | 6 +- app/controllers/spreadsheets_controller.rb | 57 +++++++++ app/helpers/spreadsheets_helper.rb | 2 + app/models/spreadsheet.rb | 28 ++++ app/models/user.rb | 8 ++ app/views/layouts/application.html.haml | 48 +++---- app/views/spreadsheets/edit.html.haml | 1 + app/views/spreadsheets/index.html.haml | 31 +++++ app/views/spreadsheets/new.html.haml | 7 + config/application.rb | 1 + config/initializers/google_oauth.rb | 7 +- config/routes.rb | 11 +- lib/google_spreadsheets.rb | 46 +++++++ spec/controllers/google_auth_response.json | 12 ++ spec/controllers/host_response.json | 121 ++++++++++++++++++ .../spreadsheets_controller_spec.rb | 29 +++++ spec/factories/spreadsheets.rb | 6 + spec/helpers/spreadsheets_helper_spec.rb | 15 +++ spec/models/spreadsheet_spec.rb | 5 + spec/spec_helper.rb | 2 +- 27 files changed, 434 insertions(+), 44 deletions(-) create mode 100644 app/assets/javascripts/spreadsheets.js.coffee create mode 100644 app/assets/stylesheets/spreadsheets.css.scss create mode 100644 app/controllers/spreadsheets_controller.rb create mode 100644 app/helpers/spreadsheets_helper.rb create mode 100644 app/models/spreadsheet.rb create mode 100644 app/views/spreadsheets/edit.html.haml create mode 100644 app/views/spreadsheets/index.html.haml create mode 100644 app/views/spreadsheets/new.html.haml create mode 100644 lib/google_spreadsheets.rb create mode 100644 spec/controllers/google_auth_response.json create mode 100644 spec/controllers/host_response.json create mode 100644 spec/controllers/spreadsheets_controller_spec.rb create mode 100644 spec/factories/spreadsheets.rb create mode 100644 spec/helpers/spreadsheets_helper_spec.rb create mode 100644 spec/models/spreadsheet_spec.rb diff --git a/.gitignore b/.gitignore index b397243..72dcb25 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,4 @@ build/ /log/ /tmp *.log +test.html.haml diff --git a/Gemfile b/Gemfile index ad977a6..e6540b2 100644 --- a/Gemfile +++ b/Gemfile @@ -70,16 +70,20 @@ gem 'bootstrap-sass' # The following gems for testing purpose in development and testing environment group :development, :test do -# Rspec is used to write the test cases + # Rspec is used to write the test cases gem 'rspec-rails' -# Use factory girl to pass random data for test cases + # Use factory girl to pass random data for test cases gem 'factory_girl_rails' -# Use faker to generate fake strings and data + # Use faker to generate fake strings and data gem 'faker' -# Use to clean database after executing a test case + # Use to clean database after executing a test case gem 'database_cleaner' -# Use to track how much code has been tested + # Use to track how much code has been tested gem 'simplecov' + # Webmock to stub http requests + gem 'webmock' + # VCR to record the responses from web and replay them when needed + gem 'vcr' end gem 'simple_form' diff --git a/Gemfile.lock b/Gemfile.lock index e0d401c..16efa74 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -58,6 +58,8 @@ GEM execjs coffee-script-source (1.7.0) connection_pool (2.0.0) + crack (0.4.2) + safe_yaml (~> 1.0.0) database_cleaner (1.3.0) devise (3.2.4) bcrypt (~> 3.0) @@ -210,6 +212,7 @@ GEM rspec-mocks (~> 3.0.0) rspec-support (~> 3.0.0) rspec-support (3.0.2) + safe_yaml (1.0.3) sass (3.2.19) sass-rails (4.0.3) railties (>= 4.0.0, < 5.0) @@ -270,8 +273,12 @@ GEM execjs (>= 0.3.0) json (>= 1.8.0) uuidtools (2.1.4) + vcr (2.9.2) warden (1.2.3) rack (>= 1.0) + webmock (1.18.0) + addressable (>= 2.3.6) + crack (>= 0.3.2) PLATFORMS ruby @@ -307,3 +314,5 @@ DEPENDENCIES therubyracer turbolinks uglifier (>= 1.3.0) + vcr + webmock diff --git a/app/assets/javascripts/spreadsheets.js.coffee b/app/assets/javascripts/spreadsheets.js.coffee new file mode 100644 index 0000000..bb6bec6 --- /dev/null +++ b/app/assets/javascripts/spreadsheets.js.coffee @@ -0,0 +1,6 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ +xyz = -> + alert "welcome" + return \ No newline at end of file diff --git a/app/assets/stylesheets/bootstrap_config.scss b/app/assets/stylesheets/bootstrap_config.scss index c2c0a35..97dbd4a 100644 --- a/app/assets/stylesheets/bootstrap_config.scss +++ b/app/assets/stylesheets/bootstrap_config.scss @@ -1,4 +1,5 @@ @import "bootstrap"; + body { padding-top: 80px; diff --git a/app/assets/stylesheets/spreadsheets.css.scss b/app/assets/stylesheets/spreadsheets.css.scss new file mode 100644 index 0000000..2f69a6e --- /dev/null +++ b/app/assets/stylesheets/spreadsheets.css.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the spreadsheets controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 2ec37e2..d83690e 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -2,5 +2,4 @@ class ApplicationController < ActionController::Base # Prevent CSRF attacks by raising an exception. # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception - end diff --git a/app/controllers/callbacks_controller.rb b/app/controllers/callbacks_controller.rb index 73aaea1..ee64347 100644 --- a/app/controllers/callbacks_controller.rb +++ b/app/controllers/callbacks_controller.rb @@ -54,9 +54,9 @@ def setSheet end def insertEmailInDatabase(tkn) - @tkn = tkn - session = GoogleDrive.login_with_oauth(@tkn["access_token"]) - @ws = session.spreadsheet_by_key(@tkn['spreadsheet_id']).worksheets[0] + @tkn = tkn + session = GoogleDrive.login_with_oauth(@tkn["access_token"]) + @ws = session.spreadsheet_by_key(@tkn['spreadsheet_id']).worksheets[0] rowcount = @ws.rows.count diff --git a/app/controllers/spreadsheets_controller.rb b/app/controllers/spreadsheets_controller.rb new file mode 100644 index 0000000..8bf26d1 --- /dev/null +++ b/app/controllers/spreadsheets_controller.rb @@ -0,0 +1,57 @@ +class SpreadsheetsController < ApplicationController + include GoogleSpreadsheets + + def index + @spreadsheets = Spreadsheet.all.to_a + end + + def new + @req = params +=begin + if params[:access_token] + spreadsheet = Spreadsheet.where(access_token: params['access_token'])[0] + else + spreadsheet = Spreadsheet.new + spreadsheet.add_tokens(request.env['omniauth.auth'].fetch('credentials')) + end + + if spreadsheet.save + # Spreadsheets from google + @spreadsheets = get_spreadsheets(spreadsheet) + @token = spreadsheet.access_token + @msg = 'work' + else + @msg = 'no work' + # Handle if data does not get saved + end +=end + end + + def edit + token = spreadsheet_params['token'] + spreadsheet = Spreadsheet.where(access_token: token)[0] + spreadsheet.add_spreadsheet_credentials(spreadsheet_params) + #binding.pry + spreadsheet.save + + @spreadsheets = Spreadsheet.all.to_a + + render action: 'index' + end + + def update + spreadsheet = Spreadsheet.find(params['id']) + @worksheet = get_worksheets(spreadsheet) + User.add_users_from_worksheet(@worksheet) + redirect_to users_path + end + + def destroy + Spreadsheet.find(params['id']).delete + redirect_to spreadsheets_path + end + + def spreadsheet_params + params.permit(:title, :id, :token) + end +end diff --git a/app/helpers/spreadsheets_helper.rb b/app/helpers/spreadsheets_helper.rb new file mode 100644 index 0000000..4d8051e --- /dev/null +++ b/app/helpers/spreadsheets_helper.rb @@ -0,0 +1,2 @@ +module SpreadsheetsHelper +end diff --git a/app/models/spreadsheet.rb b/app/models/spreadsheet.rb new file mode 100644 index 0000000..e8fed63 --- /dev/null +++ b/app/models/spreadsheet.rb @@ -0,0 +1,28 @@ +class Spreadsheet + include Mongoid::Document + + field :spreadsheet_id, type: String + field :spreadsheet_title, type: String + field :refresh_token, type: String + field :expires_at, type: Time + field :access_token, type: String + + validates :access_token, uniqueness: true + + def add_tokens(tokens = {}) + self['access_token'] = tokens.fetch('token') + self['refresh_token'] = tokens.fetch('refresh_token') + self['expires_at'] = tokens.fetch('expires_at') + end + + def add_spreadsheet_credentials(credentials = {}) + #binding.pry + self['spreadsheet_id'] = credentials['id'] + self['spreadsheet_title'] = credentials['title'] + end + + def access_token + self['access_token'] + end + +end diff --git a/app/models/user.rb b/app/models/user.rb index 11bfd53..297dcb9 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -14,4 +14,12 @@ class User belongs_to :newsletter, counter_cache: :users_count + def self.add_users_from_worksheet(worksheet, column = 1) + worksheet.rows.count.times do |i| + User.create(email_id: worksheet[i + 1, column], + is_subscribed: true, + joined_on: Date.today, + source: 'Google Spreadsheet') + end + end end diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 051cbd9..d9b2ace 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -12,35 +12,35 @@ .navbar-brand %h4 LightAir - %ul.nav.navbar-nav - %li.active - %a{href: "#{home_index_path}"} - %h4 Home - %li - %a{href: "#"} - %h4 Newsletters - %li.dropdown - %a.dropdown-toggle{"data-toggle" => "dropdown", href: "#"} - %h4 - Add Users - %span.caret - %ul.dropdown-menu{role: "menu", "aria-labelledby" => "dropdownMenu1" } - %li - %a{role: "menuitem", tabindex: "-1", href: "#{new_user_path}"}Manually - %li - %a{role: "menuitem", tabindex: "-2", href: "#{callback_index_path}"}Google Spreadsheets - %li - %a{role: "menuitem", tabindex: "-1", href: "#{linkedin_path}"}Linkedin Connections - %li - %a{href: "#{users_path}"} - %h4 All Users + %div.nav-collapse + %ul.nav.navbar-nav + %li.active + %a{href: "#{home_index_path}"} + %h4 Home + %li + %a{href: "#"} + %h4 Newsletters + %li + %a{href: "#{users_path}"} + %h4 Show Users + %li.dropdown + %a.dropdown-toggle{"data-toggle" => "dropdown"} + %h4 + Add Users + %span.caret + %ul.dropdown-menu{role: "menu", "aria-labelledby" => "dropdownMenu1" } + %li + %a{role: "menuitem", tabindex: "-1", href: "#{new_user_path}"}Add Manually + %li + %a{role: "menuitem", tabindex: "-2", href: "#{spreadsheets_path}"}Google Spreadsheets %ul.nav.navbar-nav.navbar-right %li.active %a{href: "#"} - Subscriber count : - =User.count + %h4 + Subscriber count : + =User.count %div.container %div.row %div.col-sm-9= yield diff --git a/app/views/spreadsheets/edit.html.haml b/app/views/spreadsheets/edit.html.haml new file mode 100644 index 0000000..ee1ae52 --- /dev/null +++ b/app/views/spreadsheets/edit.html.haml @@ -0,0 +1 @@ +=debug @sp \ No newline at end of file diff --git a/app/views/spreadsheets/index.html.haml b/app/views/spreadsheets/index.html.haml new file mode 100644 index 0000000..ec9f293 --- /dev/null +++ b/app/views/spreadsheets/index.html.haml @@ -0,0 +1,31 @@ +%h4 + =link_to 'Add New Spreadsheet', 'auth/google/' + +%table.table.table-striped + %tr.info + %td + %strong # + %td + %strong + Spreadsheets ( + =Spreadsheet.count + ) + %td + %strong Operations + - i = 0 + - @spreadsheets.each do |ss| + %tr + %td + = i = i + 1 + %td + - if ss['spreadsheet_title'] + =ss['spreadsheet_title'] + -else + =link_to 'Spreadsheet not initialised', new_spreadsheet_path(access_token: ss['access_token']) + %td + =link_to 'Delete', spreadsheet_path(ss), method: :delete + -if ss['spreadsheet_title'] + | + =link_to 'Update', spreadsheet_path(ss), method: :patch + + diff --git a/app/views/spreadsheets/new.html.haml b/app/views/spreadsheets/new.html.haml new file mode 100644 index 0000000..4a3f606 --- /dev/null +++ b/app/views/spreadsheets/new.html.haml @@ -0,0 +1,7 @@ +=@req +%br +-#count = @spreadsheets.count +=#count +-#count.times do |i| + =#link_to @spreadsheets[i]['title'], edit_spreadsheet_path(@spreadsheets[i]['id'], title: @spreadsheets[i]['title'], token: @token) if @spreadsheets[i]['mimeType'].include?('spreadsheet') + %br \ No newline at end of file diff --git a/config/application.rb b/config/application.rb index 6e89af7..13fe384 100644 --- a/config/application.rb +++ b/config/application.rb @@ -16,6 +16,7 @@ module Lightair class Application < Rails::Application config.assets.precompile += %w(*.png, *.jpg, *.jpeg, *.gif) + config.autoload_paths += Dir["#{config.root}/lib/**/"] # Settings in config/environments/* take precedence over those specified here. # Application configuration should go into files in config/initializers # -- all .rb files in that directory are automatically loaded. diff --git a/config/initializers/google_oauth.rb b/config/initializers/google_oauth.rb index 12de4e8..69265b6 100644 --- a/config/initializers/google_oauth.rb +++ b/config/initializers/google_oauth.rb @@ -1,11 +1,10 @@ Rails.application.config.middleware.use OmniAuth::Builder do provider :google_oauth2, ENV['GOOGLE_ID'], ENV['GOOGLE_KEY'], { - name: "google", + name: 'google', scope: 'userinfo.profile,userinfo.email,drive,https://spreadsheets.google.com/feeds', prompt: 'consent', - access_type: "offline", + access_type: 'offline', + #redirect_uri: 'http://localhost:8080/auth/google/spreadsheets' } - - #provider :linkedin, '75cmlzl0cpmwa2', 'I5y0aRBkfpgMmTqp', redirect_uri: 'http://localhost:8080/auth/linkedin/callback', scope:'r_emailaddress r_network r_contactinfo rw_company_admin rw_nus rw_groups w_messages r_basicprofile r_fullprofile' end \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 3c7b591..8f07095 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,17 +1,16 @@ Rails.application.routes.draw do - +=begin get '/home/sheets', to: 'home#add_from_google', as: 'add_from_google' get '/auth/:provider/callback', to: 'callbacks#omniauth' get '/linkedin', to: 'callbacks#linkedin', as: 'linkedin' get '/callbacks/sheet/:id', to: 'callbacks#setSheet', as: 'set_sheet' get '/callbacks/index', to: 'callbacks#index', as: 'callback_index' get '/callbacks/update/:id', to: 'callbacks#update', as: 'callback_update' - - resources :users - resources :newsletters - resources :home +=end + get '/auth/:provider/callback', to: 'spreadsheets#new' + resources :users, :newsletters, :home, :spreadsheets - root :to => "home#index" + root :to => 'home#index' # The priority is based upon order of creation: first created -> highest priority. # See how all your routes lay out with "rake routes". diff --git a/lib/google_spreadsheets.rb b/lib/google_spreadsheets.rb new file mode 100644 index 0000000..880fb04 --- /dev/null +++ b/lib/google_spreadsheets.rb @@ -0,0 +1,46 @@ +module GoogleSpreadsheets + def get_spreadsheets(spreadsheet) + #binding.pry + if Time.now > spreadsheet['expires_at'] + spreadsheet = refresh_token spreadsheet + end + + client = Google::APIClient.new + client.authorization.access_token = spreadsheet.access_token + drive = client.discovered_api('drive', 'v2') + + wks = client.execute( + api_method: drive.files.list, + parameters: {}, + headers: {'Content-Type' => 'application/json'} + ) + (JSON.parse(wks.data.to_json))['items'] + end + + def get_worksheets(spreadsheet, i = 0) + if Time.now > spreadsheet['expires_at'] + spreadsheet = refresh_token spreadsheet + end + + session = GoogleDrive.login_with_oauth(spreadsheet['access_token']) + session.spreadsheet_by_key(spreadsheet['spreadsheet_id']).worksheets[i] + end + + def refresh_token(spreadsheet) + data = { + client_id: ENV['GOOGLE_ID'], + client_secret: ENV['GOOGLE_KEY'], + refresh_token: spreadsheet['refresh_token'], + grant_type: 'refresh_token' + } + re = ActiveSupport::JSON.decode(RestClient.post 'https://accounts.google.com/o/oauth2/token', data) + + #sheets = Token.where(spreadsheet_id: spreadsheet['spreadsheet_id'])[0] + spreadsheet['access_token'] = re['access_token'] + spreadsheet['expires_at'] = (Time.now + re['expires_in'].second).localtime + #binding.pry + spreadsheet.save + + spreadsheet + end +end \ No newline at end of file diff --git a/spec/controllers/google_auth_response.json b/spec/controllers/google_auth_response.json new file mode 100644 index 0000000..8473da2 --- /dev/null +++ b/spec/controllers/google_auth_response.json @@ -0,0 +1,12 @@ +HTTP/1.1 302 Found +Content-Length: 537 +Location: https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=367225507767-119uvbhdadqbft2kn4759rodoiivksn9.apps.googleusercontent.com&prompt=consent&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fauth%2Fgoogle%2Fcallback&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive+https%3A%2F%2Fspreadsheets.google.com%2Ffeeds&state=df37c7da59cf8f7a4899cd5a67a612e9d18946664bc98d4f +Cache-Control: no-cache +X-Request-Id: b511bdb4-c778-4f1a-b5d7-849f1402b1a3 +X-Runtime: 0.003534 +Server: WEBrick/1.3.1 (Ruby/2.1.2/2014-05-08) +Date: Thu, 10 Jul 2014 10:39:34 GMT +Connection: Keep-Alive +Set-Cookie: _lightair_session=Uy9SNDQ1LzZFandLd1g4S2VVTEptR3ZRa0RBcnNFWGtZbG1VZmNKMzc5Z1F6cDFuaHBCa2lScHcxL1FBQ044RTJZMU9iUWF2UitaVjQxcGVzeUZwS0Q3NkdXdzg2SHB6S0IrcU1sR2ExelhRRVZuWFF6MFpraktBMTNCcTM4UVZ5a01ReitYSzNYT2M0dXR1NWViUjhvVGVxUnYwRUtLREtoQUVjMkJPMW1PZG14MUVUQlN0Q2hkRUh5blVLMDZRLS1OZ3JGQXFWQmJKMGNCWGszQWoyMkNRPT0%3D--8345e9f7215c9ef812febd3588c505cfaef628c1; path=/; HttpOnly + +Redirecting to https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=367225507767-119uvbhdadqbft2kn4759rodoiivksn9.apps.googleusercontent.com&prompt=consent&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fauth%2Fgoogle%2Fcallback&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive+https%3A%2F%2Fspreadsheets.google.com%2Ffeeds&state=df37c7da59cf8f7a4899cd5a67a612e9d18946664bc98d4f... diff --git a/spec/controllers/host_response.json b/spec/controllers/host_response.json new file mode 100644 index 0000000..f76a7f1 --- /dev/null +++ b/spec/controllers/host_response.json @@ -0,0 +1,121 @@ +HTTP/1.1 200 OK +X-Frame-Options: SAMEORIGIN +X-Xss-Protection: 1; mode=block +X-Content-Type-Options: nosniff +Content-Type: text/html; charset=utf-8 +Etag: "b29936011c26adc86d08ede08dc03e1e" +Cache-Control: max-age=0, private, must-revalidate +X-Request-Id: cdc9c224-e586-409f-adfb-8367d40f8a41 +X-Runtime: 0.015686 +Server: WEBrick/1.3.1 (Ruby/2.1.2/2014-05-08) +Date: Thu, 10 Jul 2014 10:21:40 GMT +Content-Length: 4406 +Connection: Keep-Alive +Set-Cookie: request_method=GET; path=/ +Set-Cookie: _lightair_session=aUVDRko5L1dYOFJqN2NvNmg2NkI3b2JwN01GRXduamtJdFhmM3hoU0dkR2U3WkpLS2ZUUFlqRWppOGg1NHBPYllDaVpDM2w5d0xxVlBuRFJjaHVFa0FaRVdXOUdQWDlFSGJoaUZTYkdtQnl0N3F3OVdQd1c0YU5rZjNQZ09JcTFmck1HenpMbnhxaHFRT091SnZkdUZRPT0tLTVuczRGVTZyNHdwWXVaZmliU0VxZ0E9PQ%3D%3D--f5a6ab0bbbd0ec42bc63ca27924361e391dd36b3; path=/; HttpOnly + + + + + Lightair + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+
+
+

Insight of LightAir

+

LightAir is a mass Mailer designed to send newsletters designed in html to be sent to a few hundered to a tens of thousands of subscribers. It has an inbuilt HTML editor to create a newsletter online.

+
+
+
+
+ + diff --git a/spec/controllers/spreadsheets_controller_spec.rb b/spec/controllers/spreadsheets_controller_spec.rb new file mode 100644 index 0000000..2df1e40 --- /dev/null +++ b/spec/controllers/spreadsheets_controller_spec.rb @@ -0,0 +1,29 @@ +require 'rails_helper' +require 'webmock/rspec' + +RSpec.describe SpreadsheetsController, :type => :controller do + google_auth_response = File.new('spec/controllers/google_auth_response.json') + context 'GET Index' do + it 'it renders the index template' do + get :index + expect(response).to render_template(:index) + end + + it 'should return all the spreadhseets' do + c = SpreadsheetsController.new + r = c.instance_eval{index} + expect(r.count).to eq(Spreadsheet.count) + end + end + + context 'GET New' do + it 'opens authentication page on calling auth/google' do + stub_request(:get, 'http://localhost:8080/auth/google/').to_return(google_auth_response) + stub_request(:get, "https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=367225507767-119uvbhdadqbft2kn4759rodoiivksn9.apps.googleusercontent.com&prompt=consent&redirect_uri=http://localhost:8080/auth/google/callback&response_type=code&scope=https://www.googleapis.com/auth/userinfo.profile%20https://www.googleapis.com/auth/userinfo.email%20https://www.googleapis.com/auth/drive%20https://spreadsheets.google.com/feeds&state=df37c7da59cf8f7a4899cd5a67a612e9d18946664bc98d4f"). + with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate', 'Cookie'=>'_lightair_session=Uy9SNDQ1LzZFandLd1g4S2VVTEptR3ZRa0RBcnNFWGtZbG1VZmNKMzc5Z1F6cDFuaHBCa2lScHcxL1FBQ044RTJZMU9iUWF2UitaVjQxcGVzeUZwS0Q3NkdXdzg2SHB6S0IrcU1sR2ExelhRRVZuWFF6MFpraktBMTNCcTM4UVZ5a01ReitYSzNYT2M0dXR1NWViUjhvVGVxUnYwRUtLREtoQUVjMkJPMW1PZG14MUVUQlN0Q2hkRUh5blVLMDZRLS1OZ3JGQXFWQmJKMGNCWGszQWoyMkNRPT0=--8345e9f7215c9ef812febd3588c505cfaef628c1', 'User-Agent'=>'Ruby'}). + to_return(:status => 200, :body => "", :headers => {}) + + RestClient.get('http://localhost:8080/auth/google/') + end + end +end diff --git a/spec/factories/spreadsheets.rb b/spec/factories/spreadsheets.rb new file mode 100644 index 0000000..22ce7c5 --- /dev/null +++ b/spec/factories/spreadsheets.rb @@ -0,0 +1,6 @@ +# Read about factories at https://github.com/thoughtbot/factory_girl + +FactoryGirl.define do + factory :spreadsheet do + end +end diff --git a/spec/helpers/spreadsheets_helper_spec.rb b/spec/helpers/spreadsheets_helper_spec.rb new file mode 100644 index 0000000..35864e6 --- /dev/null +++ b/spec/helpers/spreadsheets_helper_spec.rb @@ -0,0 +1,15 @@ +require 'rails_helper' + +# Specs in this file have access to a helper object that includes +# the SpreadsheetsHelper. For example: +# +# describe SpreadsheetsHelper do +# describe "string concat" do +# it "concats two strings with spaces" do +# expect(helper.concat_strings("this","that")).to eq("this that") +# end +# end +# end +RSpec.describe SpreadsheetsHelper, :type => :helper do + pending "add some examples to (or delete) #{__FILE__}" +end diff --git a/spec/models/spreadsheet_spec.rb b/spec/models/spreadsheet_spec.rb new file mode 100644 index 0000000..a4927c8 --- /dev/null +++ b/spec/models/spreadsheet_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe Spreadsheet, :type => :model do + pending "add some examples to (or delete) #{__FILE__}" +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index cfb18dc..77dfef0 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -3,7 +3,7 @@ # The generated `.rspec` file contains `--require spec_helper` which will cause this # file to always be loaded, without a need to explicitly require it in any files. # -# Given that it is always loaded, you are encouraged to keep this file as +# Given th at it is always loaded, you are encouraged to keep this file as # light-weight as possible. Requiring heavyweight dependencies from this file # will add to the boot time of your test suite on EVERY test run, even for an # individual file that may not need all of that loaded. Instead, make a From 291acc678ccb70562401f841feb7bdf53aef8e67 Mon Sep 17 00:00:00 2001 From: basnal Date: Fri, 11 Jul 2014 10:50:24 +0530 Subject: [PATCH 07/13] Unnecessary json files removed #11 --- spec/controllers/google_auth_response.json | 12 -- spec/controllers/host_response.json | 121 --------------------- 2 files changed, 133 deletions(-) delete mode 100644 spec/controllers/google_auth_response.json delete mode 100644 spec/controllers/host_response.json diff --git a/spec/controllers/google_auth_response.json b/spec/controllers/google_auth_response.json deleted file mode 100644 index 8473da2..0000000 --- a/spec/controllers/google_auth_response.json +++ /dev/null @@ -1,12 +0,0 @@ -HTTP/1.1 302 Found -Content-Length: 537 -Location: https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=367225507767-119uvbhdadqbft2kn4759rodoiivksn9.apps.googleusercontent.com&prompt=consent&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fauth%2Fgoogle%2Fcallback&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive+https%3A%2F%2Fspreadsheets.google.com%2Ffeeds&state=df37c7da59cf8f7a4899cd5a67a612e9d18946664bc98d4f -Cache-Control: no-cache -X-Request-Id: b511bdb4-c778-4f1a-b5d7-849f1402b1a3 -X-Runtime: 0.003534 -Server: WEBrick/1.3.1 (Ruby/2.1.2/2014-05-08) -Date: Thu, 10 Jul 2014 10:39:34 GMT -Connection: Keep-Alive -Set-Cookie: _lightair_session=Uy9SNDQ1LzZFandLd1g4S2VVTEptR3ZRa0RBcnNFWGtZbG1VZmNKMzc5Z1F6cDFuaHBCa2lScHcxL1FBQ044RTJZMU9iUWF2UitaVjQxcGVzeUZwS0Q3NkdXdzg2SHB6S0IrcU1sR2ExelhRRVZuWFF6MFpraktBMTNCcTM4UVZ5a01ReitYSzNYT2M0dXR1NWViUjhvVGVxUnYwRUtLREtoQUVjMkJPMW1PZG14MUVUQlN0Q2hkRUh5blVLMDZRLS1OZ3JGQXFWQmJKMGNCWGszQWoyMkNRPT0%3D--8345e9f7215c9ef812febd3588c505cfaef628c1; path=/; HttpOnly - -Redirecting to https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=367225507767-119uvbhdadqbft2kn4759rodoiivksn9.apps.googleusercontent.com&prompt=consent&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fauth%2Fgoogle%2Fcallback&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive+https%3A%2F%2Fspreadsheets.google.com%2Ffeeds&state=df37c7da59cf8f7a4899cd5a67a612e9d18946664bc98d4f... diff --git a/spec/controllers/host_response.json b/spec/controllers/host_response.json deleted file mode 100644 index f76a7f1..0000000 --- a/spec/controllers/host_response.json +++ /dev/null @@ -1,121 +0,0 @@ -HTTP/1.1 200 OK -X-Frame-Options: SAMEORIGIN -X-Xss-Protection: 1; mode=block -X-Content-Type-Options: nosniff -Content-Type: text/html; charset=utf-8 -Etag: "b29936011c26adc86d08ede08dc03e1e" -Cache-Control: max-age=0, private, must-revalidate -X-Request-Id: cdc9c224-e586-409f-adfb-8367d40f8a41 -X-Runtime: 0.015686 -Server: WEBrick/1.3.1 (Ruby/2.1.2/2014-05-08) -Date: Thu, 10 Jul 2014 10:21:40 GMT -Content-Length: 4406 -Connection: Keep-Alive -Set-Cookie: request_method=GET; path=/ -Set-Cookie: _lightair_session=aUVDRko5L1dYOFJqN2NvNmg2NkI3b2JwN01GRXduamtJdFhmM3hoU0dkR2U3WkpLS2ZUUFlqRWppOGg1NHBPYllDaVpDM2w5d0xxVlBuRFJjaHVFa0FaRVdXOUdQWDlFSGJoaUZTYkdtQnl0N3F3OVdQd1c0YU5rZjNQZ09JcTFmck1HenpMbnhxaHFRT091SnZkdUZRPT0tLTVuczRGVTZyNHdwWXVaZmliU0VxZ0E9PQ%3D%3D--f5a6ab0bbbd0ec42bc63ca27924361e391dd36b3; path=/; HttpOnly - - - - - Lightair - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
-
-
-

Insight of LightAir

-

LightAir is a mass Mailer designed to send newsletters designed in html to be sent to a few hundered to a tens of thousands of subscribers. It has an inbuilt HTML editor to create a newsletter online.

-
-
-
-
- - From 81ef8fbc3347be310f8788a3b9006768a9eda47c Mon Sep 17 00:00:00 2001 From: basnal Date: Fri, 11 Jul 2014 11:00:32 +0530 Subject: [PATCH 08/13] Code was refactored #11 --- .gitignore | 1 + app/controllers/spreadsheets_controller.rb | 3 --- config/routes.rb | 9 +-------- 3 files changed, 2 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 72dcb25..b8ae448 100644 --- a/.gitignore +++ b/.gitignore @@ -49,3 +49,4 @@ build/ /tmp *.log test.html.haml + diff --git a/app/controllers/spreadsheets_controller.rb b/app/controllers/spreadsheets_controller.rb index 8bf26d1..c823cdc 100644 --- a/app/controllers/spreadsheets_controller.rb +++ b/app/controllers/spreadsheets_controller.rb @@ -6,8 +6,6 @@ def index end def new - @req = params -=begin if params[:access_token] spreadsheet = Spreadsheet.where(access_token: params['access_token'])[0] else @@ -24,7 +22,6 @@ def new @msg = 'no work' # Handle if data does not get saved end -=end end def edit diff --git a/config/routes.rb b/config/routes.rb index 8f07095..3e337c7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,12 +1,5 @@ Rails.application.routes.draw do -=begin - get '/home/sheets', to: 'home#add_from_google', as: 'add_from_google' - get '/auth/:provider/callback', to: 'callbacks#omniauth' - get '/linkedin', to: 'callbacks#linkedin', as: 'linkedin' - get '/callbacks/sheet/:id', to: 'callbacks#setSheet', as: 'set_sheet' - get '/callbacks/index', to: 'callbacks#index', as: 'callback_index' - get '/callbacks/update/:id', to: 'callbacks#update', as: 'callback_update' -=end + get '/auth/:provider/callback', to: 'spreadsheets#new' resources :users, :newsletters, :home, :spreadsheets From be62b6babf4e9ab1712d44bbaf8cf6be290a1f98 Mon Sep 17 00:00:00 2001 From: Pankaj Basnal Date: Fri, 11 Jul 2014 11:04:03 +0530 Subject: [PATCH 09/13] Updated new.html.haml #5 --- app/views/spreadsheets/new.html.haml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/app/views/spreadsheets/new.html.haml b/app/views/spreadsheets/new.html.haml index 4a3f606..e9f2c45 100644 --- a/app/views/spreadsheets/new.html.haml +++ b/app/views/spreadsheets/new.html.haml @@ -1,7 +1,6 @@ -=@req %br --#count = @spreadsheets.count -=#count --#count.times do |i| - =#link_to @spreadsheets[i]['title'], edit_spreadsheet_path(@spreadsheets[i]['id'], title: @spreadsheets[i]['title'], token: @token) if @spreadsheets[i]['mimeType'].include?('spreadsheet') - %br \ No newline at end of file +-count = @spreadsheets.count +=count +-count.times do |i| + =link_to @spreadsheets[i]['title'], edit_spreadsheet_path(@spreadsheets[i]['id'], title: @spreadsheets[i]['title'], token: @token) if @spreadsheets[i]['mimeType'].include?('spreadsheet') + %br From a420dabeea1d225d0829c4595406a07210fa16da Mon Sep 17 00:00:00 2001 From: basnal Date: Fri, 11 Jul 2014 11:18:04 +0530 Subject: [PATCH 10/13] Simplecov version was changed to resolve bugs #10 --- Gemfile | 2 +- Gemfile.lock | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/Gemfile b/Gemfile index e6540b2..94872a1 100644 --- a/Gemfile +++ b/Gemfile @@ -79,7 +79,7 @@ group :development, :test do # Use to clean database after executing a test case gem 'database_cleaner' # Use to track how much code has been tested - gem 'simplecov' + gem 'simplecov', '~> 0.7.1' # Webmock to stub http requests gem 'webmock' # VCR to record the responses from web and replay them when needed diff --git a/Gemfile.lock b/Gemfile.lock index 16efa74..9f9d5c9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -71,7 +71,6 @@ GEM actionmailer (>= 3.2.6, < 5) devise (>= 3.2.0) diff-lcs (1.2.5) - docile (1.1.5) erubis (2.7.0) execjs (2.2.1) extlib (0.9.16) @@ -239,11 +238,10 @@ GEM simple_form (3.0.2) actionpack (~> 4.0) activemodel (~> 4.0) - simplecov (0.8.2) - docile (~> 1.1.0) - multi_json - simplecov-html (~> 0.8.0) - simplecov-html (0.8.0) + simplecov (0.7.1) + multi_json (~> 1.0) + simplecov-html (~> 0.7.1) + simplecov-html (0.7.1) slop (3.5.0) spring (1.1.3) sprockets (2.11.0) @@ -309,7 +307,7 @@ DEPENDENCIES sendgrid sidekiq simple_form - simplecov + simplecov (~> 0.7.1) spring therubyracer turbolinks From d40b26a0114417a458d4f7c7949908b4cfd1b08b Mon Sep 17 00:00:00 2001 From: basnal Date: Fri, 11 Jul 2014 12:20:24 +0530 Subject: [PATCH 11/13] Handler of Authentication failure added #5 --- app/controllers/spreadsheets_controller.rb | 11 +- app/views/spreadsheets/index.html.haml | 1 + config/initializers/google_oauth.rb | 9 +- config/routes.rb | 3 +- spec/controllers/google_auth_response.json | 12 ++ spec/controllers/host_response.json | 121 +++++++++++++++++++++ 6 files changed, 150 insertions(+), 7 deletions(-) create mode 100644 spec/controllers/google_auth_response.json create mode 100644 spec/controllers/host_response.json diff --git a/app/controllers/spreadsheets_controller.rb b/app/controllers/spreadsheets_controller.rb index c823cdc..d421ba7 100644 --- a/app/controllers/spreadsheets_controller.rb +++ b/app/controllers/spreadsheets_controller.rb @@ -17,9 +17,7 @@ def new # Spreadsheets from google @spreadsheets = get_spreadsheets(spreadsheet) @token = spreadsheet.access_token - @msg = 'work' else - @msg = 'no work' # Handle if data does not get saved end end @@ -28,7 +26,6 @@ def edit token = spreadsheet_params['token'] spreadsheet = Spreadsheet.where(access_token: token)[0] spreadsheet.add_spreadsheet_credentials(spreadsheet_params) - #binding.pry spreadsheet.save @spreadsheets = Spreadsheet.all.to_a @@ -51,4 +48,12 @@ def destroy def spreadsheet_params params.permit(:title, :id, :token) end + + def failure + if params['message'].match('access_denied') + @msg = "Account integration Failed. User Refused to grant permissions" + end + @spreadsheets = Spreadsheet.all.to_a + render action: 'index' + end end diff --git a/app/views/spreadsheets/index.html.haml b/app/views/spreadsheets/index.html.haml index ec9f293..a62fe7e 100644 --- a/app/views/spreadsheets/index.html.haml +++ b/app/views/spreadsheets/index.html.haml @@ -1,3 +1,4 @@ += @msg if @msg %h4 =link_to 'Add New Spreadsheet', 'auth/google/' diff --git a/config/initializers/google_oauth.rb b/config/initializers/google_oauth.rb index 69265b6..4cde5db 100644 --- a/config/initializers/google_oauth.rb +++ b/config/initializers/google_oauth.rb @@ -4,7 +4,10 @@ name: 'google', scope: 'userinfo.profile,userinfo.email,drive,https://spreadsheets.google.com/feeds', prompt: 'consent', - access_type: 'offline', - #redirect_uri: 'http://localhost:8080/auth/google/spreadsheets' + access_type: 'offline' } -end \ No newline at end of file +end + +OmniAuth.config.on_failure = Proc.new { |env| + OmniAuth::FailureEndpoint.new(env).redirect_to_failure +} \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 3e337c7..f28f4ee 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,6 +1,7 @@ Rails.application.routes.draw do - get '/auth/:provider/callback', to: 'spreadsheets#new' + get '/auth/:provider/callback', to: 'spreadsheets#new' + get '/auth/failure', to: 'spreadsheets#failure' resources :users, :newsletters, :home, :spreadsheets root :to => 'home#index' diff --git a/spec/controllers/google_auth_response.json b/spec/controllers/google_auth_response.json new file mode 100644 index 0000000..8473da2 --- /dev/null +++ b/spec/controllers/google_auth_response.json @@ -0,0 +1,12 @@ +HTTP/1.1 302 Found +Content-Length: 537 +Location: https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=367225507767-119uvbhdadqbft2kn4759rodoiivksn9.apps.googleusercontent.com&prompt=consent&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fauth%2Fgoogle%2Fcallback&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive+https%3A%2F%2Fspreadsheets.google.com%2Ffeeds&state=df37c7da59cf8f7a4899cd5a67a612e9d18946664bc98d4f +Cache-Control: no-cache +X-Request-Id: b511bdb4-c778-4f1a-b5d7-849f1402b1a3 +X-Runtime: 0.003534 +Server: WEBrick/1.3.1 (Ruby/2.1.2/2014-05-08) +Date: Thu, 10 Jul 2014 10:39:34 GMT +Connection: Keep-Alive +Set-Cookie: _lightair_session=Uy9SNDQ1LzZFandLd1g4S2VVTEptR3ZRa0RBcnNFWGtZbG1VZmNKMzc5Z1F6cDFuaHBCa2lScHcxL1FBQ044RTJZMU9iUWF2UitaVjQxcGVzeUZwS0Q3NkdXdzg2SHB6S0IrcU1sR2ExelhRRVZuWFF6MFpraktBMTNCcTM4UVZ5a01ReitYSzNYT2M0dXR1NWViUjhvVGVxUnYwRUtLREtoQUVjMkJPMW1PZG14MUVUQlN0Q2hkRUh5blVLMDZRLS1OZ3JGQXFWQmJKMGNCWGszQWoyMkNRPT0%3D--8345e9f7215c9ef812febd3588c505cfaef628c1; path=/; HttpOnly + +Redirecting to https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=367225507767-119uvbhdadqbft2kn4759rodoiivksn9.apps.googleusercontent.com&prompt=consent&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fauth%2Fgoogle%2Fcallback&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive+https%3A%2F%2Fspreadsheets.google.com%2Ffeeds&state=df37c7da59cf8f7a4899cd5a67a612e9d18946664bc98d4f... diff --git a/spec/controllers/host_response.json b/spec/controllers/host_response.json new file mode 100644 index 0000000..f76a7f1 --- /dev/null +++ b/spec/controllers/host_response.json @@ -0,0 +1,121 @@ +HTTP/1.1 200 OK +X-Frame-Options: SAMEORIGIN +X-Xss-Protection: 1; mode=block +X-Content-Type-Options: nosniff +Content-Type: text/html; charset=utf-8 +Etag: "b29936011c26adc86d08ede08dc03e1e" +Cache-Control: max-age=0, private, must-revalidate +X-Request-Id: cdc9c224-e586-409f-adfb-8367d40f8a41 +X-Runtime: 0.015686 +Server: WEBrick/1.3.1 (Ruby/2.1.2/2014-05-08) +Date: Thu, 10 Jul 2014 10:21:40 GMT +Content-Length: 4406 +Connection: Keep-Alive +Set-Cookie: request_method=GET; path=/ +Set-Cookie: _lightair_session=aUVDRko5L1dYOFJqN2NvNmg2NkI3b2JwN01GRXduamtJdFhmM3hoU0dkR2U3WkpLS2ZUUFlqRWppOGg1NHBPYllDaVpDM2w5d0xxVlBuRFJjaHVFa0FaRVdXOUdQWDlFSGJoaUZTYkdtQnl0N3F3OVdQd1c0YU5rZjNQZ09JcTFmck1HenpMbnhxaHFRT091SnZkdUZRPT0tLTVuczRGVTZyNHdwWXVaZmliU0VxZ0E9PQ%3D%3D--f5a6ab0bbbd0ec42bc63ca27924361e391dd36b3; path=/; HttpOnly + + + + + Lightair + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+
+
+

Insight of LightAir

+

LightAir is a mass Mailer designed to send newsletters designed in html to be sent to a few hundered to a tens of thousands of subscribers. It has an inbuilt HTML editor to create a newsletter online.

+
+
+
+
+ + From 24a219e0836846a476335faa01f88dcda7eb0a61 Mon Sep 17 00:00:00 2001 From: basnal Date: Mon, 14 Jul 2014 22:47:38 +0530 Subject: [PATCH 12/13] Specs added --- Gemfile | 3 + app/controllers/spreadsheets_controller.rb | 31 +- app/helpers/callbacks_helper.rb | 2 - app/models/spreadsheet.rb | 3 +- app/views/spreadsheets/index.html.haml | 10 +- app/views/spreadsheets/new.html.haml | 13 +- config/environments/test.rb | 4 +- lib/google.rb | 44 ++ lib/google_spreadsheets.rb | 46 -- .../spreadsheets_controller_spec.rb | 122 ++++- spec/factories/spreadsheets.rb | 7 +- spec/spec_helper.rb | 17 + spec/support/vcr_setup.rb | 7 + spec/vcr/controllers/api-new_tokens.yml | 518 ++++++++++++++++++ spec/vcr/controllers/api-permissions.yml | 122 +++++ spec/vcr/controllers/api-response.yml | 518 ++++++++++++++++++ spec/vcr/controllers/api-update-with-data.yml | 340 ++++++++++++ spec/vcr/controllers/api-update.yml | 394 +++++++++++++ 18 files changed, 2119 insertions(+), 82 deletions(-) delete mode 100644 app/helpers/callbacks_helper.rb create mode 100644 lib/google.rb delete mode 100644 lib/google_spreadsheets.rb create mode 100644 spec/support/vcr_setup.rb create mode 100644 spec/vcr/controllers/api-new_tokens.yml create mode 100644 spec/vcr/controllers/api-permissions.yml create mode 100644 spec/vcr/controllers/api-response.yml create mode 100644 spec/vcr/controllers/api-update-with-data.yml create mode 100644 spec/vcr/controllers/api-update.yml diff --git a/Gemfile b/Gemfile index 94872a1..8299568 100644 --- a/Gemfile +++ b/Gemfile @@ -80,6 +80,9 @@ group :development, :test do gem 'database_cleaner' # Use to track how much code has been tested gem 'simplecov', '~> 0.7.1' +end + +group :test do # Webmock to stub http requests gem 'webmock' # VCR to record the responses from web and replay them when needed diff --git a/app/controllers/spreadsheets_controller.rb b/app/controllers/spreadsheets_controller.rb index d421ba7..51b6925 100644 --- a/app/controllers/spreadsheets_controller.rb +++ b/app/controllers/spreadsheets_controller.rb @@ -1,5 +1,6 @@ class SpreadsheetsController < ApplicationController - include GoogleSpreadsheets + require 'google' + include Google::Spreadsheets def index @spreadsheets = Spreadsheet.all.to_a @@ -15,18 +16,23 @@ def new if spreadsheet.save # Spreadsheets from google - @spreadsheets = get_spreadsheets(spreadsheet) + @spreadsheets = list(spreadsheet) @token = spreadsheet.access_token else # Handle if data does not get saved + @msg = 'Getting same access token. Try deleting ' end end def edit token = spreadsheet_params['token'] spreadsheet = Spreadsheet.where(access_token: token)[0] - spreadsheet.add_spreadsheet_credentials(spreadsheet_params) - spreadsheet.save + + if spreadsheet.add_spreadsheet_credentials(spreadsheet_params) + spreadsheet.save + else + @error = 'Already Present' + end @spreadsheets = Spreadsheet.all.to_a @@ -35,8 +41,9 @@ def edit def update spreadsheet = Spreadsheet.find(params['id']) - @worksheet = get_worksheets(spreadsheet) + @worksheet = worksheets(spreadsheet) User.add_users_from_worksheet(@worksheet) + redirect_to users_path end @@ -45,15 +52,19 @@ def destroy redirect_to spreadsheets_path end - def spreadsheet_params - params.permit(:title, :id, :token) - end - def failure if params['message'].match('access_denied') - @msg = "Account integration Failed. User Refused to grant permissions" + @msg = 'Account integration Failed. User Refused to grant permissions' end @spreadsheets = Spreadsheet.all.to_a render action: 'index' end + + ################################# + private + ################################# + + def spreadsheet_params + params.permit(:title, :id, :token) + end end diff --git a/app/helpers/callbacks_helper.rb b/app/helpers/callbacks_helper.rb deleted file mode 100644 index 6c9550c..0000000 --- a/app/helpers/callbacks_helper.rb +++ /dev/null @@ -1,2 +0,0 @@ -module CallbacksHelper -end diff --git a/app/models/spreadsheet.rb b/app/models/spreadsheet.rb index e8fed63..640648b 100644 --- a/app/models/spreadsheet.rb +++ b/app/models/spreadsheet.rb @@ -7,7 +7,7 @@ class Spreadsheet field :expires_at, type: Time field :access_token, type: String - validates :access_token, uniqueness: true + validates :access_token, presence: true, uniqueness: true def add_tokens(tokens = {}) self['access_token'] = tokens.fetch('token') @@ -16,7 +16,6 @@ def add_tokens(tokens = {}) end def add_spreadsheet_credentials(credentials = {}) - #binding.pry self['spreadsheet_id'] = credentials['id'] self['spreadsheet_title'] = credentials['title'] end diff --git a/app/views/spreadsheets/index.html.haml b/app/views/spreadsheets/index.html.haml index a62fe7e..cc0691a 100644 --- a/app/views/spreadsheets/index.html.haml +++ b/app/views/spreadsheets/index.html.haml @@ -1,6 +1,6 @@ = @msg if @msg %h4 - =link_to 'Add New Spreadsheet', 'auth/google/' + =link_to 'Add New Spreadsheet', '/auth/google/' %table.table.table-striped %tr.info @@ -19,10 +19,14 @@ %td = i = i + 1 %td - - if ss['spreadsheet_title'] + -if ss['spreadsheet_title'] =ss['spreadsheet_title'] -else - =link_to 'Spreadsheet not initialised', new_spreadsheet_path(access_token: ss['access_token']) + =link_to 'Get Spreadsheet', new_spreadsheet_path(access_token: ss['access_token']) + -if @error + ( + =@error + ) %td =link_to 'Delete', spreadsheet_path(ss), method: :delete -if ss['spreadsheet_title'] diff --git a/app/views/spreadsheets/new.html.haml b/app/views/spreadsheets/new.html.haml index e9f2c45..c644423 100644 --- a/app/views/spreadsheets/new.html.haml +++ b/app/views/spreadsheets/new.html.haml @@ -1,6 +1,7 @@ -%br --count = @spreadsheets.count -=count --count.times do |i| - =link_to @spreadsheets[i]['title'], edit_spreadsheet_path(@spreadsheets[i]['id'], title: @spreadsheets[i]['title'], token: @token) if @spreadsheets[i]['mimeType'].include?('spreadsheet') - %br +-if @msg + =@msg +-else + -count = @spreadsheets.count + -count.times do |i| + =link_to @spreadsheets[i]['title'], edit_spreadsheet_path(@spreadsheets[i]['id'], title: @spreadsheets[i]['title'], token: @token) if @spreadsheets[i]['mimeType'].include?('spreadsheet') + %br diff --git a/config/environments/test.rb b/config/environments/test.rb index f2d8184..971e3d6 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -1,6 +1,6 @@ Rails.application.configure do - ENV["GOOGLE_ID"] = '367225507767-119uvbhdadqbft2kn4759rodoiivksn9.apps.googleusercontent.com' - ENV["GOOGLE_KEY"] = '1yX7HzuzWi3yD1OqJ21ZgpSS' + ENV['GOOGLE_ID'] = '367225507767-119uvbhdadqbft2kn4759rodoiivksn9.apps.googleusercontent.com' + ENV['GOOGLE_KEY'] = '1yX7HzuzWi3yD1OqJ21ZgpSS' # Settings specified here will take precedence over those in config/application.rb. # The test environment is used exclusively to run your application's diff --git a/lib/google.rb b/lib/google.rb new file mode 100644 index 0000000..9b68401 --- /dev/null +++ b/lib/google.rb @@ -0,0 +1,44 @@ +module Google + module Spreadsheets + def list(spreadsheet) + if Time.now > spreadsheet['expires_at'] + spreadsheet = refresh_token spreadsheet + end + + client = Google::APIClient.new + client.authorization.access_token = spreadsheet.access_token + drive = client.discovered_api('drive', 'v2') + + wks = client.execute( + api_method: drive.files.list, + parameters: {}, + headers: {'Content-Type' => 'application/json'} + ) + (JSON.parse(wks.data.to_json))['items'] + end + + def worksheets(spreadsheet, index = 0) + if DateTime.now.utc > spreadsheet['expires_at'] + spreadsheet = refresh_token spreadsheet + end + + session = GoogleDrive.login_with_oauth(spreadsheet['access_token']) + session.spreadsheet_by_key(spreadsheet['spreadsheet_id']).worksheets[index] + end + + def refresh_token(spreadsheet) + client = Google::APIClient.new + client.authorization.client_id = ENV['GOOGLE_ID'] + client.authorization.client_secret = ENV['GOOGLE_KEY'] + client.authorization.grant_type = 'refresh_token' + client.authorization.refresh_token = spreadsheet['refresh_token'] + re = client.authorization.fetch_access_token! + + spreadsheet['access_token'] = re['access_token'] + spreadsheet['expires_at'] = (Time.now + re['expires_in'].second) + spreadsheet.save + + spreadsheet + end + end +end \ No newline at end of file diff --git a/lib/google_spreadsheets.rb b/lib/google_spreadsheets.rb deleted file mode 100644 index 880fb04..0000000 --- a/lib/google_spreadsheets.rb +++ /dev/null @@ -1,46 +0,0 @@ -module GoogleSpreadsheets - def get_spreadsheets(spreadsheet) - #binding.pry - if Time.now > spreadsheet['expires_at'] - spreadsheet = refresh_token spreadsheet - end - - client = Google::APIClient.new - client.authorization.access_token = spreadsheet.access_token - drive = client.discovered_api('drive', 'v2') - - wks = client.execute( - api_method: drive.files.list, - parameters: {}, - headers: {'Content-Type' => 'application/json'} - ) - (JSON.parse(wks.data.to_json))['items'] - end - - def get_worksheets(spreadsheet, i = 0) - if Time.now > spreadsheet['expires_at'] - spreadsheet = refresh_token spreadsheet - end - - session = GoogleDrive.login_with_oauth(spreadsheet['access_token']) - session.spreadsheet_by_key(spreadsheet['spreadsheet_id']).worksheets[i] - end - - def refresh_token(spreadsheet) - data = { - client_id: ENV['GOOGLE_ID'], - client_secret: ENV['GOOGLE_KEY'], - refresh_token: spreadsheet['refresh_token'], - grant_type: 'refresh_token' - } - re = ActiveSupport::JSON.decode(RestClient.post 'https://accounts.google.com/o/oauth2/token', data) - - #sheets = Token.where(spreadsheet_id: spreadsheet['spreadsheet_id'])[0] - spreadsheet['access_token'] = re['access_token'] - spreadsheet['expires_at'] = (Time.now + re['expires_in'].second).localtime - #binding.pry - spreadsheet.save - - spreadsheet - end -end \ No newline at end of file diff --git a/spec/controllers/spreadsheets_controller_spec.rb b/spec/controllers/spreadsheets_controller_spec.rb index 2df1e40..c0e6689 100644 --- a/spec/controllers/spreadsheets_controller_spec.rb +++ b/spec/controllers/spreadsheets_controller_spec.rb @@ -1,29 +1,131 @@ require 'rails_helper' require 'webmock/rspec' +require 'vcr' RSpec.describe SpreadsheetsController, :type => :controller do - google_auth_response = File.new('spec/controllers/google_auth_response.json') + + context 'GET User Permission' do + context 'User accepts' do + it 'redirects to new ' do + VCR.use_cassette 'controllers/api-permissions' do + data = { + name: 'google', + scope: 'userinfo.profile,userinfo.email,drive,https://spreadsheets.google.com/feeds', + prompt: 'consent', + access_type: 'offline', + redirect_uri: 'http://localhost:8080/auth/google/callback' + } + RestClient.post 'https://accounts.google.com/o/oauth2/auth', data + end + + end + end + end + context 'GET Index' do it 'it renders the index template' do get :index expect(response).to render_template(:index) end + let(:sheet) { FactoryGirl.create(:spreadsheet)} it 'should return all the spreadhseets' do - c = SpreadsheetsController.new - r = c.instance_eval{index} - expect(r.count).to eq(Spreadsheet.count) + sheet + get :index + expect(assigns(:spreadsheets)).equal?(Spreadsheet.all.to_a.count) end end context 'GET New' do - it 'opens authentication page on calling auth/google' do - stub_request(:get, 'http://localhost:8080/auth/google/').to_return(google_auth_response) - stub_request(:get, "https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=367225507767-119uvbhdadqbft2kn4759rodoiivksn9.apps.googleusercontent.com&prompt=consent&redirect_uri=http://localhost:8080/auth/google/callback&response_type=code&scope=https://www.googleapis.com/auth/userinfo.profile%20https://www.googleapis.com/auth/userinfo.email%20https://www.googleapis.com/auth/drive%20https://spreadsheets.google.com/feeds&state=df37c7da59cf8f7a4899cd5a67a612e9d18946664bc98d4f"). - with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate', 'Cookie'=>'_lightair_session=Uy9SNDQ1LzZFandLd1g4S2VVTEptR3ZRa0RBcnNFWGtZbG1VZmNKMzc5Z1F6cDFuaHBCa2lScHcxL1FBQ044RTJZMU9iUWF2UitaVjQxcGVzeUZwS0Q3NkdXdzg2SHB6S0IrcU1sR2ExelhRRVZuWFF6MFpraktBMTNCcTM4UVZ5a01ReitYSzNYT2M0dXR1NWViUjhvVGVxUnYwRUtLREtoQUVjMkJPMW1PZG14MUVUQlN0Q2hkRUh5blVLMDZRLS1OZ3JGQXFWQmJKMGNCWGszQWoyMkNRPT0=--8345e9f7215c9ef812febd3588c505cfaef628c1', 'User-Agent'=>'Ruby'}). - to_return(:status => 200, :body => "", :headers => {}) + it 'creates new spreadsheet when no access_token given' do + VCR.use_cassette 'controllers/api-new_tokens' do + request.env['omniauth.auth'] = { + 'credentials' => { + 'token' => 'ya29.QgC-5kYKwAzcdh8AAABnuwXicpaXRvO_YSlv4V9J556542KazsYWEia63TlRyA', + 'refresh_token' => '1/DlAqfSUji69F3YuVAHSoWxWE0grR8aYSkb2OocVCNBw', + 'expires_at' => Time.now, + 'expires' => true + } + } + + get :new + expect(response).to render_template(:new) + end + end + + let(:sheet) { FactoryGirl.create(:spreadsheet)} + it 'does not creates new spreadsheet when access_token is given' do + VCR.use_cassette 'controllers/api-response' do + get(:new, access_token: sheet.access_token) + expect(response).to render_template(:new) + end + end + end + + context 'Get Edit' do + let(:sheet) { FactoryGirl.create(:spreadsheet)} + it 'renders index page after executing' do + get :edit, title: 'namecollection', id: sheet['spreadsheet_id'], token: sheet['access_token'] + + expect(response).to render_template(:index) + end + + it 'adds spreadsheet\'s credentials' do + get :edit, title: 'namecollection', id: sheet['spreadsheet_id'], token: sheet['access_token'] + expect(assigns(:error)).to be(nil) + end + end + + context 'Post Update' do + let(:sheet) { FactoryGirl.create(:spreadsheet)} + it 'updates the spreadsheet' do + VCR.use_cassette 'controllers/api-update-with-data', record: :new_episodes do + post :update, id: sheet + expect(response).to redirect_to users_path + end + end + end + + context 'Post Destroy' do + let(:sheet) { FactoryGirl.create(:spreadsheet)} + it 'deletes spreadsheets from database' do + sheet + count1 = Spreadsheet.all.count + post :destroy, id: sheet + count2 = Spreadsheet.all.count + + expect(count1).to be(count2 + 1) + end + + it 'redirects to spreadsheets index page' do + post :destroy, id: sheet + expect(response).to redirect_to spreadsheets_path + end + end + + context 'Get Failure' do + it 'renders index page when user does not accepts permissions' do + get :failure, message: 'access_denied' + + expect(response).to render_template(:index) + end + + it 'to give a failure message when it fails' do + get :failure, message: 'access_denied' + expect(assigns(:msg)).not_to be nil + end + + it 'not to give a failure message when it does not fails' do + get :failure, message: 'access_granted' + expect(assigns(:msg)).to be nil + end + + let(:sheet) { FactoryGirl.create(:spreadsheet)} + it 'gets all the spreadsheets' do + sheet + get :failure, message: 'access_denied' - RestClient.get('http://localhost:8080/auth/google/') + expect(assigns(:spreadsheets).count).equal?(Spreadsheet.all.count) end end end diff --git a/spec/factories/spreadsheets.rb b/spec/factories/spreadsheets.rb index 22ce7c5..63c310f 100644 --- a/spec/factories/spreadsheets.rb +++ b/spec/factories/spreadsheets.rb @@ -1,6 +1,11 @@ # Read about factories at https://github.com/thoughtbot/factory_girl FactoryGirl.define do - factory :spreadsheet do + factory :spreadsheet do |s| + s.spreadsheet_id {'1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE'} + s.spreadsheet_title {'namecollection'} + s.access_token {'ya29.QgC-5kYKwAzcdh8AAABnuwXicpaXRvO_YSlv4V9J556542KazsYWEia63TlRyA'} + s.refresh_token {'1/DlAqfSUji69F3YuVAHSoWxWE0grR8aYSkb2OocVCNBw'} + s.expires_at {Time.now - 3600} end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 77dfef0..4720d64 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,3 +1,6 @@ +require 'database_cleaner' +require 'simplecov' +SimpleCov.start # This file was generated by the `rails generate rspec:install` command. Conventionally, all # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. # The generated `.rspec` file contains `--require spec_helper` which will cause this @@ -14,7 +17,21 @@ # users commonly want. # # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration + + RSpec.configure do |config| + + config.before(:suite) do + DatabaseCleaner.clean_with(:truncation) + end + + config.before(:each) do + DatabaseCleaner.start + end + + config.after(:each) do + DatabaseCleaner.clean + end # The settings below are suggested to provide a good initial experience # with RSpec, but feel free to customize to your heart's content. =begin diff --git a/spec/support/vcr_setup.rb b/spec/support/vcr_setup.rb new file mode 100644 index 0000000..7e18602 --- /dev/null +++ b/spec/support/vcr_setup.rb @@ -0,0 +1,7 @@ +# spec/support/vcr_setup.rb +VCR.configure do |c| + #the directory where your cassettes will be saved + c.cassette_library_dir = 'spec/vcr' + # your HTTP request service. You can also use fakeweb, webmock, and more + c.hook_into :webmock +end \ No newline at end of file diff --git a/spec/vcr/controllers/api-new_tokens.yml b/spec/vcr/controllers/api-new_tokens.yml new file mode 100644 index 0000000..24a8893 --- /dev/null +++ b/spec/vcr/controllers/api-new_tokens.yml @@ -0,0 +1,518 @@ +--- +http_interactions: +- request: + method: post + uri: https://accounts.google.com/o/oauth2/token + body: + encoding: ASCII-8BIT + string: grant_type=refresh_token&refresh_token=1%2FDlAqfSUji69F3YuVAHSoWxWE0grR8aYSkb2OocVCNBw&client_id=367225507767-119uvbhdadqbft2kn4759rodoiivksn9.apps.googleusercontent.com&client_secret=1yX7HzuzWi3yD1OqJ21ZgpSS + headers: + Cache-Control: + - no-store + Content-Type: + - application/x-www-form-urlencoded + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Cache-Control: + - no-cache, no-store, max-age=0, must-revalidate + Pragma: + - no-cache + Expires: + - Fri, 01 Jan 1990 00:00:00 GMT + Date: + - Mon, 14 Jul 2014 10:26:54 GMT + Content-Disposition: + - attachment; filename="json.txt"; filename*=UTF-8''json.txt + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-Xss-Protection: + - 1; mode=block + Server: + - GSE + Alternate-Protocol: + - 443:quic + Transfer-Encoding: + - chunked + body: + encoding: UTF-8 + string: |- + { + "access_token" : "ya29.QgBKOx6dCMp3zh8AAAB9kzvJu1nqcmQE2EzA7LzVh-FMvHcrjSFT-4G4MSfmpg", + "token_type" : "Bearer", + "expires_in" : 3600, + "id_token" : "eyJhbGciOiJSUzI1NiIsImtpZCI6IjBjODk2NjU5OWE3Zjc0ZTU3Yjc2MGRkZWE2MGUwZGMxMjRmMjE1YTMifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiaWQiOiIxMTY4MTc0NzkyNTg0MjY4ODk3MDkiLCJzdWIiOiIxMTY4MTc0NzkyNTg0MjY4ODk3MDkiLCJhenAiOiIzNjcyMjU1MDc3NjctMTE5dXZiaGRhZHFiZnQya240NzU5cm9kb2lpdmtzbjkuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJlbWFpbCI6InBhbmthamJhc25hbDE3QGdtYWlsLmNvbSIsImF0X2hhc2giOiJLdHpJZktjdHJlNk9VTkVHUW9DblFnIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImF1ZCI6IjM2NzIyNTUwNzc2Ny0xMTl1dmJoZGFkcWJmdDJrbjQ3NTlyb2RvaWl2a3NuOS5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsInRva2VuX2hhc2giOiJLdHpJZktjdHJlNk9VTkVHUW9DblFnIiwidmVyaWZpZWRfZW1haWwiOnRydWUsImNpZCI6IjM2NzIyNTUwNzc2Ny0xMTl1dmJoZGFkcWJmdDJrbjQ3NTlyb2RvaWl2a3NuOS5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImlhdCI6MTQwNTMzMzMxNCwiZXhwIjoxNDA1MzM3MjE0fQ.wFDAFiBWbKy-vOgJXspfzKiTOPw05tufou7PAs14WCmfL7ejx7qTteYn4u8519y3GBWKdiUhs9tcLDu6zhq3R94rh0ACVYEgyR5S2RR5VEfFzdVdmGBh2dlQyiYcv43M8E7LZToRtWDvjkjaATf-znUaxo4_sJo143uJvspItgU" + } + http_version: + recorded_at: Mon, 14 Jul 2014 10:26:54 GMT +- request: + method: get + uri: https://www.googleapis.com/discovery/v1/apis/drive/v2/rest + body: + encoding: UTF-8 + string: '' + headers: + User-Agent: + - |- + google-api-ruby-client/0.7.1 Linux/3.13.0-30-generic + (gzip) + Accept-Encoding: + - gzip + Content-Type: + - '' + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Expires: + - Mon, 14 Jul 2014 10:31:55 GMT + Date: + - Mon, 14 Jul 2014 10:26:55 GMT + Cache-Control: + - public, max-age=300, must-revalidate, no-transform + Etag: + - '"FrPV2U6xXFUq8eRv_PO3IoAURkc/IERJ5Hcz59m5dfn8v5XjYGA7sqU"' + Content-Type: + - application/json; charset=UTF-8 + Content-Encoding: + - gzip + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-Xss-Protection: + - 1; mode=block + Content-Length: + - '13967' + Server: + - GSE + Alternate-Protocol: + - 443:quic + body: + encoding: ASCII-8BIT + string: !binary |- + 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 + mfQC/vflxf8CzsreGV/IAQA= + http_version: + recorded_at: Mon, 14 Jul 2014 10:26:55 GMT +- request: + method: get + uri: https://www.googleapis.com/drive/v2/files + body: + encoding: UTF-8 + string: '' + headers: + User-Agent: + - |- + google-api-ruby-client/0.7.1 Linux/3.13.0-30-generic + (gzip) + Content-Type: + - application/json + Accept-Encoding: + - gzip + Authorization: + - Bearer ya29.QgBKOx6dCMp3zh8AAAB9kzvJu1nqcmQE2EzA7LzVh-FMvHcrjSFT-4G4MSfmpg + Cache-Control: + - no-store + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Expires: + - Mon, 14 Jul 2014 10:26:56 GMT + Date: + - Mon, 14 Jul 2014 10:26:56 GMT + Cache-Control: + - private, max-age=0, must-revalidate, no-transform + Etag: + - '"gROZn7NlhxVF8deqr1tB7t1xA6k/iJA_uW5OZnhfqIiChoSn5PQczwE"' + Content-Type: + - application/json; charset=UTF-8 + Content-Encoding: + - gzip + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-Xss-Protection: + - 1; mode=block + Server: + - GSE + Alternate-Protocol: + - 443:quic + Transfer-Encoding: + - chunked + body: + encoding: ASCII-8BIT + string: !binary |- + H4sIAAAAAAAAAO1ZaW/iSBP+nl+BeKX5tGC3b5CiWa4cJBDCkQR2V8jYbbvj + i7ibczX//e02NmFIhiMzkxlpEylE013V9XS56qkHz78nmayLAjNbzGTNCE3h + /yzkwWuESfYPugWJbrOtv7N2+2YQqE3Pmd+daSZ8igApqwTMS4rLoXppOLmX + qYFjPV2iihN2Arl1ayxntb+z8TkYetY1Clx2lkPIGBc5bjab5e0wtD2ojxHO + G6HPxQi4qcAxEDj2RAT6mLr9dZLJ/Et/X4PLDOkGipeBLdQfcjP+gRj3VXUx + CHNXotG5wGrLWRiVmaP3+/5Mf8TXl7Na4njYLRvd21mzWxIb3b7UWLrLhr26 + XOaN1+PegFT3CIwCncDtaGZo4CRcHAqPI6ib2IGQYM48KhQHTUQ+T/D4NMaL + TTdNkz+C5s8M7BDfi4OkD9QIg+14GHt5GxOdIGOVUxqffXi0ZDnk6zZNLPMb + AjDcwDJk+/lxYCdHE2fijwIdedvne46cXGeCYUQPIjAgcaRO05lXPEhuwv4N + ap7pF8J8NF1atU6zOr6wVbvSOdfuvGHXv1ek6754budK/lINxcfmmWxPveXi + KmyMS1BYWs2geVnoNOCT55VOsSDwKShEaDFTMIHuQyP0PGgQFAbJro982F2M + YwN9PPaQobNdbhqYCeIcXcb5jVsnnp4+gh5roriBaLkSPYog6xZL9zD8Y7Xq + INOEwdYiiXR60rZpBDGJkEFebEwRnMWLJJpAtvRlhcCgkKh1lX4w+AIPpByv + 5AS5C/giLxYlMa+IyiC9aWgiC22bqzkAunyhKIGiIOYLorBtXl404IEuno7J + XYx1p5NIYalgHUePXGge6CbxqdsURpg9RcZNkposjvWI1lVKbAm1vSC3lVUb + WpD+NRKeWzMdXzpvu+SiKz7cg0HPLbTuSmuLn89IXHIFbheMlc3xQHadiXA7 + DMlGjWW+sM9/EpKaj8MojrhR8ATOCWfg6cHEtTrlMzJPj0nJp5XbWRj5Ojll + 8ZK22GzXsWm9KwwW7xUYjDXCMQzmvmfFhjgXWhYyIAU08RnnbSDxvfyKT94T + +NzD8+wGhzA+bsHIRzhpp+ThbrXMs0Vy68Ome11wyWRmVKEAeCAv59XHm3u3 + UNOqeD3m077z00Z8ly5b3wdzz4GjcDUowlkAo3SRJMOBJWozcU+TkOjlBYG4 + h+GKORIWit2bdNg8E1G2pQeu/pgp6zjQvexGZ8XG+xgrjp12qonw2NMXLACz + +Prk53YuTYhDC45VJjR77IBVb69JZJ2Cy5XC4wugIALKzBrgBUlVgaytj4M+ + Heol06QjimGlDMSCjuKYQP3TZtvsoWRfMAebCQ02ShYosBmMHbhfGn+rHjcS + ckg+9qbjmGwcl4ykWpj600dxea2jZo1wvHixOIuoOI9wRQ86DuX5r/YwWzG/ + WqLsQyemXllJKpwqh5Mk8mHivjUakgD2oqv+dOl7Ax/41ajcBtr0pvKoKXV/ + oag+GQyqA0c7XtxXa4vGsgcaj/Tv7feK++ORvlncHxHqx4r7YwL/3uLePWtI + Tk/qXLb8YUXrXZQuHh7DPsaSh6PFFMkD5z6Ed3bYmgaw2Ylq9kTon7k12XBm + 5XMFP1Uq7VHJnNjTGsKVwnRwOWldXduvinvKw+S/IO5FnslhWS7KWr4A9oj7 + 2Jx+FwCFIhDyQAD7xf03XXaJ+5WTVpTUoqDkNV46TNx/7SY/32ZD3Cvg99b2 + xzTrf0TbH5GSn6nt3wzjV2v7NwN/X23fVdoV8ZYP6/eNnqVq16OGBR/BzXm5 + Lv1wbX9Ul31o+w9t/6Ht05FXFp7ngiG2HSNoe4ZX8PX7efpoDhfzjWVfvOka + UrPbk5rf+6b+EGgzOEquv09FTwxGnjvPTNjy1KSN6YV6qpkP/obAYFOBvjPG + N78KfJ8y54d0Kv0ARd4uVL3l0F/MW1Nn2Bm3H+uX9dl597o6DBZyRVNry7B5 + N9CetO5dpTrsu0/Dq5tyXbu1LkZn1hW+aCjnD43K6+/XL8JZhoQZG5IMk8u0 + FzMzRJxMlSVijyJfz9xfobzTrtr/Xp1X2Xt1Xs7L2l7p/Q3zDW0rir+1tt1d + 57+nmE1buxd5W52c46WcZuQ2enq7N+Luw9CY0IoxOEcJNcsEniyNIMAYPo0c + QzW0AnAN7Hsuz6mayvMOffRTV1FHKJK0EZQmbvhkyFANC4gDEi+LosDHP9xr + U+f1xZ15/+ycAkWRRVpk1FMBEv2HIiif4JrVPtnmKctN9j1EYLvqo45VmMKR + 5CrD62W3V1FvLf7hevjDX/DuKcfvV31hhGxE5/wZDRckiuMQTmPwanNaRmlf + p8RgyhUHGi6e+DEvWAKQRVUwCrxoSTyABQh4YAJTFgGUTXPjtA5axtHpU1YV + Jf3frQ9V+qFKf5kqfR6cu2TpSeafky8n/weFY0Xn/yIAAA== + http_version: + recorded_at: Mon, 14 Jul 2014 10:26:56 GMT +recorded_with: VCR 2.9.2 diff --git a/spec/vcr/controllers/api-permissions.yml b/spec/vcr/controllers/api-permissions.yml new file mode 100644 index 0000000..b25c89c --- /dev/null +++ b/spec/vcr/controllers/api-permissions.yml @@ -0,0 +1,122 @@ +--- +http_interactions: +- request: + method: post + uri: https://accounts.google.com/o/oauth2/auth + body: + encoding: US-ASCII + string: name=google&scope=userinfo.profile%2Cuserinfo.email%2Cdrive%2Chttps%3A%2F%2Fspreadsheets.google.com%2Ffeeds&prompt=consent&access_type=offline&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fauth%2Fgoogle%2Fcallback + headers: + Accept: + - "*/*; q=0.5, application/xml" + Accept-Encoding: + - gzip, deflate + Content-Length: + - '212' + Content-Type: + - application/x-www-form-urlencoded + User-Agent: + - Ruby + response: + status: + code: 400 + message: Bad Request + headers: + Cache-Control: + - no-cache, no-store, max-age=0, must-revalidate + Pragma: + - no-cache + Expires: + - Fri, 01 Jan 1990 00:00:00 GMT + Date: + - Mon, 14 Jul 2014 13:03:28 GMT + Content-Type: + - text/html; charset=utf-8 + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-Xss-Protection: + - 1; mode=block + Server: + - GSE + Alternate-Protocol: + - 443:quic + Transfer-Encoding: + - chunked + body: + encoding: ASCII-8BIT + string: !binary |- + PCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz1lbj48bWV0YSBjaGFyc2V0PXV0 + Zi04PjxtZXRhIG5hbWU9dmlld3BvcnQgY29udGVudD0iaW5pdGlhbC1zY2Fs + ZT0xLCBtaW5pbXVtLXNjYWxlPTEsIHdpZHRoPWRldmljZS13aWR0aCI+PHRp + dGxlPkVycm9yIDQwMCAoT0F1dGgyIEVycm9yKSEhMTwvdGl0bGU+PHN0eWxl + Pip7bWFyZ2luOjA7cGFkZGluZzowfWh0bWwsY29kZXtmb250OjE1cHgvMjJw + eCBhcmlhbCxzYW5zLXNlcmlmfWh0bWx7YmFja2dyb3VuZDojZmZmO2NvbG9y + OiMyMjI7cGFkZGluZzoxNXB4fWJvZHl7bWFyZ2luOjclIGF1dG8gMDttYXgt + d2lkdGg6MzkwcHg7bWluLWhlaWdodDoxODBweDtwYWRkaW5nOjMwcHggMCAx + NXB4fSogPiBib2R5e2JhY2tncm91bmQ6dXJsKC8vd3d3Lmdvb2dsZS5jb20v + aW1hZ2VzL2Vycm9ycy9yb2JvdC5wbmcpIDEwMCUgNXB4IG5vLXJlcGVhdDtw + YWRkaW5nLXJpZ2h0OjIwNXB4fXB7bWFyZ2luOjExcHggMCAyMnB4O292ZXJm + bG93OmhpZGRlbn1pbnN7Y29sb3I6Izc3Nzt0ZXh0LWRlY29yYXRpb246bm9u + ZX1hIGltZ3tib3JkZXI6MH1AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRo + Ojc3MnB4KXtib2R5e2JhY2tncm91bmQ6bm9uZTttYXJnaW4tdG9wOjA7bWF4 + LXdpZHRoOm5vbmU7cGFkZGluZy1yaWdodDowfX0jbG9nb3tiYWNrZ3JvdW5k + OnVybCgvL3d3dy5nb29nbGUuY29tL2ltYWdlcy9lcnJvcnMvbG9nb19zbV8y + LnBuZykgbm8tcmVwZWF0fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi1y + ZXNvbHV0aW9uOjE5MmRwaSl7I2xvZ297YmFja2dyb3VuZDp1cmwoLy93d3cu + Z29vZ2xlLmNvbS9pbWFnZXMvZXJyb3JzL2xvZ29fc21fMl9oci5wbmcpIG5v + LXJlcGVhdCAwJSAwJS8xMDAlIDEwMCU7LW1vei1ib3JkZXItaW1hZ2U6dXJs + KC8vd3d3Lmdvb2dsZS5jb20vaW1hZ2VzL2Vycm9ycy9sb2dvX3NtXzJfaHIu + cG5nKSAwfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kICgtd2Via2l0LW1pbi1k + ZXZpY2UtcGl4ZWwtcmF0aW86Mil7I2xvZ297YmFja2dyb3VuZDp1cmwoLy93 + d3cuZ29vZ2xlLmNvbS9pbWFnZXMvZXJyb3JzL2xvZ29fc21fMl9oci5wbmcp + IG5vLXJlcGVhdDstd2Via2l0LWJhY2tncm91bmQtc2l6ZToxMDAlIDEwMCV9 + fSNsb2dve2Rpc3BsYXk6aW5saW5lLWJsb2NrO2hlaWdodDo1NXB4O3dpZHRo + OjE1MHB4fTwvc3R5bGU+PGRpdiBpZD0iYWYtZXJyb3ItY29udGFpbmVyIj48 + YSBocmVmPS8vd3d3Lmdvb2dsZS5jb20vPjxzcGFuIGlkPWxvZ28gYXJpYS1s + YWJlbD1Hb29nbGU+PC9zcGFuPjwvYT48cD48Yj40MDAuPC9iPiA8aW5zPlRo + YXTigJlzIGFuIGVycm9yLjwvaW5zPjxwPjxzY3JpcHQgdHlwZT0idGV4dC9q + YXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vc3NsLmdzdGF0aWMuY29tL2FjY291 + bnRzL28vMTA1OTY0MTI3MS1jb21tb25fbGliLmpzIj48L3NjcmlwdD4KPHN0 + eWxlPgogICAgI3JlcXVlc3RfaW5mb19oZWFkZXIgewogICAgICBjdXJzb3I6 + IGRlZmF1bHQ7CiAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIHBhZGRpbmct + bGVmdDogMTRweDsKICAgICAgcGFkZGluZy10b3A6IDEwcHg7CiAgICB9Cgog + ICAgI3JlcXVlc3RfaW5mb19pdGVtcyB7CiAgICAgIGxpbmUtaGVpZ2h0OiAx + OHB4OwogICAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICAgIG1hcmdp + bi10b3A6IDhweDsKICAgICAgcGFkZGluZy1sZWZ0OiAxNHB4OwogICAgfQoK + ICAgIC5wYXJhbV9lbnRyeSB7CiAgICAgIG1hcmdpbi10b3A6IDJweDsKICAg + IH0KCiAgICAuZ29vZy16aXBweS1leHBhbmRlZCwKICAgIC5nb29nLXppcHB5 + LWNvbGxhcHNlZCB7CiAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICAgIHBh + ZGRpbmc6IDJweCAwIDFweCAxNXB4OwogICAgICBwb3NpdGlvbjogcmVsYXRp + dmU7CiAgICB9CgogICAgLmdvb2ctemlwcHktZXhwYW5kZWQ6YmVmb3JlIHsK + ICAgICAgY29udGVudDogdXJsKGh0dHBzOi8vc3NsLmdzdGF0aWMuY29tL3Vp + L3YxL3ppcHB5L2Fycm93X2Rvd24ucG5nKTsKICAgICAgbGVmdDogMXB4Owog + ICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIHRvcDogN3B4OwogICAg + fQoKICAgIC5nb29nLXppcHB5LWNvbGxhcHNlZDpiZWZvcmUgewogICAgICBj + b250ZW50OiB1cmwoaHR0cHM6Ly9zc2wuZ3N0YXRpYy5jb20vdWkvdjEvemlw + cHkvYXJyb3dfcmlnaHQucG5nKTsKICAgICAgbGVmdDogM3B4OwogICAgICBw + b3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIHRvcDogNnB4OwogICAgfQogIDwv + c3R5bGU+PHAgaWQ9ImVycm9yQ29kZSI+PGI+RXJyb3I6IGludmFsaWRfcmVx + dWVzdDwvYj48L3A+PHAgaWQ9ImVycm9yRGVzY3JpcHRpb24iPlJlcXVpcmVk + IHBhcmFtZXRlciBpcyBtaXNzaW5nOiByZXNwb25zZV90eXBlPC9wPjxwIGlk + PSJlcnJvclVyaSI+PGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly9j + b2RlLmdvb2dsZS5jb20vYXBpcy9hY2NvdW50cy9kb2NzL09BdXRoMi5odG1s + Ij5MZWFybiBtb3JlPC9hPjwvcD48ZGl2IGlkPSJyZXF1ZXN0X2luZm9faGVh + ZGVyIj5SZXF1ZXN0IERldGFpbHM8dWwgaWQ9InJlcXVlc3RfaW5mb19pdGVt + cyI+PGxpIGNsYXNzPSJwYXJhbV9lbnRyeSIgaWQ9InBhcmFtX2VudHJ5XzAi + PnNjb3BlPXVzZXJpbmZvLnByb2ZpbGUsdXNlcmluZm8uZW1haWwsZHJpdmUs + aHR0cHM6Ly9zcHJlYWRzaGVldHMuZ29vZ2xlLmNvbS9mZWVkczwvbGk+PGxp + IGNsYXNzPSJwYXJhbV9lbnRyeSIgaWQ9InBhcmFtX2VudHJ5XzEiPnJlZGly + ZWN0X3VyaT1odHRwOi8vbG9jYWxob3N0OjgwODAvYXV0aC9nb29nbGUvY2Fs + bGJhY2s8L2xpPjxsaSBjbGFzcz0icGFyYW1fZW50cnkiIGlkPSJwYXJhbV9l + bnRyeV8yIj5hY2Nlc3NfdHlwZT1vZmZsaW5lPC9saT48bGkgY2xhc3M9InBh + cmFtX2VudHJ5IiBpZD0icGFyYW1fZW50cnlfMyI+bmFtZT1nb29nbGU8L2xp + PjxsaSBjbGFzcz0icGFyYW1fZW50cnkiIGlkPSJwYXJhbV9lbnRyeV80Ij5w + cm9tcHQ9Y29uc2VudDwvbGk+PC91bD48L2Rpdj48c2NyaXB0IHR5cGU9InRl + eHQvamF2YXNjcmlwdCI+bHNvLmRvWmlwcHkoInJlcXVlc3RfaW5mb19oZWFk + ZXIiLCAicmVxdWVzdF9pbmZvX2l0ZW1zIik7PC9zY3JpcHQ+PHA+IDxpbnM+ + VGhhdOKAmXMgYWxsIHdlIGtub3cuPC9pbnM+PC9kaXY+ + http_version: + recorded_at: Mon, 14 Jul 2014 13:03:29 GMT +recorded_with: VCR 2.9.2 diff --git a/spec/vcr/controllers/api-response.yml b/spec/vcr/controllers/api-response.yml new file mode 100644 index 0000000..92ea4d9 --- /dev/null +++ b/spec/vcr/controllers/api-response.yml @@ -0,0 +1,518 @@ +--- +http_interactions: +- request: + method: post + uri: https://accounts.google.com/o/oauth2/token + body: + encoding: ASCII-8BIT + string: grant_type=refresh_token&refresh_token=1%2FDlAqfSUji69F3YuVAHSoWxWE0grR8aYSkb2OocVCNBw&client_id=367225507767-119uvbhdadqbft2kn4759rodoiivksn9.apps.googleusercontent.com&client_secret=1yX7HzuzWi3yD1OqJ21ZgpSS + headers: + Cache-Control: + - no-store + Content-Type: + - application/x-www-form-urlencoded + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Cache-Control: + - no-cache, no-store, max-age=0, must-revalidate + Pragma: + - no-cache + Expires: + - Fri, 01 Jan 1990 00:00:00 GMT + Date: + - Mon, 14 Jul 2014 09:43:47 GMT + Content-Disposition: + - attachment; filename="json.txt"; filename*=UTF-8''json.txt + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-Xss-Protection: + - 1; mode=block + Server: + - GSE + Alternate-Protocol: + - 443:quic + Transfer-Encoding: + - chunked + body: + encoding: UTF-8 + string: |- + { + "access_token" : "ya29.QgCA1zb2xkPTVh8AAADuNe6pjiKAKmnEUw6u56ufzLLFQBh94PiC-LYd3bvUxA", + "token_type" : "Bearer", + "expires_in" : 3600, + "id_token" : "eyJhbGciOiJSUzI1NiIsImtpZCI6IjBjODk2NjU5OWE3Zjc0ZTU3Yjc2MGRkZWE2MGUwZGMxMjRmMjE1YTMifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiaWQiOiIxMTY4MTc0NzkyNTg0MjY4ODk3MDkiLCJzdWIiOiIxMTY4MTc0NzkyNTg0MjY4ODk3MDkiLCJhenAiOiIzNjcyMjU1MDc3NjctMTE5dXZiaGRhZHFiZnQya240NzU5cm9kb2lpdmtzbjkuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJlbWFpbCI6InBhbmthamJhc25hbDE3QGdtYWlsLmNvbSIsImF0X2hhc2giOiI2cnAxRzVvRnZMbE1id1E1WHR2QmdBIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImF1ZCI6IjM2NzIyNTUwNzc2Ny0xMTl1dmJoZGFkcWJmdDJrbjQ3NTlyb2RvaWl2a3NuOS5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsInRva2VuX2hhc2giOiI2cnAxRzVvRnZMbE1id1E1WHR2QmdBIiwidmVyaWZpZWRfZW1haWwiOnRydWUsImNpZCI6IjM2NzIyNTUwNzc2Ny0xMTl1dmJoZGFkcWJmdDJrbjQ3NTlyb2RvaWl2a3NuOS5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImlhdCI6MTQwNTMzMDcyNywiZXhwIjoxNDA1MzM0NjI3fQ.sBQTuWmb6AL_6FkQQPTrB-GKxH7Aa8u6aQHWG1wsDVsrNRUeeNv3ZwwMNqbeUxG28fI7a1o3w5cPwFSlc1Y_N90yN7x_NZLPAFlSOdShXm37fNcK4bP9xzhPVWYPMx2Gukb9Ni2uYPa7DmSqFHj4qDO6kbHhNtCqhecDWKb6deI" + } + http_version: + recorded_at: Mon, 14 Jul 2014 09:43:47 GMT +- request: + method: get + uri: https://www.googleapis.com/discovery/v1/apis/drive/v2/rest + body: + encoding: UTF-8 + string: '' + headers: + User-Agent: + - |- + google-api-ruby-client/0.7.1 Linux/3.13.0-30-generic + (gzip) + Accept-Encoding: + - gzip + Content-Type: + - '' + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Expires: + - Mon, 14 Jul 2014 09:48:48 GMT + Date: + - Mon, 14 Jul 2014 09:43:48 GMT + Cache-Control: + - public, max-age=300, must-revalidate, no-transform + Etag: + - '"FrPV2U6xXFUq8eRv_PO3IoAURkc/IERJ5Hcz59m5dfn8v5XjYGA7sqU"' + Content-Type: + - application/json; charset=UTF-8 + Content-Encoding: + - gzip + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-Xss-Protection: + - 1; mode=block + Content-Length: + - '13967' + Server: + - GSE + Alternate-Protocol: + - 443:quic + body: + encoding: ASCII-8BIT + string: !binary |- + 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 + mfQC/vflxf8CzsreGV/IAQA= + http_version: + recorded_at: Mon, 14 Jul 2014 09:43:48 GMT +- request: + method: get + uri: https://www.googleapis.com/drive/v2/files + body: + encoding: UTF-8 + string: '' + headers: + User-Agent: + - |- + google-api-ruby-client/0.7.1 Linux/3.13.0-30-generic + (gzip) + Content-Type: + - application/json + Accept-Encoding: + - gzip + Authorization: + - Bearer ya29.QgCA1zb2xkPTVh8AAADuNe6pjiKAKmnEUw6u56ufzLLFQBh94PiC-LYd3bvUxA + Cache-Control: + - no-store + Accept: + - "*/*" + response: + status: + code: 200 + message: OK + headers: + Expires: + - Mon, 14 Jul 2014 09:43:49 GMT + Date: + - Mon, 14 Jul 2014 09:43:49 GMT + Cache-Control: + - private, max-age=0, must-revalidate, no-transform + Etag: + - '"gROZn7NlhxVF8deqr1tB7t1xA6k/7XaNv4ODRlztP3eUuU7Lgdf4AcI"' + Content-Type: + - application/json; charset=UTF-8 + Content-Encoding: + - gzip + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-Xss-Protection: + - 1; mode=block + Server: + - GSE + Alternate-Protocol: + - 443:quic + Transfer-Encoding: + - chunked + body: + encoding: ASCII-8BIT + string: !binary |- + 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 + http_version: + recorded_at: Mon, 14 Jul 2014 09:43:49 GMT +recorded_with: VCR 2.9.2 diff --git a/spec/vcr/controllers/api-update-with-data.yml b/spec/vcr/controllers/api-update-with-data.yml new file mode 100644 index 0000000..9861930 --- /dev/null +++ b/spec/vcr/controllers/api-update-with-data.yml @@ -0,0 +1,340 @@ +--- +http_interactions: +- request: + method: post + uri: https://accounts.google.com/o/oauth2/token + body: + encoding: ASCII-8BIT + string: grant_type=refresh_token&refresh_token=1%2FDlAqfSUji69F3YuVAHSoWxWE0grR8aYSkb2OocVCNBw&client_id=367225507767-119uvbhdadqbft2kn4759rodoiivksn9.apps.googleusercontent.com&client_secret=1yX7HzuzWi3yD1OqJ21ZgpSS + headers: + Cache-Control: + - no-store + Content-Type: + - application/x-www-form-urlencoded + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Cache-Control: + - no-cache, no-store, max-age=0, must-revalidate + Pragma: + - no-cache + Expires: + - Fri, 01 Jan 1990 00:00:00 GMT + Date: + - Mon, 14 Jul 2014 12:33:18 GMT + Content-Disposition: + - attachment; filename="json.txt"; filename*=UTF-8''json.txt + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-Xss-Protection: + - 1; mode=block + Server: + - GSE + Alternate-Protocol: + - 443:quic + Transfer-Encoding: + - chunked + body: + encoding: UTF-8 + string: |- + { + "access_token" : "ya29.QgAFK5QrFhLCIB8AAABfqjxL7sQjl5zVnL-YlD_fcUxIutL1k_KUFTr1NDwqCA", + "token_type" : "Bearer", + "expires_in" : 3600, + "id_token" : "eyJhbGciOiJSUzI1NiIsImtpZCI6IjBjODk2NjU5OWE3Zjc0ZTU3Yjc2MGRkZWE2MGUwZGMxMjRmMjE1YTMifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiaWQiOiIxMTY4MTc0NzkyNTg0MjY4ODk3MDkiLCJzdWIiOiIxMTY4MTc0NzkyNTg0MjY4ODk3MDkiLCJhenAiOiIzNjcyMjU1MDc3NjctMTE5dXZiaGRhZHFiZnQya240NzU5cm9kb2lpdmtzbjkuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJlbWFpbCI6InBhbmthamJhc25hbDE3QGdtYWlsLmNvbSIsImF0X2hhc2giOiItSVVuNzJyVWU5N252a0txcHdJQ0VBIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImF1ZCI6IjM2NzIyNTUwNzc2Ny0xMTl1dmJoZGFkcWJmdDJrbjQ3NTlyb2RvaWl2a3NuOS5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsInRva2VuX2hhc2giOiItSVVuNzJyVWU5N252a0txcHdJQ0VBIiwidmVyaWZpZWRfZW1haWwiOnRydWUsImNpZCI6IjM2NzIyNTUwNzc2Ny0xMTl1dmJoZGFkcWJmdDJrbjQ3NTlyb2RvaWl2a3NuOS5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImlhdCI6MTQwNTM0MDg5OCwiZXhwIjoxNDA1MzQ0Nzk4fQ.VaoYUEGoMU5Bteicpf1gXg9V6HJBa0RanBwlCFs2n4iL04eGUmP3MPHsFNF5asSKAo5HaWV3X962RE5eYdGwUon2wjJ7k_E3KkA_py9zXBnOIZ5pDAFlyDAVi4SihsxZ5h6DrcmucrDqE7HD5ry4xc7oFvuBqJJpCZG339um_RY" + } + http_version: + recorded_at: Mon, 14 Jul 2014 12:33:19 GMT +- request: + method: get + uri: https://spreadsheets.google.com/feeds/worksheets/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/private/full + body: + encoding: US-ASCII + string: '' + headers: + Authorization: + - Bearer ya29.QgAFK5QrFhLCIB8AAABfqjxL7sQjl5zVnL-YlD_fcUxIutL1k_KUFTr1NDwqCA + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/atom+xml; charset=UTF-8 + X-Robots-Tag: + - noarchive + Expires: + - Mon, 14 Jul 2014 12:33:19 GMT + Date: + - Mon, 14 Jul 2014 12:33:19 GMT + Cache-Control: + - private, max-age=0, must-revalidate, no-transform + Vary: + - Accept, X-GData-Authorization, GData-Version + Gdata-Version: + - '1.0' + Last-Modified: + - Fri, 11 Jul 2014 09:41:23 GMT + Transfer-Encoding: + - chunked + Set-Cookie: + - NID=67=nygKrEvvbhyRV0iJnTSPRO8-eAzvBWE9G1bs1ya8QkKORQPc0SQq1oJE1evD5W12fVZqLjNHWwNQAj7R-NYRDO-I2NoSiAvO8Ei0L4o9TDE3VhC0XAbniGLJCjgYLwEK;Domain=.google.com;Path=/;Expires=Tue, + 13-Jan-2015 12:33:19 GMT;HttpOnly + P3p: + - CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 + for more info." + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-Xss-Protection: + - 1; mode=block + Server: + - GSE + Alternate-Protocol: + - 443:quic + body: + encoding: UTF-8 + string: "https://spreadsheets.google.com/feeds/worksheets/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/private/full2014-07-11T09:41:23.890Znamecollectionpankajbasnal17pankajbasnal17@gmail.com11https://spreadsheets.google.com/feeds/worksheets/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/private/full/od62014-07-11T09:41:23.890ZSheet1Sheet1261001" + http_version: + recorded_at: Mon, 14 Jul 2014 12:33:19 GMT +- request: + method: get + uri: https://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full + body: + encoding: US-ASCII + string: '' + headers: + Authorization: + - Bearer ya29.QgAFK5QrFhLCIB8AAABfqjxL7sQjl5zVnL-YlD_fcUxIutL1k_KUFTr1NDwqCA + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/atom+xml; charset=UTF-8 + X-Robots-Tag: + - noarchive + Expires: + - Mon, 14 Jul 2014 12:33:20 GMT + Date: + - Mon, 14 Jul 2014 12:33:20 GMT + Cache-Control: + - private, max-age=0, must-revalidate, no-transform + Vary: + - Accept, X-GData-Authorization, GData-Version + Gdata-Version: + - '1.0' + Last-Modified: + - Fri, 11 Jul 2014 09:41:23 GMT + Transfer-Encoding: + - chunked + Set-Cookie: + - NID=67=E2DmmdFxqIqSu67rlO7nnmaF0JvOajx3ElDEj5wig1wR0X5PCbOVn4Ss1NMooVx6-YUoYhNAB__2LDyv1VUaPxZ-pboj85EFh5QY0QVbBayqc-xlV8iurVXJX1HSsLNa;Domain=.google.com;Path=/;Expires=Tue, + 13-Jan-2015 12:33:20 GMT;HttpOnly + P3p: + - CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 + for more info." + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-Xss-Protection: + - 1; mode=block + Server: + - GSE + Alternate-Protocol: + - 443:quic + body: + encoding: UTF-8 + string: "https://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full2014-07-11T09:41:23.890ZSheet1pankajbasnal17pankajbasnal17@gmail.com271100126https://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R2C12014-07-11T09:41:23.890ZA2pankajpankajhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R3C12014-07-11T09:41:23.890ZA3basnalbasnalhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R4C12014-07-11T09:41:23.890ZA4kanhaiyakanhaiyahttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R5C12014-07-11T09:41:23.890ZA5varshavarshahttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R6C12014-07-11T09:41:23.890ZA6joshjoshhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R7C12014-07-11T09:41:23.890ZA7hariharihttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R8C12014-07-11T09:41:23.890ZA8mudgalmudgalhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R9C12014-07-11T09:41:23.890ZA9fionafionahttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R10C12014-07-11T09:41:23.890ZA10rishirishihttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R11C12014-07-11T09:41:23.890ZA11anilanilhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R12C12014-07-11T09:41:23.890ZA12jirenjirenhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R13C12014-07-11T09:41:23.890ZA13manojmanojhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R14C12014-07-11T09:41:23.890ZA14avinashavinashhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R15C12014-07-11T09:41:23.890ZA15gautamgautamhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R16C12014-07-11T09:41:23.890ZA16a new onea new onehttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R17C12014-07-11T09:41:23.890ZA17oldoldhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R18C12014-07-11T09:41:23.890ZA18pankaj@gmail.compankaj@gmail.comhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R19C12014-07-11T09:41:23.890ZA19me@i.comme@i.comhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R20C12014-07-11T09:41:23.890ZA20he@you.comhe@you.comhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R21C12014-07-11T09:41:23.890ZA21heroku@josh.comheroku@josh.comhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R22C12014-07-11T09:41:23.890ZA22facebookfacebookhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R23C12014-07-11T09:41:23.890ZA23orkutorkuthttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R24C12014-07-11T09:41:23.890ZA24googlegooglehttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R25C12014-07-11T09:41:23.890ZA25josh softwarejosh softwarehttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R26C12014-07-11T09:41:23.890ZA26adding a new name adding a new name https://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R27C12014-07-11T09:41:23.890ZA27just chilljust chillhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R28C12014-07-11T09:41:23.890ZA28airnowairnow" + http_version: + recorded_at: Mon, 14 Jul 2014 12:33:21 GMT +recorded_with: VCR 2.9.2 diff --git a/spec/vcr/controllers/api-update.yml b/spec/vcr/controllers/api-update.yml new file mode 100644 index 0000000..83204aa --- /dev/null +++ b/spec/vcr/controllers/api-update.yml @@ -0,0 +1,394 @@ +--- +http_interactions: +- request: + method: post + uri: https://accounts.google.com/o/oauth2/token + body: + encoding: ASCII-8BIT + string: grant_type=refresh_token&refresh_token=1%2FDlAqfSUji69F3YuVAHSoWxWE0grR8aYSkb2OocVCNBw&client_id=367225507767-119uvbhdadqbft2kn4759rodoiivksn9.apps.googleusercontent.com&client_secret=1yX7HzuzWi3yD1OqJ21ZgpSS + headers: + Cache-Control: + - no-store + Content-Type: + - application/x-www-form-urlencoded + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=utf-8 + Cache-Control: + - no-cache, no-store, max-age=0, must-revalidate + Pragma: + - no-cache + Expires: + - Fri, 01 Jan 1990 00:00:00 GMT + Date: + - Mon, 14 Jul 2014 12:24:07 GMT + Content-Disposition: + - attachment; filename="json.txt"; filename*=UTF-8''json.txt + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-Xss-Protection: + - 1; mode=block + Server: + - GSE + Alternate-Protocol: + - 443:quic + Transfer-Encoding: + - chunked + body: + encoding: UTF-8 + string: |- + { + "access_token" : "ya29.QgCfzla7VI5YwR8AAAA1bZYaulSC87eJzDLPPnV9JZImeTQk4uC8BPmC46O98A", + "token_type" : "Bearer", + "expires_in" : 3600, + "id_token" : "eyJhbGciOiJSUzI1NiIsImtpZCI6IjBjODk2NjU5OWE3Zjc0ZTU3Yjc2MGRkZWE2MGUwZGMxMjRmMjE1YTMifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiaWQiOiIxMTY4MTc0NzkyNTg0MjY4ODk3MDkiLCJzdWIiOiIxMTY4MTc0NzkyNTg0MjY4ODk3MDkiLCJhenAiOiIzNjcyMjU1MDc3NjctMTE5dXZiaGRhZHFiZnQya240NzU5cm9kb2lpdmtzbjkuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJlbWFpbCI6InBhbmthamJhc25hbDE3QGdtYWlsLmNvbSIsImF0X2hhc2giOiJrS0doQ0tUVUJ2N2VoY2NaSmhoR1BRIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImF1ZCI6IjM2NzIyNTUwNzc2Ny0xMTl1dmJoZGFkcWJmdDJrbjQ3NTlyb2RvaWl2a3NuOS5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsInRva2VuX2hhc2giOiJrS0doQ0tUVUJ2N2VoY2NaSmhoR1BRIiwidmVyaWZpZWRfZW1haWwiOnRydWUsImNpZCI6IjM2NzIyNTUwNzc2Ny0xMTl1dmJoZGFkcWJmdDJrbjQ3NTlyb2RvaWl2a3NuOS5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImlhdCI6MTQwNTM0MDM0NywiZXhwIjoxNDA1MzQ0MjQ3fQ.WD1p7mQgg0EacCdJuKqJRT1OMrBRTqkGoJaDHwKj45PfvF11KfQAKO_S99VDdMeZsNFwp2FYVGo5Ib28Ztaimo_5-fPzidRpVBEJDNw4OJ2-6f4a1tQIsZe8ATO4mHiyhSB0fbhzILS4GHpzvgKKQ5e-CGT4tQN3-bv9piKDNb0" + } + http_version: + recorded_at: Mon, 14 Jul 2014 12:24:07 GMT +- request: + method: get + uri: https://spreadsheets.google.com/feeds/worksheets/53c39d036261731def000000/private/full + body: + encoding: US-ASCII + string: '' + headers: + Authorization: + - Bearer ya29.QgCfzla7VI5YwR8AAAA1bZYaulSC87eJzDLPPnV9JZImeTQk4uC8BPmC46O98A + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 400 + message: Bad Request + headers: + Content-Type: + - text/html; charset=UTF-8 + Set-Cookie: + - NID=67=m3-pRM2JBYO-OQJjfHgqb6fjjDI85uzWqpT1_UOoHH6yx2T4qyzCHcgc0qyqpPxSa3dSQHLzuZCEyuV8dEq9Ctgc6JAuQccxdJKB-rIuUVXJjxRbNcPo5Pif2si3RL1E;Domain=.google.com;Path=/;Expires=Tue, + 13-Jan-2015 12:24:08 GMT;HttpOnly + P3p: + - CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 + for more info." + X-Chromium-Appcache-Fallback-Override: + - disallow-fallback + Date: + - Mon, 14 Jul 2014 12:24:08 GMT + Expires: + - Mon, 14 Jul 2014 12:24:08 GMT + Cache-Control: + - private, max-age=0 + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-Xss-Protection: + - 1; mode=block + Server: + - GSE + Alternate-Protocol: + - 443:quic + Transfer-Encoding: + - chunked + body: + encoding: UTF-8 + string: The spreadsheet at this URL could not be found. Make sure that you have + the right URL and that the owner of the spreadsheet hasn't deleted it. + http_version: + recorded_at: Mon, 14 Jul 2014 12:24:08 GMT +- request: + method: get + uri: https://spreadsheets.google.com/feeds/worksheets/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/private/full + body: + encoding: US-ASCII + string: '' + headers: + Authorization: + - Bearer ya29.QgCfzla7VI5YwR8AAAA1bZYaulSC87eJzDLPPnV9JZImeTQk4uC8BPmC46O98A + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/atom+xml; charset=UTF-8 + X-Robots-Tag: + - noarchive + Expires: + - Mon, 14 Jul 2014 12:26:23 GMT + Date: + - Mon, 14 Jul 2014 12:26:23 GMT + Cache-Control: + - private, max-age=0, must-revalidate, no-transform + Vary: + - Accept, X-GData-Authorization, GData-Version + Gdata-Version: + - '1.0' + Last-Modified: + - Fri, 11 Jul 2014 09:41:23 GMT + Transfer-Encoding: + - chunked + Set-Cookie: + - NID=67=BLaHF-nsO0p38-JXk-yuu_jdMw85AvyOVXj8Qqx78AagoXb9nYnraHyxjTRV-jP5NjElSKtTzVgZlVMqmdR-s0vHqyXD5EFjnEZrGiw5CMQhtRwJ9FHq2dad0-LtVWAB;Domain=.google.com;Path=/;Expires=Tue, + 13-Jan-2015 12:26:23 GMT;HttpOnly + P3p: + - CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 + for more info." + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-Xss-Protection: + - 1; mode=block + Server: + - GSE + Alternate-Protocol: + - 443:quic + body: + encoding: UTF-8 + string: "https://spreadsheets.google.com/feeds/worksheets/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/private/full2014-07-11T09:41:23.890Znamecollectionpankajbasnal17pankajbasnal17@gmail.com11https://spreadsheets.google.com/feeds/worksheets/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/private/full/od62014-07-11T09:41:23.890ZSheet1Sheet1261001" + http_version: + recorded_at: Mon, 14 Jul 2014 12:26:23 GMT +- request: + method: get + uri: https://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full + body: + encoding: US-ASCII + string: '' + headers: + Authorization: + - Bearer ya29.QgCfzla7VI5YwR8AAAA1bZYaulSC87eJzDLPPnV9JZImeTQk4uC8BPmC46O98A + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/atom+xml; charset=UTF-8 + X-Robots-Tag: + - noarchive + Expires: + - Mon, 14 Jul 2014 12:26:23 GMT + Date: + - Mon, 14 Jul 2014 12:26:23 GMT + Cache-Control: + - private, max-age=0, must-revalidate, no-transform + Vary: + - Accept, X-GData-Authorization, GData-Version + Gdata-Version: + - '1.0' + Last-Modified: + - Fri, 11 Jul 2014 09:41:23 GMT + Transfer-Encoding: + - chunked + Set-Cookie: + - NID=67=MpS_-ANxVGpUuQXWLyBe2bryI8PlNn5qfLx6dbyscmyEa0XjMimK6ge2QHYCSLStDpa7hWg6aeF3qYIqmA1IuRiXThQV6Ihq3gAvJE0X5oPxqIMo3Eb4mlgRrGAF_tg-;Domain=.google.com;Path=/;Expires=Tue, + 13-Jan-2015 12:26:23 GMT;HttpOnly + P3p: + - CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 + for more info." + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-Xss-Protection: + - 1; mode=block + Server: + - GSE + Alternate-Protocol: + - 443:quic + body: + encoding: UTF-8 + string: "https://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full2014-07-11T09:41:23.890ZSheet1pankajbasnal17pankajbasnal17@gmail.com271100126https://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R2C12014-07-11T09:41:23.890ZA2pankajpankajhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R3C12014-07-11T09:41:23.890ZA3basnalbasnalhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R4C12014-07-11T09:41:23.890ZA4kanhaiyakanhaiyahttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R5C12014-07-11T09:41:23.890ZA5varshavarshahttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R6C12014-07-11T09:41:23.890ZA6joshjoshhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R7C12014-07-11T09:41:23.890ZA7hariharihttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R8C12014-07-11T09:41:23.890ZA8mudgalmudgalhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R9C12014-07-11T09:41:23.890ZA9fionafionahttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R10C12014-07-11T09:41:23.890ZA10rishirishihttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R11C12014-07-11T09:41:23.890ZA11anilanilhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R12C12014-07-11T09:41:23.890ZA12jirenjirenhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R13C12014-07-11T09:41:23.890ZA13manojmanojhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R14C12014-07-11T09:41:23.890ZA14avinashavinashhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R15C12014-07-11T09:41:23.890ZA15gautamgautamhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R16C12014-07-11T09:41:23.890ZA16a new onea new onehttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R17C12014-07-11T09:41:23.890ZA17oldoldhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R18C12014-07-11T09:41:23.890ZA18pankaj@gmail.compankaj@gmail.comhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R19C12014-07-11T09:41:23.890ZA19me@i.comme@i.comhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R20C12014-07-11T09:41:23.890ZA20he@you.comhe@you.comhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R21C12014-07-11T09:41:23.890ZA21heroku@josh.comheroku@josh.comhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R22C12014-07-11T09:41:23.890ZA22facebookfacebookhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R23C12014-07-11T09:41:23.890ZA23orkutorkuthttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R24C12014-07-11T09:41:23.890ZA24googlegooglehttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R25C12014-07-11T09:41:23.890ZA25josh softwarejosh softwarehttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R26C12014-07-11T09:41:23.890ZA26adding a new name adding a new name https://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R27C12014-07-11T09:41:23.890ZA27just chilljust chillhttps://spreadsheets.google.com/feeds/cells/1g2JX-w0XtcWD7yZo-K3cSHs7PhycCwhaYYmwajsLIwE/od6/private/full/R28C12014-07-11T09:41:23.890ZA28airnowairnow" + http_version: + recorded_at: Mon, 14 Jul 2014 12:26:24 GMT +recorded_with: VCR 2.9.2 From cb502c2756198289642eaceec469eb26b7fefdaf Mon Sep 17 00:00:00 2001 From: basnal Date: Tue, 15 Jul 2014 10:21:15 +0530 Subject: [PATCH 13/13] Unnecessary files removed #11 --- app/assets/javascripts/callbacks.js.coffee | 3 - app/assets/stylesheets/callbacks.css.scss | 3 - app/controllers/callbacks_controller.rb | 101 ------------------ app/controllers/home_controller.rb | 18 ---- app/models/token.rb | 8 -- app/views/callbacks/create.html.haml | 4 - app/views/callbacks/createv1.html.erb | 9 -- app/views/callbacks/failure.html.haml | 1 - app/views/callbacks/index.html.haml | 14 --- app/views/callbacks/setSheet.html.erb | 5 - app/views/callbacks/test.html.haml | 4 - app/views/create.html.erb | 9 -- app/views/failure.html.erb | 1 - app/views/home/add_from_google.html.haml | 7 -- app/views/setSheet.html.erb | 5 - spec/controllers/callbacks_controller_spec.rb | 5 - spec/factories/tokens.rb | 6 -- spec/helpers/callbacks_helper_spec.rb | 15 --- spec/models/token_spec.rb | 5 - 19 files changed, 223 deletions(-) delete mode 100644 app/assets/javascripts/callbacks.js.coffee delete mode 100644 app/assets/stylesheets/callbacks.css.scss delete mode 100644 app/controllers/callbacks_controller.rb delete mode 100644 app/models/token.rb delete mode 100644 app/views/callbacks/create.html.haml delete mode 100644 app/views/callbacks/createv1.html.erb delete mode 100644 app/views/callbacks/failure.html.haml delete mode 100644 app/views/callbacks/index.html.haml delete mode 100644 app/views/callbacks/setSheet.html.erb delete mode 100644 app/views/callbacks/test.html.haml delete mode 100644 app/views/create.html.erb delete mode 100644 app/views/failure.html.erb delete mode 100644 app/views/home/add_from_google.html.haml delete mode 100644 app/views/setSheet.html.erb delete mode 100644 spec/controllers/callbacks_controller_spec.rb delete mode 100644 spec/factories/tokens.rb delete mode 100644 spec/helpers/callbacks_helper_spec.rb delete mode 100644 spec/models/token_spec.rb diff --git a/app/assets/javascripts/callbacks.js.coffee b/app/assets/javascripts/callbacks.js.coffee deleted file mode 100644 index 24f83d1..0000000 --- a/app/assets/javascripts/callbacks.js.coffee +++ /dev/null @@ -1,3 +0,0 @@ -# Place all the behaviors and hooks related to the matching controller here. -# All this logic will automatically be available in application.js. -# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/stylesheets/callbacks.css.scss b/app/assets/stylesheets/callbacks.css.scss deleted file mode 100644 index e4c4d53..0000000 --- a/app/assets/stylesheets/callbacks.css.scss +++ /dev/null @@ -1,3 +0,0 @@ -// Place all the styles related to the callbacks controller here. -// They will automatically be included in application.css. -// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/callbacks_controller.rb b/app/controllers/callbacks_controller.rb deleted file mode 100644 index ee64347..0000000 --- a/app/controllers/callbacks_controller.rb +++ /dev/null @@ -1,101 +0,0 @@ -class CallbacksController < ApplicationController - - def index - tkn = Token.first - - if tkn.nil? - redirect_to "/auth/google" and return - else - if tkn['spreadsheet_id'].nil? - @ws = getSheet(tkn) - render action: 'create' and return - end - end - @sheets = Token.all.to_a - end - - def omniauth - tkn = Token.new - auth_token = request.env["omniauth.auth"].fetch("credentials") - tkn["access_token"] = auth_token.fetch("token") - tkn["refresh_token"] = auth_token.fetch("refresh_token") - tkn["expires_at"] = auth_token.fetch("expires_at") - - if tkn.save - @ws = getSheet(tkn) - else - @ws = {error: "not able to save"} - end - - render action: 'create' and return - end - - def getSheet(tkn) - client = Google::APIClient.new - client.authorization.access_token = tkn['access_token'] - drive = client.discovered_api('drive', 'v2') - - wks = client.execute( - api_method: drive.files.list, - parameters: {}, - headers: {'Content-Type'=>'application/json'} - ) - JSON.parse(wks.data.to_json) - end - - def setSheet - tkn = Token.first - tkn['spreadsheet_id'] = params['id'] - tkn.save - - insertEmailInDatabase(tkn) - - redirect_to users_path - end - - def insertEmailInDatabase(tkn) - @tkn = tkn - session = GoogleDrive.login_with_oauth(@tkn["access_token"]) - @ws = session.spreadsheet_by_key(@tkn['spreadsheet_id']).worksheets[0] - - rowcount = @ws.rows.count - - (rowcount).times do |i| - User.create(email_id: @ws[i + 1, 1], - is_subscribed: true, - joined_on: Date.today, - source: "Google Spreadsheet") - end - - end - - def refresh_token(tkn) - data = { - client_id: ENV['GOOGLE_ID'], - client_secret: ENV['GOOGLE_KEY'], - refresh_token: tkn['refresh_token'], - grant_type: 'refresh_token' - } - re = ActiveSupport::JSON.decode(RestClient.post 'https://accounts.google.com/o/oauth2/token', data) - - sheets = Token.where(spreadsheet_id: tkn['spreadsheet_id'])[0] - sheets['access_token'] = re['access_token'] - sheets['expires_at'] = (Time.now + re['expires_in'].second).localtime - sheets.save - - re - end - - def update - tkn = Token.where(spreadsheet_id: params['id']) - @tkn = tkn[0] - unless Time.now > tkn[0]['expires_at'] - @ref = refresh_token tkn[0] - end - tkn = Token.where(spreadsheet_id: params['id']) - insertEmailInDatabase(tkn[0]) - redirect_to users_path - #render action: 'test' - end - -end diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index 8d69641..95f2992 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -1,22 +1,4 @@ class HomeController < ApplicationController def index end - - def add_from_google - @sheets = Token.first - @client = Google::APIClient.new - @client.authorization.access_token = @sheets['access_token'] - @client.authorization.client_id = ENV["GOOGLE_ID"] - @client.authorization.client_secret = ENV["GOOGLE_KEY"] - @client.authorization.refresh_token = @sheets["refresh_token"] - @re = @client.auto_refresh_token - #session = GoogleDrive.login_with_oauth(tkn["access_token"]) - drive = @client.discovered_api('drive', 'v2') - - @wks = @client.execute( - api_method: drive.files.watch, - parameters: {fileId: @sheets["spreadsheet_id"]}, - headers: {'Content-Type'=>'application/json'} - ) - end end diff --git a/app/models/token.rb b/app/models/token.rb deleted file mode 100644 index a356603..0000000 --- a/app/models/token.rb +++ /dev/null @@ -1,8 +0,0 @@ -class Token - include Mongoid::Document - - field :spreadsheet_id, type: String - field :refresh_token, type: String - field :expires_at, type: Time - field :access_token, type: String -end \ No newline at end of file diff --git a/app/views/callbacks/create.html.haml b/app/views/callbacks/create.html.haml deleted file mode 100644 index 416830f..0000000 --- a/app/views/callbacks/create.html.haml +++ /dev/null @@ -1,4 +0,0 @@ --count = @ws["items"].count --count.times do |i| - =link_to @ws["items"][i]["title"], set_sheet_path(@ws["items"][i]["id"]) if @ws["items"][i]["mimeType"].include?("spreadsheet") - %br \ No newline at end of file diff --git a/app/views/callbacks/createv1.html.erb b/app/views/callbacks/createv1.html.erb deleted file mode 100644 index 2cdb756..0000000 --- a/app/views/callbacks/createv1.html.erb +++ /dev/null @@ -1,9 +0,0 @@ -<% #@ws['items'].each do |i| %> - <% #i.each do |j| %> - <%#=j%> - <%# end %> -<%# end %> - -<% @ws['items'].each do |i| %> - <%= link_to i['title'], set_sheet_path(i['id']) if i['mimeType'].include?("spreadsheet") %>
-<% end %> \ No newline at end of file diff --git a/app/views/callbacks/failure.html.haml b/app/views/callbacks/failure.html.haml deleted file mode 100644 index 2395e1d..0000000 --- a/app/views/callbacks/failure.html.haml +++ /dev/null @@ -1 +0,0 @@ -this is callbacks#failure \ No newline at end of file diff --git a/app/views/callbacks/index.html.haml b/app/views/callbacks/index.html.haml deleted file mode 100644 index 42a9da8..0000000 --- a/app/views/callbacks/index.html.haml +++ /dev/null @@ -1,14 +0,0 @@ -=@msg -=#debug @ref - -%br -= Time.now -%table.table - -@sheets.count.times do |i| - %tr - %td - = @sheets[i]["access_token"] - %td - = link_to "Update", callback_update_path(@sheets[i]["spreadsheet_id"]) - %td - = @sheets[i]["expires_at"] \ No newline at end of file diff --git a/app/views/callbacks/setSheet.html.erb b/app/views/callbacks/setSheet.html.erb deleted file mode 100644 index 3fd2d7a..0000000 --- a/app/views/callbacks/setSheet.html.erb +++ /dev/null @@ -1,5 +0,0 @@ -<% @ws.rows.each do |r| %> - <% r.each do |c| %> - <%= c %>
- <%end%> -<%end%> \ No newline at end of file diff --git a/app/views/callbacks/test.html.haml b/app/views/callbacks/test.html.haml deleted file mode 100644 index d3356e4..0000000 --- a/app/views/callbacks/test.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -=debug @tkn -=debug @ref.class -=debug @ref -=debug @tkn['expires_at'].localtime \ No newline at end of file diff --git a/app/views/create.html.erb b/app/views/create.html.erb deleted file mode 100644 index 2cdb756..0000000 --- a/app/views/create.html.erb +++ /dev/null @@ -1,9 +0,0 @@ -<% #@ws['items'].each do |i| %> - <% #i.each do |j| %> - <%#=j%> - <%# end %> -<%# end %> - -<% @ws['items'].each do |i| %> - <%= link_to i['title'], set_sheet_path(i['id']) if i['mimeType'].include?("spreadsheet") %>
-<% end %> \ No newline at end of file diff --git a/app/views/failure.html.erb b/app/views/failure.html.erb deleted file mode 100644 index 812fb59..0000000 --- a/app/views/failure.html.erb +++ /dev/null @@ -1 +0,0 @@ -this is callbacks#failure diff --git a/app/views/home/add_from_google.html.haml b/app/views/home/add_from_google.html.haml deleted file mode 100644 index 47f8914..0000000 --- a/app/views/home/add_from_google.html.haml +++ /dev/null @@ -1,7 +0,0 @@ -=@sheets["spreadsheet_id"] -%br -=#@client.authorization.methods -=debug @re -%br - -=#debug @wks \ No newline at end of file diff --git a/app/views/setSheet.html.erb b/app/views/setSheet.html.erb deleted file mode 100644 index 3fd2d7a..0000000 --- a/app/views/setSheet.html.erb +++ /dev/null @@ -1,5 +0,0 @@ -<% @ws.rows.each do |r| %> - <% r.each do |c| %> - <%= c %>
- <%end%> -<%end%> \ No newline at end of file diff --git a/spec/controllers/callbacks_controller_spec.rb b/spec/controllers/callbacks_controller_spec.rb deleted file mode 100644 index 08d5496..0000000 --- a/spec/controllers/callbacks_controller_spec.rb +++ /dev/null @@ -1,5 +0,0 @@ -require 'rails_helper' - -RSpec.describe CallbacksController, :type => :controller do - -end diff --git a/spec/factories/tokens.rb b/spec/factories/tokens.rb deleted file mode 100644 index 37cbfd0..0000000 --- a/spec/factories/tokens.rb +++ /dev/null @@ -1,6 +0,0 @@ -# Read about factories at https://github.com/thoughtbot/factory_girl - -FactoryGirl.define do - factory :token do - end -end diff --git a/spec/helpers/callbacks_helper_spec.rb b/spec/helpers/callbacks_helper_spec.rb deleted file mode 100644 index d10c6fd..0000000 --- a/spec/helpers/callbacks_helper_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -require 'rails_helper' - -# Specs in this file have access to a helper object that includes -# the CallbacksHelper. For example: -# -# describe CallbacksHelper do -# describe "string concat" do -# it "concats two strings with spaces" do -# expect(helper.concat_strings("this","that")).to eq("this that") -# end -# end -# end -RSpec.describe CallbacksHelper, :type => :helper do - pending "add some examples to (or delete) #{__FILE__}" -end diff --git a/spec/models/token_spec.rb b/spec/models/token_spec.rb deleted file mode 100644 index 76bf2eb..0000000 --- a/spec/models/token_spec.rb +++ /dev/null @@ -1,5 +0,0 @@ -require 'rails_helper' - -RSpec.describe Token, :type => :model do - pending "add some examples to (or delete) #{__FILE__}" -end