tp-cli 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ce630488e4d4188bb23c516089800c16085a8798
4
+ data.tar.gz: 02b1ae5362d5960b9ab778bdb367a2b2db13ff31
5
+ SHA512:
6
+ metadata.gz: 1bb00b7d38a2b603e3c9385e129b17e27ae522daeab40e8259cb9934da1e531a85531ba5f29152db16d18b047392d1a346d344b70aa7277f9ec3cef26e6a6b15
7
+ data.tar.gz: 8a72a3208ed0de576867a25142979e8ea24163296e3acefd9d369d5f6ac40cc217df9fe8045058cf064921a9670d338e9811123d7bd9d2004f4f39663f5fbaad
data/.envrc.example ADDED
@@ -0,0 +1 @@
1
+ ruby ./lib/tp_cli.rb
data/.gitignore ADDED
@@ -0,0 +1,41 @@
1
+ *.gem
2
+ *.rbc
3
+ /.config
4
+ /coverage/
5
+ /InstalledFiles
6
+ /pkg/
7
+ /spec/reports/
8
+ /spec/examples.txt
9
+ /test/tmp/
10
+ /test/version_tmp/
11
+ /tmp/
12
+
13
+ ## Specific to RubyMotion:
14
+ .dat*
15
+ .repl_history
16
+ build/
17
+
18
+ ## Documentation cache and generated files:
19
+ /.yardoc/
20
+ /_yardoc/
21
+ /doc/
22
+ /rdoc/
23
+
24
+ ## Environment normalisation:
25
+ /.bundle/
26
+ /vendor/bundle
27
+ /lib/bundler/man/
28
+ .envrc
29
+
30
+ # for a library or gem, you might want to ignore these files since the code is
31
+ # intended to run in multiple environments; otherwise, check them in:
32
+ Gemfile.lock
33
+ .ruby-version
34
+ .ruby-gemset
35
+ /corundum/
36
+
37
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
38
+ .rvmrc
39
+
40
+ config/timepulse.yml
41
+ .DS_Store
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem 'corundum'
4
+ gem 'bundler', '~> 1.10'
5
+ gem 'rake', '~> 10.0'
6
+ gem 'rspec'
7
+
8
+ gemspec :name => "tp-cli" #points to default 'tp-cli.gemspec'
data/Gemfile.lock ADDED
@@ -0,0 +1,72 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ tp-cli (0.0.1)
5
+ typhoeus (~> 0.8)
6
+ valise (~> 1.1)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ calibrate (0.0.1)
12
+ caliph (0.3.1)
13
+ corundum (0.6.0)
14
+ bundler
15
+ caliph (~> 0.3)
16
+ mattock (~> 0.9)
17
+ paint (~> 0.8.7)
18
+ rspec (>= 2.0)
19
+ simplecov (>= 0.5.4)
20
+ simplecov-json (>= 0.2)
21
+ diff-lcs (1.2.5)
22
+ docile (1.1.5)
23
+ ethon (0.8.0)
24
+ ffi (>= 1.3.0)
25
+ ffi (1.9.10)
26
+ json (1.8.3)
27
+ mattock (0.10.0)
28
+ calibrate (~> 0.0.1)
29
+ caliph (~> 0.3.1)
30
+ rake (~> 10.0)
31
+ tilt (> 0)
32
+ valise (~> 1.1.1)
33
+ paint (0.8.7)
34
+ rake (10.4.2)
35
+ rspec (3.3.0)
36
+ rspec-core (~> 3.3.0)
37
+ rspec-expectations (~> 3.3.0)
38
+ rspec-mocks (~> 3.3.0)
39
+ rspec-core (3.3.2)
40
+ rspec-support (~> 3.3.0)
41
+ rspec-expectations (3.3.1)
42
+ diff-lcs (>= 1.2.0, < 2.0)
43
+ rspec-support (~> 3.3.0)
44
+ rspec-mocks (3.3.2)
45
+ diff-lcs (>= 1.2.0, < 2.0)
46
+ rspec-support (~> 3.3.0)
47
+ rspec-support (3.3.0)
48
+ simplecov (0.10.0)
49
+ docile (~> 1.1.0)
50
+ json (~> 1.8)
51
+ simplecov-html (~> 0.10.0)
52
+ simplecov-html (0.10.0)
53
+ simplecov-json (0.2)
54
+ json
55
+ simplecov
56
+ tilt (2.0.1)
57
+ typhoeus (0.8.0)
58
+ ethon (>= 0.8.0)
59
+ valise (1.1.4)
60
+
61
+ PLATFORMS
62
+ ruby
63
+
64
+ DEPENDENCIES
65
+ bundler (~> 1.10)
66
+ corundum
67
+ rake (~> 10.0)
68
+ rspec
69
+ tp-cli!
70
+
71
+ BUNDLED WITH
72
+ 1.10.6
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Evan Dorn, Anne Vetto
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,35 @@
1
+ # tp-cli
2
+ CLI tool for submitting activity information to [TimePulse](https://github.com/TimePulse/TimePulse)
3
+
4
+ ###User Configuration
5
+ Tp-cli relies on YAML files in user and project directories for information about how and where to send information. For user-specific information, we recommend you place a `timepulse.yml` in one of these directories:
6
+
7
+ * ~/.timepulse
8
+ * ~/
9
+ * /usr/share/timepulse
10
+ * /etc/timepulse
11
+
12
+ A user `timepulse.yml` should have the following information:
13
+
14
+ ```
15
+ timepulse_url: http://[www.timepulse.io]/activities.json
16
+ login: [yourname@emailaddress.com]
17
+ authorization: [insert your API key here]
18
+ ```
19
+
20
+ Your implementation of timepulse may have a different website, but the url should still end with `/activities.json`. You can generate a new API key on your user profile on TimePulse.
21
+
22
+ Individual projects that are billed in TimePulse should also have a `timepulse.yml` file in their root directory, or in a config directory off of root. A project `timepulse.yml` should have the following information:
23
+
24
+ ```
25
+ project_id: [2]
26
+ directory_name: [Main Project Directory]
27
+ ```
28
+
29
+ The `project_id` is the number used by TimePulse to identify the project billed for its work on a particular project. The `directory_name` line is optional. If you want to specify a more descriptive name for the directory being tracked by `cwd` annotations, you can uncomment this line and specify a new name. Otherwise, the message will include the current working directory.
30
+
31
+ ### Sending notes
32
+ The command `tp-cli note "Note message"` can be used to annotate your work without having to visit the TimePulse web interface. If you are currently logged into a project, the note will automatically be added to your current work unit. Otherwise, it will be saved so you can use it to catch unbilled time.
33
+
34
+ ### Using direnv and cwd
35
+ The `tp-cli cwd` command is designed to be used in conjunction with [direnv](http://direnv.net/). By adding `tp-cli cwd` to a project directory's `.envrc` file, you will automatically send an annotation to TimePulse. You can use these notes to ensure that you don't lose any time working on a project.
data/Rakefile ADDED
@@ -0,0 +1,82 @@
1
+ # vim: set ft=ruby :
2
+ require 'corundum/tasklibs'
3
+
4
+ # This Rakefile makes use of the Corundum tasklibs to parameterize lots and
5
+ # lots of tasks to build your gem. Most of this is (minimal) boilerplate, but
6
+ # there are some places where you can configure exactly how the tasks should
7
+ # work.
8
+ #
9
+ # If you haven't seen the pattern before, simply instantiating the tasklib
10
+ # class (i.e. SomeTasklib.new) is enough to create all the tasks it's
11
+ # responsible for. If you do need to configure a tasklib, you can give ::new a
12
+ # block which will receive the tasklib to configure. c.f. QuestionableContent
13
+ # for an example.
14
+ #
15
+ # (Further docs for all the Corundum tasklibs will be coming to an Internet
16
+ # near you real soon now.)
17
+ module Corundum
18
+ Corundum::register_project(__FILE__)
19
+
20
+ # The Core tasklib coordinates the other tasks. Generally it doesn't need any
21
+ # configuration.
22
+ core = Core.new
23
+
24
+ core.in_namespace do
25
+ # The GemspecFiles tasklib is responsible for checking that all the files
26
+ # necessary for your gem are listed in the Gemfile. Usually you don't need
27
+ # to add any configuration. Of note is the "extra_files" configuration - a
28
+ # list of files that need to be included but that Corundum might not be
29
+ # able to detect on its own.
30
+ GemspecFiles.new(core)
31
+
32
+ # QuestionableContent searches codefiles for words (especially in comments)
33
+ # that you might not want going out into the world. Note that QC is added 4
34
+ # times by default with different types of text.
35
+ #
36
+ # If QC is wrong about something (e.g. there's a completely legitimate
37
+ # reason that 'p' appears on a line) You can tag the line with an '#ok'
38
+ # comment to have QC ignore it.
39
+
40
+ # This default checks for unacceptable language (of both the profanity
41
+ # and -ism varieties) before release, as well as debugging statements
42
+ # like debugger, byebug, puts, p, etc. accidentally left in the code.
43
+ #
44
+ # Also available: 'unfinished': TODO and XXX
45
+ ["debug", "profanity", "ableism", "racism"].each do |type|
46
+ QuestionableContent.new(core) do |content|
47
+ content.type = type
48
+ end
49
+ end
50
+
51
+ # Corundum won't let you release a gem where any tests fail. By default, it
52
+ # assumes RSpec is used to test the project (alternative implementations
53
+ # are anxiously encouraged!)
54
+ rspec = RSpec.new(core)
55
+
56
+ # To make sure that tests don't just pass because they're incomplete,
57
+ # Corundum also requires a coverage threshold, which we measure with
58
+ # Simplecov. Coverage also figures into how we determine that files should
59
+ # be in the gemspec (covered files should be included, and included files
60
+ # should be covered)
61
+ SimpleCov.new(core, rspec) do |cov|
62
+ cov.threshold = 85
63
+ end
64
+
65
+ # The tasks to actually take code + gemspec and package into a gem. All its
66
+ # configuration should be determined by the gemspec itself.
67
+ gem = GemBuilding.new(core)
68
+
69
+ # Tasks for uploading gems to rubygems.com - called GemCutter for
70
+ # historical reasons.
71
+ GemCutter.new(core,gem)
72
+
73
+ # We require that the code for a gem be pushed before releasing, and tag
74
+ # the branch with the version of the gem automatically. Corundum assumes
75
+ # Git for version control - alternatives encouraged.
76
+ Git.new(core) do |vc|
77
+ vc.branch = "master"
78
+ end
79
+ end
80
+ end
81
+
82
+ task :default => [:release]
data/bin/tp-cli ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ require 'tp_cli'
3
+
4
+ track = TpCommandLine::ActivityTrack.new(ARGV)
5
+
6
+ track.send_to_timepulse
data/lib/config.rb ADDED
@@ -0,0 +1,33 @@
1
+ require 'valise'
2
+ require 'yaml'
3
+
4
+ module TpCommandLine
5
+ class Config
6
+ def file_set
7
+ Valise::Set.define do
8
+ ro "."
9
+ ro "config/"
10
+ ro "~/.timepulse"
11
+ ro "~/"
12
+ ro "/usr/share/timepulse"
13
+ ro "/etc/timepulse"
14
+
15
+ handle "*.yml", :yaml, :hash_merge
16
+ handle "*.yaml", :yaml, :hash_merge
17
+ end
18
+ end
19
+
20
+ def load_config
21
+ @config_hash = file_set.contents("timepulse.yml")
22
+
23
+ missing_fields = ['timepulse_url', 'project_id', 'login',
24
+ 'authorization'].find_all {|k| !@config_hash.keys.include? k}
25
+ unless missing_fields.empty?
26
+ puts "Missing necessary parameter/s: #{missing_fields.join(", ")}"
27
+ exit
28
+ end
29
+
30
+ return @config_hash
31
+ end
32
+ end
33
+ end
data/lib/tp_cli.rb ADDED
@@ -0,0 +1,80 @@
1
+ require 'typhoeus'
2
+ require 'config'
3
+ require 'json'
4
+
5
+ module TpCommandLine
6
+ class ActivityTrack
7
+
8
+ attr_reader :request
9
+
10
+ def initialize(args)
11
+ @config_data = TpCommandLine::Config.new.load_config
12
+ description = determine_description(args)
13
+ @server_url = @config_data["timepulse_url"]
14
+ @request_options = {
15
+ method: :post,
16
+ body: JSON.dump({
17
+ activity: {
18
+ description: description,
19
+ project_id: @config_data['project_id'],
20
+ source: "API",
21
+ time: Time.now.utc
22
+ }
23
+ }),
24
+ headers: {
25
+ login: @config_data['login'],
26
+ Authorization: @config_data['authorization'],
27
+ 'Accept-Encoding' => 'application/json',
28
+ 'Content-Type' => 'application/json'
29
+ }
30
+ }
31
+ end
32
+
33
+ #determine user activity and user feedback or what to POST
34
+ def determine_description(args)
35
+ if args[0] == "note" && args[1].is_a?(String)
36
+ args[1]
37
+ elsif args[0] == "cwd"
38
+ directory = @config_data["directory_name"] || Dir.getwd
39
+ "Changed working directory to #{directory}"
40
+ else
41
+ puts "\nPlease specify action: 'tp-cli note' or 'tp-cli cwd'"
42
+ exit
43
+ end
44
+ end
45
+
46
+ def send_to_timepulse
47
+ @request = Typhoeus::Request.new(@server_url, @request_options)
48
+
49
+ begin
50
+ @request.run
51
+ rescue StandardError => err
52
+ puts "\n Please check your internet connection and that the project site is not currently offline."
53
+ end
54
+
55
+ handle_response(@request.response)
56
+ end
57
+
58
+ def handle_response(response)
59
+ case response.response_code
60
+ when 201
61
+ puts "\nThe activity was sent to TimePulse."
62
+ when 401
63
+ puts "\nThe TimePulse server was unable to authorize you. Check the API token in your timepulse.yml files."
64
+ when 422
65
+ puts "\nThere was an error saving to TimePulse. Please check the information in your timepulse.yml files."
66
+ if response.body
67
+ puts "Rails Errors:"
68
+ errors = JSON.parse(response.body)
69
+ errors.each { |k, v| v.each { |vsub| puts "#{k} #{vsub}"}}
70
+ end
71
+ when 500
72
+ puts "\nThere was an internal server error while handling your request. Tell your TimePulse administrator to check their logs."
73
+ when 0
74
+ puts "\nPlease check your internet connection and that the project site is not currently offline.\nCurl Error: #{response.return_code}"
75
+ else
76
+ puts "\nTimePulse returned an unexpected response: #{response.response_code}"
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,7 @@
1
+ require 'tp_cli'
2
+
3
+ RSpec.configure do |config|
4
+ config.before :each do
5
+ Typhoeus::Expectation.clear
6
+ end
7
+ end
@@ -0,0 +1,254 @@
1
+ require 'spec_helper'
2
+
3
+ describe TpCommandLine::ActivityTrack do
4
+
5
+ describe '#determine_description' do
6
+
7
+ let :activity_track do
8
+ TpCommandLine::ActivityTrack.new(args)
9
+ end
10
+
11
+ context "when given no arguments" do
12
+ let :args do
13
+ []
14
+ end
15
+
16
+ it "prints a message and exits" do
17
+ expect do
18
+ expect do
19
+ activity_track.determine_description(args)
20
+ end.to output("\nPlease specify action: 'tp-cli note' or 'tp-cli cwd'\n").to_stdout
21
+ end.to raise_error(SystemExit)
22
+ end
23
+ end
24
+
25
+ context "when given the 'note' argument" do
26
+ let :args do
27
+ ["note", "Foo"]
28
+ end
29
+
30
+ it "returns second argument" do
31
+ expect(activity_track.determine_description(args)).
32
+ to eq("Foo")
33
+ end
34
+ end
35
+
36
+ context "when given the 'cwd' argument" do
37
+ let :args do
38
+ ["cwd"]
39
+ end
40
+
41
+ context "with no working_directory in config" do
42
+ it "sends the current working directory to the server" do
43
+ allow(Dir).to receive(:getwd).and_return("mock_directory")
44
+
45
+ expect(activity_track.determine_description(args)).
46
+ to eq("Changed working directory to mock_directory")
47
+ end
48
+ end
49
+
50
+ context "with no working_directory in config" do
51
+
52
+ it "sends the config message to the server" do
53
+ activity_track.instance_variable_set(:@config_data,
54
+ {"directory_name" => "mock_directory"}
55
+ )
56
+
57
+ expect(activity_track.determine_description(args)).
58
+ to eq("Changed working directory to mock_directory")
59
+ end
60
+ end
61
+
62
+ end
63
+
64
+ context "when given other arguments" do
65
+ let :args do
66
+ ["Bar", "Foo", "OMG", "SO", "MANY", "ARGS"]
67
+ end
68
+
69
+ it "prints a message and exits" do
70
+ expect do
71
+ expect do
72
+ activity_track.determine_description(args)
73
+ end.to output("\nPlease specify action: 'tp-cli note' or 'tp-cli cwd'\n").to_stdout
74
+ end.to raise_error(SystemExit)
75
+ end
76
+ end
77
+ end
78
+
79
+ describe "#send_to_timepulse" do
80
+ let :config_data do
81
+ {
82
+ "timepulse_url" => "www.timepulse.io/activities",
83
+ "project_id" => "2",
84
+ "login" => "Logan Loggins",
85
+ "authorization" => "AuthorizationToTheDangerZone"
86
+ }
87
+ end
88
+
89
+ let :activity_track do
90
+ TpCommandLine::ActivityTrack.new(["note", "Everybody cut footloose!"])
91
+ end
92
+
93
+ before :each do
94
+ config_double = double("TpCommandLine::Config")
95
+ allow(config_double).to receive(:load_config).and_return(config_data)
96
+ allow(TpCommandLine::Config).to receive(:new).and_return(config_double)
97
+
98
+ Typhoeus.stub(/timepulse.io/).and_return(response)
99
+
100
+ @original_stdout = $stdout
101
+ $stdout = File.open(File::NULL, "w")
102
+ end
103
+
104
+ after :each do
105
+ $stdout = @original_stdout
106
+ end
107
+
108
+ context "with valid data" do
109
+ let :response do
110
+ Typhoeus::Response.new(response_code: 201)
111
+ end
112
+
113
+ it "assigns the correct url to the request" do
114
+ activity_track.send_to_timepulse
115
+
116
+ expect(activity_track.request.base_url).to eq("www.timepulse.io/activities")
117
+ end
118
+
119
+ it "assigns the correct options to the request" do
120
+ activity_track.send_to_timepulse
121
+ options = activity_track.request.original_options
122
+ activity_params = JSON.parse(options[:body])
123
+ headers = options[:headers]
124
+
125
+ expect(options[:method]).to eq(:post)
126
+ expect(activity_params["activity"]["description"]).to eq("Everybody cut footloose!")
127
+ expect(activity_params["activity"]["project_id"]).to eq("2")
128
+ expect(activity_params["activity"]["source"]).to eq("API")
129
+ expect(headers[:login]).to eq("Logan Loggins")
130
+ expect(headers[:Authorization]).to eq("AuthorizationToTheDangerZone")
131
+ end
132
+
133
+ it "receives a successful response" do
134
+ activity_track.send_to_timepulse
135
+ expect(activity_track.request.response).not_to be_nil
136
+ expect(activity_track.request.response.response_code).to eq(201)
137
+ end
138
+
139
+ it "calls handle_response" do
140
+ expect(activity_track).to receive(:handle_response).and_call_original
141
+ activity_track.send_to_timepulse
142
+ end
143
+ end
144
+ end
145
+
146
+ describe "#handle_response" do
147
+ let :activity_track do
148
+ TpCommandLine::ActivityTrack.new(['cwd'])
149
+ end
150
+
151
+ context "with a 201 response code (success)" do
152
+ let :response do
153
+ dbl = double
154
+ allow(dbl).to receive(:response_code).and_return(201)
155
+ dbl
156
+ end
157
+
158
+ it "prints a successful response" do
159
+ expect do
160
+ activity_track.handle_response(response)
161
+ end.to output("\nThe activity was sent to TimePulse.\n").to_stdout
162
+ end
163
+ end
164
+
165
+ context "with a 401 response code (unauthorized)" do
166
+ let :response do
167
+ dbl = double
168
+ allow(dbl).to receive(:response_code).and_return(401)
169
+ dbl
170
+ end
171
+
172
+ it "prints a notification of error" do
173
+ expect do
174
+ activity_track.handle_response(response)
175
+ end.to output("\nThe TimePulse server was unable to authorize you. Check the API token in your timepulse.yml files.\n").to_stdout
176
+ end
177
+ end
178
+
179
+ context "with a 422 response code (could not save)" do
180
+ let :response do
181
+ dbl = double
182
+ allow(dbl).to receive(:response_code).and_return(422)
183
+ allow(dbl).to receive(:body).and_return(body)
184
+ dbl
185
+ end
186
+
187
+ context "and no errors in body" do
188
+ let :body do
189
+ nil
190
+ end
191
+
192
+ it "prints a notification of error" do
193
+ expect do
194
+ activity_track.handle_response(response)
195
+ end.to output("\nThere was an error saving to TimePulse. Please check the information in your timepulse.yml files.\n").to_stdout
196
+ end
197
+ end
198
+
199
+ context "with errors in body" do
200
+ let :body do
201
+ '{"field": ["error message"]}'
202
+ end
203
+ it "prints a notification of error" do
204
+ expect do
205
+ activity_track.handle_response(response)
206
+ end.to output("\nThere was an error saving to TimePulse. Please check the information in your timepulse.yml files.\nRails Errors:\nfield error message\n").to_stdout
207
+ end
208
+ end
209
+ end
210
+
211
+ context "with a 500 response code (internal server error)" do
212
+ let :response do
213
+ dbl = double
214
+ allow(dbl).to receive(:response_code).and_return(500)
215
+ dbl
216
+ end
217
+
218
+ it "prints a notification of error" do
219
+ expect do
220
+ activity_track.handle_response(response)
221
+ end.to output("\nThere was an internal server error while handling your request. Tell your TimePulse administrator to check their logs.\n").to_stdout
222
+ end
223
+ end
224
+
225
+ context "with a 0 response code (server connectivity issues)" do
226
+ let :response do
227
+ dbl = double
228
+ allow(dbl).to receive(:response_code).and_return(0)
229
+ allow(dbl).to receive(:return_code).and_return("foo")
230
+ dbl
231
+ end
232
+
233
+ it "prints a notification of error" do
234
+ expect do
235
+ activity_track.handle_response(response)
236
+ end.to output("\nPlease check your internet connection and that the project site is not currently offline.\nCurl Error: foo\n").to_stdout
237
+ end
238
+ end
239
+
240
+ context "with an unexpected response code" do
241
+ let :response do
242
+ dbl = double
243
+ allow(dbl).to receive(:response_code).and_return(418)
244
+ dbl
245
+ end
246
+
247
+ it "prints a notification of error" do
248
+ expect do
249
+ activity_track.handle_response(response)
250
+ end.to output("\nTimePulse returned an unexpected response: 418\n").to_stdout
251
+ end
252
+ end
253
+ end
254
+ end
data/tp-cli.gemspec ADDED
@@ -0,0 +1,41 @@
1
+ Gem::Specification.new do |spec|
2
+ spec.name = "tp-cli"
3
+ #{MAJOR: incompatible}.{MINOR added feature}.{PATCH bugfix}-{LABEL}
4
+ spec.version = "0.0.1"
5
+ author_list = {
6
+ "Anne Vetto" => "anne@lrdesign.com",
7
+ "Tony Delgado-Willis" => "tonydw@lrdesign.com",
8
+ "Evan Dorn" => "evan@lrdesign.com"
9
+ }
10
+ spec.authors = author_list.keys
11
+ spec.email = spec.authors.map {|name| author_list[name]}
12
+ spec.summary = "Timepulse Command Line Interface"
13
+ spec.description = <<-EndDescription
14
+ CLI tool for submitting activity information to Timepulse
15
+ EndDescription
16
+
17
+ spec.rubyforge_project= spec.name.downcase
18
+ spec.homepage = "https://github.com/TimePulse/tp-cli"
19
+ spec.required_rubygems_version = Gem::Requirement.new(">= 0") if spec.respond_to? :required_rubygems_version=
20
+
21
+ # Do this: y$@"
22
+ # !!find lib bin doc spec spec_help -not -regex '.*\.sw.' -type f 2>/dev/null
23
+ spec.files = %w[ .envrc.example .gitignore Gemfile Gemfile.lock LICENSE.txt README.md Rakefile bin/tp-cli lib/tp_cli.rb lib/config.rb spec/spec_helper.rb spec/tp_cli_spec.rb tp-cli.gemspec]
24
+
25
+ # spec.test_file = "spec_help/gem_test_suite.rb"
26
+ spec.licenses = ["MIT"]
27
+ spec.require_paths = %w[lib/]
28
+ spec.rubygems_version = "1.3.5"
29
+
30
+ spec.has_rdoc = true
31
+ spec.extra_rdoc_files = Dir.glob("doc/**/*")
32
+ spec.rdoc_options = %w{--inline-source }
33
+ spec.rdoc_options += %w{--main doc/README }
34
+ spec.rdoc_options += ["--title", "#{spec.name}-#{spec.version} Documentation"]
35
+
36
+ #spec.add_dependency("", "> 0")
37
+ spec.add_dependency 'typhoeus', '~> 0.8'
38
+ spec.add_dependency 'valise', '~> 1.1'
39
+
40
+ #spec.post_install_message = "Thanks for installing my gem!"
41
+ end
metadata ADDED
@@ -0,0 +1,95 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tp-cli
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Anne Vetto
8
+ - Tony Delgado-Willis
9
+ - Evan Dorn
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2015-11-19 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: typhoeus
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: '0.8'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: '0.8'
29
+ - !ruby/object:Gem::Dependency
30
+ name: valise
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: '1.1'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '1.1'
43
+ description: |2
44
+ CLI tool for submitting activity information to Timepulse
45
+ email:
46
+ - anne@lrdesign.com
47
+ - tonydw@lrdesign.com
48
+ - evan@lrdesign.com
49
+ executables: []
50
+ extensions: []
51
+ extra_rdoc_files: []
52
+ files:
53
+ - ".envrc.example"
54
+ - ".gitignore"
55
+ - Gemfile
56
+ - Gemfile.lock
57
+ - LICENSE.txt
58
+ - README.md
59
+ - Rakefile
60
+ - bin/tp-cli
61
+ - lib/config.rb
62
+ - lib/tp_cli.rb
63
+ - spec/spec_helper.rb
64
+ - spec/tp_cli_spec.rb
65
+ - tp-cli.gemspec
66
+ homepage: https://github.com/TimePulse/tp-cli
67
+ licenses:
68
+ - MIT
69
+ metadata: {}
70
+ post_install_message:
71
+ rdoc_options:
72
+ - "--inline-source"
73
+ - "--main"
74
+ - doc/README
75
+ - "--title"
76
+ - tp-cli-0.0.1 Documentation
77
+ require_paths:
78
+ - lib/
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ requirements: []
90
+ rubyforge_project: tp-cli
91
+ rubygems_version: 2.4.8
92
+ signing_key:
93
+ specification_version: 4
94
+ summary: Timepulse Command Line Interface
95
+ test_files: []