gyaazle 0.0.2 → 0.1.0

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
  SHA1:
3
- metadata.gz: cd7758c9dbc613c89561a922691f28b624aef943
4
- data.tar.gz: 453f8c594fa93bcfb9055cbe774734f1c219dbcf
3
+ metadata.gz: e9fcb4b5a8c115bc19de388ee9a16611d396208a
4
+ data.tar.gz: dcb1e78fdd812a5c080ec784c799c0a2bb398ed2
5
5
  SHA512:
6
- metadata.gz: 341020bcb4d18d26ee6605bb4d08642314a01ecf97fd96f4a0d1dfa6fe133a61f52bc8168e4fab640e5050765c478dcdf7fa50796921a001fe4bd04b95f276be
7
- data.tar.gz: 0abe5cbe6dd9ddbe15340a7d17b2ad755c8e97091c3846a86b45bb2021d7ca9ff1967cd108e32b5e31067a801d7e60b5602056dce17e0ccffa0ad6028ab16be2
6
+ metadata.gz: 7432d5148cbb9d3e868dc1877d777270f15007f588665a233b6b4cc215b22d16660c67718cc286b94165b29c41ca6cc6619c94c3e66d7fdb4f66123b8fa83364
7
+ data.tar.gz: 1d19d6a111e70dc291fbca2b8b26d6288ce39e7e4bccb0d02a053a7695c11c9cea843797a569408cc3af4f32f28274438d6bb9d32d9a1e12f09331af9cecbf2e
data/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.3
5
+ - 2.0.0
6
+
7
+ script:
8
+ - bundle exec rspec -c
data/Gemfile CHANGED
@@ -2,3 +2,7 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in gyaazle.gemspec
4
4
  gemspec
5
+
6
+ gem 'coveralls', :require => false
7
+ gem 'json', '~> 1.7.7'
8
+
data/README.md CHANGED
@@ -1,3 +1,6 @@
1
+ [![Build Status](https://travis-ci.org/uu59/gyaazle.png?branch=master)](https://travis-ci.org/uu59/gyaazle)
2
+ [![Coverage Status](https://coveralls.io/repos/uu59/gyaazle/badge.png?branch=master)](https://coveralls.io/r/uu59/gyaazle)
3
+
1
4
  # Gyaazle
2
5
 
3
6
  Gyazo like image uploader that upload image(s) to Google Drive.
data/gyaazle.gemspec CHANGED
@@ -26,4 +26,7 @@ Gem::Specification.new do |spec|
26
26
  spec.add_development_dependency "pry"
27
27
  spec.add_development_dependency "bundler", "~> 1.3"
28
28
  spec.add_development_dependency "rake"
29
+ spec.add_development_dependency "rspec"
30
+ spec.add_development_dependency "simplecov"
31
+ spec.add_development_dependency "webmock"
29
32
  end
data/lib/gyaazle/cli.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  module Gyaazle
2
2
  class CLI
3
+ attr_reader :config, :client
4
+
3
5
  def initialize(argv)
4
6
  @argv = argv
5
7
  @opts = Trollop.options(@argv) do
@@ -35,19 +37,19 @@ TEXT
35
37
  end
36
38
 
37
39
  def upload
38
- if @config.load.nil? || @config.load[:refresh_token].nil?
39
- credentials = initialize_tokens
40
- else
41
- @client.refresh_token!
42
- credentials = @client.credentials
43
- end
40
+ check_credentials!
41
+
44
42
  @argv.each do |file|
45
- fileobj = @client.upload(file)
46
- puts "#{file}: #{fileobj[:alternateLink]}"
43
+ fileobj = client.upload(file)
44
+ puts "#{file}:"
45
+ puts " * url: #{fileobj[:alternateLink]}"
46
+ puts " * download: #{fileobj[:downloadUrl]}"
47
+ puts " * deep link: https://drive.google.com/uc?export=view&id=#{fileobj[:id]}"
48
+ puts
47
49
  if @opts[:open]
48
50
  Launchy.open fileobj[:alternateLink]
49
51
  end
50
- @client.set_permissions(fileobj[:id])
52
+ client.set_permissions(fileobj[:id])
51
53
  end
52
54
  end
53
55
 
@@ -64,21 +66,28 @@ TEXT
64
66
  end
65
67
 
66
68
  def edit_config
67
- system(ENV["EDITOR"], @config.file)
68
- puts "Updated!"
69
+ system(ENV["EDITOR"], config.file)
69
70
  end
70
71
 
71
- def initialize_tokens
72
- tokens = @client.get_tokens(authorize)
73
- @config.save(tokens)
72
+ def initialize_tokens(verifier = nil)
73
+ tokens = client.get_tokens(verifier || authorize)
74
+ config.save(tokens)
74
75
  tokens
75
76
  end
76
77
 
77
78
  def authorize
78
79
  puts "Open this link by your browser, and authorize"
79
- puts @client.authorize_url
80
+ puts client.authorize_url
80
81
  print "Paste code here: "
81
82
  STDIN.gets.strip
82
83
  end
84
+
85
+ def check_credentials!
86
+ if config.load.nil? || config.load[:refresh_token].nil?
87
+ initialize_tokens(authorize)
88
+ else
89
+ client.refresh_token!
90
+ end
91
+ end
83
92
  end
84
93
  end
@@ -1,30 +1,19 @@
1
1
  module Gyaazle
2
2
  class Client
3
- attr_reader :client, :config
3
+ attr_reader :agent, :config
4
4
 
5
5
  def initialize(config)
6
6
  @config = config
7
- @client = HTTPClient.new
8
- end
9
-
10
- def authorize(code)
11
- json = client.post_content("https://accounts.google.com/o/oauth2/token", {
12
- :code => code,
13
- :client_id => config.id,
14
- :client_secret => config.secret,
15
- :redirect_uri => "urn:ietf:wg:oauth:2.0:oob",
16
- :grant_type => "authorization_code",
17
- })
18
- MultiJson.load(json, :symbolize_keys => true)
7
+ @agent = HTTPClient.new
19
8
  end
20
9
 
21
10
  def authorize_url
22
11
  url = "https://accounts.google.com/o/oauth2/auth?client_id=#{config.id}&response_type=code&redirect_uri=urn:ietf:wg:oauth:2.0:oob&scope=https://www.googleapis.com/auth/drive"
23
- Nokogiri::HTML.parse(client.get(url).body).at('a').attributes["href"].to_s
12
+ Nokogiri::HTML.parse(agent.get(url).body).at('a').attributes["href"].to_s
24
13
  end
25
14
 
26
15
  def get_tokens(verifier)
27
- client.post_content("https://accounts.google.com/o/oauth2/token",{
16
+ agent.post_content("https://accounts.google.com/o/oauth2/token",{
28
17
  :code => verifier,
29
18
  :client_id => config.id,
30
19
  :client_secret => config.secret,
@@ -34,7 +23,7 @@ module Gyaazle
34
23
  end
35
24
 
36
25
  def refresh_token!
37
- json = client.post("https://accounts.google.com/o/oauth2/token", {
26
+ json = agent.post("https://accounts.google.com/o/oauth2/token", {
38
27
  :refresh_token => credentials[:refresh_token],
39
28
  :client_id => config.id,
40
29
  :client_secret => config.secret,
@@ -59,11 +48,11 @@ module Gyaazle
59
48
  },
60
49
  ]
61
50
 
62
- response = client.post(
51
+ response = agent.post(
63
52
  'https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart',
64
53
  body,
65
54
  {
66
- "Authorization" => "#{credentials[:token_type]} #{credentials[:access_token]}",
55
+ "Authorization" => authorization_header_value,
67
56
  "Content-Type" => "multipart/related; boundary=___#{Time.now.to_f}___",
68
57
  }
69
58
  )
@@ -81,33 +70,37 @@ module Gyaazle
81
70
  :additionalRoles => ["commenter"],
82
71
  }
83
72
  )
84
- client.post_content(
73
+ agent.post_content(
85
74
  "https://www.googleapis.com/drive/v2/files/#{file_id}/permissions",
86
75
  json,
87
76
  {
88
- "Authorization" => "#{credentials[:token_type]} #{credentials[:access_token]}",
77
+ "Authorization" => authorization_header_value,
89
78
  'Content-Type' => 'application/json;charset=utf-8',
90
79
  }
91
80
  )
92
81
  end
93
82
 
94
- def get(file_id)
95
- json = client.get(
83
+ def get_file_info(file_id)
84
+ json = agent.get(
96
85
  "https://www.googleapis.com/drive/v2/files/#{file_id}",
97
- {},
86
+ nil,
98
87
  {
99
- "Authorization" => "#{credentials[:token_type]} #{credentials[:access_token]}",
88
+ "Authorization" => authorization_header_value,
100
89
  }
101
90
  ).body
102
91
 
103
92
  MultiJson.load(json, :symbolize_keys => true)
104
93
  end
105
94
 
95
+ def authorization_header_value
96
+ "#{credentials[:token_type]} #{credentials[:access_token]}"
97
+ end
98
+
106
99
  def folder_id
107
100
  id = credentials[:folder_id]
108
101
  return create_folder("Gyaazle") unless id
109
102
 
110
- folder = get(id)
103
+ folder = get_file_info(id)
111
104
  if !folder[:id] || folder[:labels][:trashed]
112
105
  create_folder("Gyaazle")
113
106
  else
@@ -116,7 +109,7 @@ module Gyaazle
116
109
  end
117
110
 
118
111
  def create_folder(name)
119
- json = client.post_content(
112
+ json = agent.post_content(
120
113
  "https://www.googleapis.com/drive/v2/files",
121
114
  MultiJson.dump({
122
115
  :title => name,
@@ -124,7 +117,7 @@ module Gyaazle
124
117
  :parents => [{:id => "root"}],
125
118
  }),
126
119
  {
127
- "Authorization" => "#{credentials[:token_type]} #{credentials[:access_token]}",
120
+ "Authorization" => authorization_header_value,
128
121
  'Content-Type' => 'application/json;charset=utf-8',
129
122
  }
130
123
  )
@@ -3,15 +3,12 @@ module Gyaazle
3
3
  CLIENT_ID = "810975313441.apps.googleusercontent.com"
4
4
  CLIENT_SECRET = "0CJJ4jT2jcUsCWDrsHvXmARs"
5
5
 
6
- attr_reader :id, :secret, :file
6
+ attr_reader :id, :secret
7
7
 
8
8
  def initialize(file = nil)
9
9
  @id = CLIENT_ID
10
10
  @secret = CLIENT_SECRET
11
11
  @file = file
12
- dir = File.dirname(@file)
13
- FileUtils.mkdir_p(dir) unless File.directory?(dir)
14
- FileUtils.touch(file) unless File.exists?(file)
15
12
  end
16
13
 
17
14
  def save(json)
@@ -27,5 +24,12 @@ module Gyaazle
27
24
  def load
28
25
  MultiJson.load(File.read(file), :symbolize_keys => true) rescue nil
29
26
  end
27
+
28
+ def file
29
+ dir = File.dirname(@file)
30
+ FileUtils.mkdir_p(dir) unless File.directory?(dir)
31
+ FileUtils.touch(@file) unless File.exists?(@file)
32
+ @file
33
+ end
30
34
  end
31
35
  end
@@ -1,3 +1,3 @@
1
1
  module Gyaazle
2
- VERSION = "0.0.2"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -0,0 +1,115 @@
1
+ # -- coding: utf-8
2
+
3
+ require "spec_helper"
4
+
5
+ describe Gyaazle::CLI do
6
+ let(:cli) { Gyaazle::CLI.new([]) }
7
+
8
+ describe "ensure oauth token" do
9
+ before do
10
+ cli.stub(:authorize).and_return("verification code")
11
+ end
12
+
13
+ it "invoke #check_credentials! before #upload" do
14
+ cli.should_receive(:check_credentials!)
15
+ cli.run!
16
+ end
17
+
18
+ context "config file does not exists" do
19
+ before do
20
+ cli.config.stub(:load).and_return(nil)
21
+ end
22
+
23
+ it "invoke #initialize_tokens" do
24
+ cli.should_receive(:initialize_tokens)
25
+ cli.run!
26
+ end
27
+ end
28
+
29
+ context "config file is sane" do
30
+ before do
31
+ cli.config.stub(:load).and_return(:client_id => "id", :client_secret => "secret", :refresh_token => "refresh")
32
+ end
33
+
34
+ it "invoke #refresh_token!" do
35
+ cli.client.should_receive(:refresh_token!)
36
+ cli.run!
37
+ end
38
+ end
39
+ end
40
+
41
+ describe "options" do
42
+ context "-e" do
43
+ let(:cli) { Gyaazle::CLI.new(%w!-e!) }
44
+ before do
45
+ cli.stub(:edit_config)
46
+ end
47
+
48
+ it "invoke #edit_config" do
49
+ cli.should_receive(:edit_config)
50
+ cli.run!
51
+ end
52
+
53
+ it "not invoke #upload and #check_credentials!" do
54
+ cli.should_not_receive(:check_credentials!)
55
+ cli.should_not_receive(:upload)
56
+ cli.run!
57
+ end
58
+ end
59
+
60
+ context "--config filepath" do
61
+ let(:file) { File.join("/tmp", rand.to_s) }
62
+ let(:cli) { Gyaazle::CLI.new(%W!--config #{file}!) }
63
+
64
+ it "set config file" do
65
+ cli.config.file.should == file
66
+ File.unlink(file) if File.exists?(file)
67
+ end
68
+ end
69
+
70
+ context "--capture" do
71
+ let(:cli) { Gyaazle::CLI.new(%W!--capture!) }
72
+ before do
73
+ cli.stub(:upload)
74
+ end
75
+
76
+ it "invoke #capture" do
77
+ cli.should_receive(:capture)
78
+ cli.run!
79
+ end
80
+ end
81
+ end
82
+
83
+ describe "#initialize_tokens" do
84
+ let(:token) { {:foo => 1, :bar => 44} }
85
+
86
+ it "save response to config file" do
87
+ cli.client.stub(:get_tokens).and_return(token)
88
+ cli.initialize_tokens("code")
89
+ cli.config.load.should == token
90
+ end
91
+ end
92
+
93
+ describe "#upload" do
94
+ let(:files) { %w!foo.jpg! }
95
+ let(:cli) { Gyaazle::CLI.new(files) }
96
+
97
+ before do
98
+ cli.stub(:check_credentials!)
99
+
100
+ @orig_stdout = $stdout
101
+ $stdout = File.new("/dev/null", "w")
102
+ end
103
+
104
+ after do
105
+ $stdout = @orig_stdout
106
+ end
107
+
108
+ it "invoke client.upload" do
109
+ cli.client.should_receive(:upload).with(files.first).and_return(:alternateLink => "dummy")
110
+ cli.client.should_receive(:set_permissions)
111
+ cli.upload
112
+ end
113
+ end
114
+ end
115
+
@@ -0,0 +1,143 @@
1
+ # -- coding: utf-8
2
+
3
+ require "spec_helper"
4
+
5
+ describe Gyaazle::Client do
6
+ let(:file) { File.expand_path("../tmp/dummy_conf.json", __FILE__) }
7
+ let(:config) { Gyaazle::Config.new(file) }
8
+ let(:client) { Gyaazle::Client.new(config) }
9
+ let(:folder_id) { "ididid" }
10
+
11
+ before do
12
+ config.save(:foo => 1)
13
+ end
14
+
15
+ after do
16
+ File.unlink(file) if File.exists?(file)
17
+ end
18
+
19
+ describe "#credentials" do
20
+ it "return hash with symbol key" do
21
+ client.credentials.class.should == Hash
22
+ client.credentials.keys.all?{|key| key.class == Symbol}.should be_true
23
+ end
24
+ end
25
+
26
+ describe "#folder_id" do
27
+ context "Gyaazle folder does exists" do
28
+ before do
29
+ config.update(:folder_id => folder_id)
30
+ client.stub(:get_file_info).and_return({
31
+ :id => folder_id,
32
+ :labels => {
33
+ :trashed => false
34
+ }
35
+ })
36
+ end
37
+
38
+ it "invoke #create_folder" do
39
+ client.should_not_receive(:create_folder)
40
+ client.folder_id.should == folder_id
41
+ end
42
+ end
43
+
44
+ context "Gyaazle folder does not exists" do
45
+ before do
46
+ config.update(:folder_id => nil)
47
+ end
48
+
49
+ it "invoke #create_folder" do
50
+ client.should_receive(:create_folder)
51
+ client.folder_id
52
+ end
53
+ end
54
+
55
+ context "Gyaazle folder is in trash" do
56
+ before do
57
+ config.update(:folder_id => folder_id)
58
+ client.stub(:get_file_info).and_return({
59
+ :id => folder_id,
60
+ :labels => {
61
+ :trashed => true
62
+ }
63
+ })
64
+ end
65
+
66
+ it "invoke #create_folder" do
67
+ client.should_receive(:create_folder)
68
+ client.folder_id
69
+ end
70
+ end
71
+ end
72
+
73
+ describe "#get_file_info" do
74
+ let(:response) { {:folder_id => folder_id, :labels => {:trashed => false}} }
75
+ before do
76
+ @requset = stub_request(:get, "https://www.googleapis.com/drive/v2/files/#{folder_id}").with(
77
+ :headers => {
78
+ "Authorization" => client.authorization_header_value
79
+ }
80
+ ).to_return(
81
+ :body => MultiJson.dump(response)
82
+ )
83
+ end
84
+
85
+ it "GET www.googleapis.com with folder_id" do
86
+ client.get_file_info(folder_id)
87
+ WebMock.should have_requested(:get, "https://www.googleapis.com/drive/v2/files/#{folder_id}")
88
+ end
89
+
90
+ it "return response as object" do
91
+ client.get_file_info(folder_id).should == response
92
+ end
93
+ end
94
+
95
+ describe "#create_folder" do
96
+ let(:new_folder_id) { "foobardir" }
97
+ let(:new_folder_name) { "Gyaazle" }
98
+
99
+ before do
100
+ @request = stub_request(:post, "https://www.googleapis.com/drive/v2/files").with(
101
+ :headers => {
102
+ "Authorization" => client.authorization_header_value
103
+ }
104
+ ).to_return(
105
+ :body => MultiJson.dump(:id => new_folder_id)
106
+ )
107
+ end
108
+
109
+ it "POST www.googleapis.com with new_folder_name" do
110
+ client.create_folder(new_folder_name)
111
+ WebMock.should have_requested(:post, "https://www.googleapis.com/drive/v2/files").with{|req| req.body[new_folder_name] }
112
+ end
113
+
114
+ it "config[:folder_id] should update" do
115
+ client.create_folder(new_folder_name)
116
+ config.load[:folder_id].should == new_folder_id
117
+ end
118
+
119
+ it "return new folder_id" do
120
+ client.create_folder(new_folder_name).should == new_folder_id
121
+ end
122
+ end
123
+
124
+ describe "#refresh_token!" do
125
+ let(:access_token) { "ACCESS_TOKEN" }
126
+ before do
127
+ @request = stub_request(:post, "https://accounts.google.com/o/oauth2/token").to_return(
128
+ :body => MultiJson.dump(:access_token => access_token)
129
+ )
130
+ end
131
+
132
+ it "POST accounts.google.com" do
133
+ client.refresh_token!
134
+ WebMock.should have_requested(:post, "https://accounts.google.com/o/oauth2/token")
135
+ end
136
+
137
+ it "update access token" do
138
+ client.refresh_token!
139
+ config.load[:access_token].should == access_token
140
+ end
141
+ end
142
+ end
143
+
@@ -0,0 +1,57 @@
1
+ # -- coding: utf-8
2
+
3
+ require "spec_helper"
4
+
5
+ describe Gyaazle::Config do
6
+ let(:file) { File.expand_path("../tmp/dummy_conf.json", __FILE__) }
7
+ let(:config) { Gyaazle::Config.new(file) }
8
+
9
+ after do
10
+ File.unlink(file) if File.exists?(file)
11
+ end
12
+
13
+ describe "#load" do
14
+ it "return nil if config file does not exists" do
15
+ File.unlink(file) if File.exists?(file)
16
+ config.load.should be_nil
17
+ end
18
+
19
+ it "return nil if config file invalid json" do
20
+ File.open(file, "w"){|f| f.write "invalid json here" }
21
+ config.load.should be_nil
22
+ end
23
+
24
+ it "return object with symbol keys" do
25
+ obj = {"foo" => 1, :bar => 2}
26
+ File.open(file, "w"){|f| f.write MultiJson.dump(obj) }
27
+ config.load.should == {:foo => 1, :bar => 2}
28
+ end
29
+ end
30
+
31
+ describe "#save" do
32
+ it "write string to config file" do
33
+ str = "str"
34
+ config.save(str)
35
+ File.read(file).should == str
36
+ end
37
+
38
+ it "dump object to config file" do
39
+ obj = {"foo" => "bar"}
40
+ config.save(obj)
41
+ File.read(file).should == MultiJson.dump(obj, :pretty => true)
42
+ end
43
+ end
44
+
45
+ describe "#update" do
46
+ before do
47
+ @obj = {:foo => 1, :bar => 2}
48
+ config.save(@obj)
49
+ end
50
+
51
+ it "save an object that merged" do
52
+ diff = {:foo => 66, :baz => 3}
53
+ config.update(diff)
54
+ config.load.should == {:foo => 66, :bar => 2, :baz => 3}
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,31 @@
1
+ # -- coding: utf-8
2
+
3
+ require "rubygems"
4
+ require "bundler/setup"
5
+
6
+ require "simplecov"
7
+ require 'coveralls'
8
+ Coveralls.wear!
9
+
10
+ if ENV["COVERAGE"]
11
+ # Coveralls overwrite NilFomatter
12
+ SimpleCov.formatter = SimpleCov::Formatter::HTMLFormatter
13
+ SimpleCov.start do
14
+ add_filter "/spec/"
15
+ end
16
+ end
17
+ Bundler.require :default, :test
18
+ require "rspec-expectations"
19
+ require "rspec/matchers/built_in/be"
20
+ require "webmock/rspec"
21
+
22
+ Dir["./spec/support/**/*.rb"].each{|file| require file }
23
+
24
+
25
+ require File.expand_path("../../lib/gyaazle.rb", __FILE__)
26
+
27
+ RSpec.configure do |config|
28
+ end
29
+ # -- coding: utf-8
30
+
31
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gyaazle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - uu59
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-05-24 00:00:00.000000000 Z
11
+ date: 2013-05-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httpclient
@@ -122,6 +122,48 @@ dependencies:
122
122
  - - '>='
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rspec
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: simplecov
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: webmock
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - '>='
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
125
167
  description: Gyazo like image uploader to Google Drive
126
168
  email:
127
169
  - k@uu59.org
@@ -131,6 +173,7 @@ extensions: []
131
173
  extra_rdoc_files: []
132
174
  files:
133
175
  - .gitignore
176
+ - .travis.yml
134
177
  - Gemfile
135
178
  - LICENSE.txt
136
179
  - README.md
@@ -142,6 +185,10 @@ files:
142
185
  - lib/gyaazle/client.rb
143
186
  - lib/gyaazle/config.rb
144
187
  - lib/gyaazle/version.rb
188
+ - spec/gyaazle_cli_spec.rb
189
+ - spec/gyaazle_client_spec.rb
190
+ - spec/gyaazle_config_spec.rb
191
+ - spec/spec_helper.rb
145
192
  homepage: https://github.com/uu59/gyaazle
146
193
  licenses:
147
194
  - MIT
@@ -166,5 +213,9 @@ rubygems_version: 2.0.2
166
213
  signing_key:
167
214
  specification_version: 4
168
215
  summary: Gyazo like image uploader to Google Drive
169
- test_files: []
216
+ test_files:
217
+ - spec/gyaazle_cli_spec.rb
218
+ - spec/gyaazle_client_spec.rb
219
+ - spec/gyaazle_config_spec.rb
220
+ - spec/spec_helper.rb
170
221
  has_rdoc: