google_spreadsheet_fetcher 1.9.1 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a3660f6d65df012ef4f8dab6b94a6546c5fff27c188728228af19733f21d5114
4
- data.tar.gz: ac69095de2b42ca87b8f4cc94a1789ef06a6daed653864fc731f4c258fcaa4b8
3
+ metadata.gz: a18dded3ae272e466b1ef230e2b026bbef6dcbdc3504ede64efc98d6be084d84
4
+ data.tar.gz: 602af299a3764c525d76f0594023c8b84784f53993dbc651ff8605148ce47385
5
5
  SHA512:
6
- metadata.gz: 5e384e728280389bc97dde41209c092f4a7fc5260b90fcbdbb98791265845d1873bddb4ddb30bf8dae170de548a32812ba7635e802beb5fec1e10aa4c2ab5473
7
- data.tar.gz: 3e924a4be7fbef426b1ec35102145c9cb19148794ee1452256b8ddbaadfcdecb2be6cdc815064b5664478622f72c2e380a1ee0586fa57716212b68edcdcf91ee
6
+ metadata.gz: 5513c2c32a6fdc869cf6d628d4ca4b6808c84b42107f25ba2dd765c3c173339216a71020fe4003d94c12ef3f117e9a1f702b546c0e2abe31f59402edb223ae80
7
+ data.tar.gz: 8bdeae4bc5fd457095957dcca62cc9bdf9aff6e36d689d817fd84bb2fa2e3752fa25aef17da3753511d44d8b16757d358b1cd127faa9eb9f840051be1ce90630
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # GoogleSpreadsheetFetcher
2
2
 
3
- Use OAuth 2 authentication to retrieve data from Google Spreadsheet.
3
+ Provides access to Google spreadsheets
4
4
 
5
5
  ## Installation
6
6
 
@@ -20,18 +20,11 @@ Or install it yourself as:
20
20
 
21
21
  ## Usage
22
22
 
23
- - Make project. https://cloud.google.com/resource-manager/docs/creating-managing-projects
24
- - Enable Google Drive API
25
- - Make OAuth 2.0 Client. (other)
26
- - Download client secret json
27
-
28
-
29
23
  ```ruby
30
24
  sheet_key = 'example_sheet_id'
31
25
 
32
26
  GoogleSpreadsheetFetcher.configure do |config|
33
- config.client_secrets_file = 'client_secrets_file_path.json'
34
- config.credential_store_file = 'credential_store_file_path.json'
27
+ ...
35
28
  end
36
29
 
37
30
  user_id = 'sample'
@@ -53,6 +46,14 @@ fetcher.all_rows_by!(title: 'sheet_title')
53
46
  fetcher.all_rows_by!(sheet_id: 1234567890)
54
47
  ```
55
48
 
49
+ ### Use Service Account
50
+
51
+ https://github.com/taka0125/google_spreadsheet_fetcher/wiki/Use-Service-Account
52
+
53
+ ### Use OAuth2
54
+
55
+ https://github.com/taka0125/google_spreadsheet_fetcher/wiki/Use-OAuth2
56
+
56
57
  ## Development
57
58
 
58
59
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -0,0 +1,9 @@
1
+ module GoogleSpreadsheetFetcher
2
+ module Authorizer
3
+ module Interface
4
+ def fetch_credentials!(user_id: nil)
5
+ raise NotImplementedError
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,51 @@
1
+ # https://github.com/googleapis/google-api-ruby-client/blob/main/docs/oauth-web.md
2
+
3
+ require 'googleauth'
4
+ require 'googleauth/web_user_authorizer'
5
+ require 'googleauth/stores/file_token_store'
6
+
7
+ module GoogleSpreadsheetFetcher
8
+ module Authorizer
9
+ module Oauth2
10
+ class Authorizer
11
+ include Interface
12
+
13
+ def initialize(config: nil, callback_uri: nil)
14
+ @config = config || ::GoogleSpreadsheetFetcher::Authorizer::Oauth2::Config.new
15
+ @callback_uri = callback_uri || ::GoogleSpreadsheetFetcher::Authorizer::Oauth2::RackApplication::CALLBACK_PATH
16
+ @web_user_authorizer = build_web_user_authorizer
17
+
18
+ freeze
19
+ end
20
+
21
+ def fetch_credentials!(user_id: nil)
22
+ web_user_authorizer.get_credentials(user_id || config.user_id)
23
+ end
24
+
25
+ def fetch_credentials
26
+ fetch_credentials!
27
+ rescue StandardError
28
+ nil
29
+ end
30
+
31
+ def get_authorization_url(rack_request)
32
+ web_user_authorizer.get_authorization_url(request: rack_request)
33
+ end
34
+
35
+ def handle_auth_callback(rack_request)
36
+ web_user_authorizer.handle_auth_callback(config.user_id, rack_request)
37
+ end
38
+
39
+ private
40
+
41
+ attr_reader :config, :callback_uri, :web_user_authorizer
42
+
43
+ def build_web_user_authorizer
44
+ ::Google::Auth::WebUserAuthorizer.new(
45
+ config.client_id, ::GoogleSpreadsheetFetcher.config.scopes, config.token_store, callback_uri
46
+ )
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,28 @@
1
+ module GoogleSpreadsheetFetcher
2
+ module Authorizer
3
+ module Oauth2
4
+ class Config
5
+ attr_reader :client_secrets_json_path, :user_id, :token_store, :client_id
6
+
7
+ def initialize(client_secrets_json_path: nil, user_id: nil, token_store: nil)
8
+ @client_secrets_json_path = client_secrets_json_path || ::GoogleSpreadsheetFetcher.config.client_secrets_file
9
+ @user_id = user_id || ::GoogleSpreadsheetFetcher.config.user_id
10
+ @token_store = token_store || default_token_store
11
+ @client_id = ::Google::Auth::ClientId.from_file(self.client_secrets_json_path)
12
+
13
+ freeze
14
+ end
15
+
16
+ private
17
+
18
+ def default_token_store
19
+ store = ::GoogleSpreadsheetFetcher.config.token_store
20
+ return store if store.present?
21
+
22
+ file = ::GoogleSpreadsheetFetcher.config.credential_store_file
23
+ ::Google::Auth::Stores::FileTokenStore.new(file: file)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,70 @@
1
+ require 'securerandom'
2
+
3
+ module GoogleSpreadsheetFetcher
4
+ module Authorizer
5
+ module Oauth2
6
+ class RackApplication
7
+ AUTHORIZE_PATH = '/authorize'.freeze
8
+ CALLBACK_PATH = '/oauth2callback'.freeze
9
+
10
+ def initialize(config: nil)
11
+ @config = config || ::GoogleSpreadsheetFetcher::Authorizer::Oauth2::Config.new
12
+ @authorizer = ::GoogleSpreadsheetFetcher::Authorizer::Oauth2::Authorizer.new(config: config)
13
+
14
+ freeze
15
+ end
16
+
17
+ def call(env)
18
+ path = env['PATH_INFO']
19
+ request_method = env['REQUEST_METHOD']
20
+
21
+ return handle_authorize(env) if path == AUTHORIZE_PATH && request_method == 'GET'
22
+ return handle_callback(env) if path == CALLBACK_PATH && request_method == 'GET'
23
+
24
+ plain_response(400, 'invalid access')
25
+ end
26
+
27
+ def cookie_settings(secret: nil)
28
+ {
29
+ domain: 'localhost',
30
+ path: '/',
31
+ expire_after: 3600*24,
32
+ secret: secret || SecureRandom.uuid
33
+ }
34
+ end
35
+
36
+ private
37
+
38
+ attr_reader :config, :authorizer
39
+
40
+ def handle_authorize(env)
41
+ request = ::Rack::Request.new(env)
42
+
43
+ credentials = authorizer.fetch_credentials
44
+ if credentials.nil?
45
+ redirect_url = authorizer.get_authorization_url(request)
46
+
47
+ return redirect_response(redirect_url)
48
+ end
49
+
50
+ plain_response(200, 'authorized')
51
+ end
52
+
53
+ def handle_callback(env)
54
+ request = ::Rack::Request.new(env)
55
+ authorizer.handle_auth_callback(request)
56
+
57
+ plain_response(200, 'token stored')
58
+ end
59
+
60
+ def redirect_response(url)
61
+ [302, {'location' => url}, []]
62
+ end
63
+
64
+ def plain_response(status, text)
65
+ [status, {'content-type' => 'text/plain'}, [text]]
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,27 @@
1
+ module GoogleSpreadsheetFetcher
2
+ module Authorizer
3
+ class ServiceAccount
4
+ include Interface
5
+
6
+ def initialize(credential, scope: nil)
7
+ @credential = credential
8
+ @scope = scope || ::GoogleSpreadsheetFetcher.config.scopes
9
+
10
+ freeze
11
+ end
12
+
13
+ def setup!; end
14
+
15
+ def fetch_credentials!(user_id: nil)
16
+ ::Google::Auth::ServiceAccountCredentials.make_creds(
17
+ json_key_io: StringIO.new(credential),
18
+ scope: scope
19
+ ).tap(&:fetch_access_token!)
20
+ end
21
+
22
+ private
23
+
24
+ attr_reader :credential, :scope
25
+ end
26
+ end
27
+ end
@@ -1,6 +1,3 @@
1
- require 'google/apis/sheets_v4'
2
- require 'shellwords'
3
-
4
1
  module GoogleSpreadsheetFetcher
5
2
  class BulkFetcher
6
3
  # @param [String] spreadsheet_id
@@ -4,14 +4,17 @@ module GoogleSpreadsheetFetcher
4
4
  class Config
5
5
  include ActiveSupport::Configurable
6
6
 
7
+ config_accessor :authorizer
8
+
7
9
  config_accessor :client_secrets_file
8
10
  config_accessor :credential_store_file # required if token_store not set
9
11
  config_accessor :token_store # required if credential_store_file not set
10
12
  config_accessor :scopes
13
+ config_accessor :user_id
11
14
 
12
15
  def self.default_config
13
16
  new.tap do |config|
14
- config.scopes = [Google::Apis::SheetsV4::AUTH_SPREADSHEETS_READONLY]
17
+ config.scopes = [::Google::Apis::SheetsV4::AUTH_SPREADSHEETS_READONLY]
15
18
  end
16
19
  end
17
20
  end
@@ -1,10 +1,5 @@
1
- require 'google/apis/sheets_v4'
2
- require 'shellwords'
3
-
4
1
  module GoogleSpreadsheetFetcher
5
2
  class Fetcher
6
- OOB_URI = 'urn:ietf:wg:oauth:2.0:oob'
7
-
8
3
  # @param [String] spreadsheet_id
9
4
  # @param [String] user_id
10
5
  # @param [GoogleSpreadsheetFetcher::Config] config
@@ -1,12 +1,5 @@
1
- require 'google/apis/sheets_v4'
2
- require 'googleauth'
3
- require 'googleauth/stores/file_token_store'
4
- require 'shellwords'
5
-
6
1
  module GoogleSpreadsheetFetcher
7
2
  class SheetsServiceBuilder
8
- OOB_URI = 'urn:ietf:wg:oauth:2.0:oob'
9
-
10
3
  # @param [String] user_id
11
4
  # @param [GoogleSpreadsheetFetcher::Config] config
12
5
  # @param [String] application_name
@@ -14,31 +7,20 @@ module GoogleSpreadsheetFetcher
14
7
  @user_id = user_id
15
8
  @config = config || GoogleSpreadsheetFetcher.config
16
9
  @application_name = application_name
17
- @token_store = @config.token_store || Google::Auth::Stores::FileTokenStore.new(file: @config.credential_store_file)
18
10
  end
19
11
 
20
- def build
21
- Google::Apis::SheetsV4::SheetsService.new.tap do |service|
22
- service.authorization = fetch_credentials
23
- service.client_options.application_name = @application_name if @application_name.present?
12
+ def build(authorizer: nil)
13
+ authorizer = authorizer || config.authorizer || ::GoogleSpreadsheetFetcher::Authorizer::Oauth2::Authorizer.new
14
+ raise 'Authorizer is not configured' if authorizer.blank?
15
+
16
+ ::Google::Apis::SheetsV4::SheetsService.new.tap do |service|
17
+ service.authorization = authorizer.fetch_credentials!(user_id: user_id)
18
+ service.client_options.application_name = application_name if application_name.present?
24
19
  end
25
20
  end
26
21
 
27
22
  private
28
23
 
29
- def fetch_credentials
30
- client_id = Google::Auth::ClientId.from_file(@config.client_secrets_file)
31
- authorizer = Google::Auth::UserAuthorizer.new(client_id, @config.scopes, @token_store)
32
-
33
- credentials = authorizer.get_credentials(@user_id)
34
- return credentials if credentials.present?
35
-
36
- url = authorizer.get_authorization_url(base_url: OOB_URI)
37
- escaped_url = url.shellescape
38
- system("open #{escaped_url}")
39
- puts "Open #{url} in your browser and enter the resulting code: "
40
- code = STDIN.gets
41
- authorizer.get_and_store_credentials_from_code(user_id: @user_id, code: code, base_url: OOB_URI)
42
- end
24
+ attr_reader :user_id, :config, :application_name
43
25
  end
44
26
  end
@@ -1,3 +1,3 @@
1
1
  module GoogleSpreadsheetFetcher
2
- VERSION = "1.9.1"
2
+ VERSION = "2.0.1"
3
3
  end
@@ -1,13 +1,21 @@
1
- require "active_support"
2
- require "active_support/json"
3
- require "active_support/core_ext"
4
- require "google_spreadsheet_fetcher/version"
5
- require "google_spreadsheet_fetcher/config"
6
- require "google_spreadsheet_fetcher/error"
7
- require "google_spreadsheet_fetcher/fetcher"
8
- require "google_spreadsheet_fetcher/sheet_url"
9
- require "google_spreadsheet_fetcher/bulk_fetcher"
10
- require "google_spreadsheet_fetcher/sheets_service_builder"
1
+ require 'active_support'
2
+ require 'active_support/json'
3
+ require 'active_support/core_ext'
4
+ require 'googleauth'
5
+ require 'google/apis/sheets_v4'
6
+
7
+ require 'google_spreadsheet_fetcher/version'
8
+ require 'google_spreadsheet_fetcher/config'
9
+ require 'google_spreadsheet_fetcher/error'
10
+ require 'google_spreadsheet_fetcher/authorizer/interface'
11
+ require 'google_spreadsheet_fetcher/authorizer/service_account'
12
+ require 'google_spreadsheet_fetcher/authorizer/oauth2/config'
13
+ require 'google_spreadsheet_fetcher/authorizer/oauth2/rack_application'
14
+ require 'google_spreadsheet_fetcher/authorizer/oauth2/authorizer'
15
+ require 'google_spreadsheet_fetcher/fetcher'
16
+ require 'google_spreadsheet_fetcher/sheet_url'
17
+ require 'google_spreadsheet_fetcher/bulk_fetcher'
18
+ require 'google_spreadsheet_fetcher/sheets_service_builder'
11
19
 
12
20
  module GoogleSpreadsheetFetcher
13
21
  def self.config
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: google_spreadsheet_fetcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.1
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Takahiro Ooishi
@@ -9,8 +9,22 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2022-08-11 00:00:00.000000000 Z
12
+ date: 2023-12-08 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rack
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "<"
19
+ - !ruby/object:Gem::Version
20
+ version: '3.0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "<"
26
+ - !ruby/object:Gem::Version
27
+ version: '3.0'
14
28
  - !ruby/object:Gem::Dependency
15
29
  name: google-api-client
16
30
  requirement: !ruby/object:Gem::Requirement
@@ -25,6 +39,20 @@ dependencies:
25
39
  - - "~>"
26
40
  - !ruby/object:Gem::Version
27
41
  version: '0.9'
42
+ - !ruby/object:Gem::Dependency
43
+ name: googleauth
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
28
56
  - !ruby/object:Gem::Dependency
29
57
  name: activesupport
30
58
  requirement: !ruby/object:Gem::Requirement
@@ -89,19 +117,14 @@ executables: []
89
117
  extensions: []
90
118
  extra_rdoc_files: []
91
119
  files:
92
- - ".github/workflows/main.yml"
93
- - ".github/workflows/release.yml"
94
- - ".gitignore"
95
- - ".rspec"
96
- - ".travis.yml"
97
- - Gemfile
98
120
  - LICENSE
99
121
  - README.md
100
- - Rakefile
101
- - bin/console
102
- - bin/setup
103
- - google_spreadsheet_fetcher.gemspec
104
122
  - lib/google_spreadsheet_fetcher.rb
123
+ - lib/google_spreadsheet_fetcher/authorizer/interface.rb
124
+ - lib/google_spreadsheet_fetcher/authorizer/oauth2/authorizer.rb
125
+ - lib/google_spreadsheet_fetcher/authorizer/oauth2/config.rb
126
+ - lib/google_spreadsheet_fetcher/authorizer/oauth2/rack_application.rb
127
+ - lib/google_spreadsheet_fetcher/authorizer/service_account.rb
105
128
  - lib/google_spreadsheet_fetcher/bulk_fetcher.rb
106
129
  - lib/google_spreadsheet_fetcher/config.rb
107
130
  - lib/google_spreadsheet_fetcher/error.rb
@@ -128,7 +151,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
128
151
  - !ruby/object:Gem::Version
129
152
  version: '0'
130
153
  requirements: []
131
- rubygems_version: 3.3.7
154
+ rubygems_version: 3.4.10
132
155
  signing_key:
133
156
  specification_version: 4
134
157
  summary: Google Spreadsheet fetcher
@@ -1,40 +0,0 @@
1
- name: rspec
2
-
3
- on:
4
- push:
5
- branches:
6
- - main
7
-
8
- pull_request:
9
- branches:
10
- - main
11
-
12
- env:
13
- RAILS_ENV: test
14
-
15
- jobs:
16
- test:
17
- runs-on: ubuntu-latest
18
- strategy:
19
- fail-fast: false
20
-
21
- matrix:
22
- ruby:
23
- - 2.6
24
- - 2.7
25
- - 3.0
26
- - 3.1
27
-
28
- steps:
29
- - uses: actions/checkout@v2
30
-
31
- - name: Set up Ruby
32
- uses: ruby/setup-ruby@v1
33
- with:
34
- ruby-version: ${{ matrix.ruby }}
35
- bundler-cache: true
36
-
37
- - name: Run tests
38
- run: |
39
- bundle exec rspec
40
- continue-on-error: ${{ matrix.allow_failures == 'true' }}
@@ -1,33 +0,0 @@
1
- name: Release gem
2
-
3
- on:
4
- workflow_dispatch:
5
- inputs:
6
- rubygems-otp-code:
7
- description: RubyGems OTP code
8
- required: true
9
-
10
- permissions:
11
- contents: write
12
-
13
- jobs:
14
- release-gem:
15
- runs-on: ubuntu-latest
16
- env:
17
- GEM_HOST_API_KEY: ${{ secrets.RUBYGEMS_API_KEY }}
18
- GEM_HOST_OTP_CODE: ${{ github.event.inputs.rubygems-otp-code }}
19
- steps:
20
- - uses: actions/checkout@v2
21
- with:
22
- fetch-depth: 0 # bundle exec rake release で git tag を見るため、tagをfetchするようにしている
23
- - uses: ruby/setup-ruby@v1
24
- with:
25
- ruby-version: 3.1.1
26
- - name: Bundle install
27
- run: bundle install
28
- - name: Setup git config # bundle exec rake release でgit tagが打たれていない場合、タグを打ってpushしてくれるため用意している
29
- run: |
30
- git config --global user.email "taka0125@gmail.com"
31
- git config --global user.name "Takahiro Ooishi"
32
- - name: Release gem
33
- run: bundle exec rake release
data/.gitignore DELETED
@@ -1,14 +0,0 @@
1
- /.bundle/
2
- /.yardoc
3
- /Gemfile.lock
4
- /_yardoc/
5
- /coverage/
6
- /doc/
7
- /pkg/
8
- /spec/reports/
9
- /tmp/
10
-
11
- # rspec failure tracking
12
- .rspec_status
13
-
14
- vendor/
data/.rspec DELETED
@@ -1,3 +0,0 @@
1
- --format documentation
2
- --color
3
- -r spec_helper
data/.travis.yml DELETED
@@ -1,5 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.4.1
5
- before_install: gem install bundler -v 1.14.6
data/Gemfile DELETED
@@ -1,4 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in google_spreadsheet_fetcher.gemspec
4
- gemspec
data/Rakefile DELETED
@@ -1,6 +0,0 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
3
-
4
- RSpec::Core::RakeTask.new(:spec)
5
-
6
- task :default => :spec
data/bin/console DELETED
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require "bundler/setup"
4
- require "google_spreadsheet_fetcher"
5
-
6
- # You can add fixtures and/or initialization code here to make experimenting
7
- # with your gem easier. You can also use a different console, if you like.
8
-
9
- # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
- # Pry.start
12
-
13
- require "irb"
14
- IRB.start(__FILE__)
data/bin/setup DELETED
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
- IFS=$'\n\t'
4
- set -vx
5
-
6
- bundle install
7
-
8
- # Do any other automated setup that you need to do here
@@ -1,32 +0,0 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'google_spreadsheet_fetcher/version'
5
-
6
- Gem::Specification.new do |spec|
7
- spec.name = "google_spreadsheet_fetcher"
8
- spec.version = GoogleSpreadsheetFetcher::VERSION
9
- spec.authors = ["Takahiro Ooishi", "Yuya Yokosuka"]
10
- spec.email = ["taka0125@gmail.com", "yuya.yokosuka@gmail.com"]
11
-
12
- spec.summary = %q{Google Spreadsheet fetcher}
13
- spec.description = %q{Google Spreadsheet fetcher}
14
- spec.homepage = "https://github.com/taka0125/google_spreadsheet_fetcher"
15
- spec.licenses = ['MIT']
16
-
17
- spec.files = `git ls-files -z`.split("\x0").reject do |f|
18
- f.match(%r{^(test|spec|features)/})
19
- end
20
- spec.bindir = "exe"
21
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
- spec.require_paths = ["lib"]
23
-
24
- spec.required_ruby_version = '>= 2.3.0'
25
-
26
- spec.add_dependency 'google-api-client', '~> 0.9'
27
- spec.add_dependency 'activesupport'
28
-
29
- spec.add_development_dependency "bundler"
30
- spec.add_development_dependency "rake"
31
- spec.add_development_dependency "rspec"
32
- end