sredder 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in sredder.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Matthew Robertson
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,22 @@
1
+ # Sredder
2
+
3
+ Sred the gnarl of tracking the wriketious deeds.
4
+
5
+ ## Installation
6
+
7
+ Installation via the command line:
8
+
9
+ $ gem install sredder, :git => 'git@github.com:CloudClinic/sredder.git'
10
+
11
+ ## Usage
12
+
13
+ TODO: Write usage instructions here
14
+
15
+ ## Contributing
16
+
17
+ 1. Fork it
18
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
19
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
20
+ 4. Push to the branch (`git push origin my-new-feature`)
21
+ 5. Create new Pull Request
22
+
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bin/sredder ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require 'sredder'
3
+
4
+ Sredder.run_command(ARGV)
data/keys.yml ADDED
@@ -0,0 +1,3 @@
1
+ oauth:
2
+ key: 119705a437503d196da9eeab675808a4
3
+ secret: 4216face9995a5d6
@@ -0,0 +1,76 @@
1
+ require 'optparse'
2
+ require 'optparse/time'
3
+
4
+ module Sredder
5
+ class ArgParser
6
+
7
+ def options
8
+ @options ||= defaults
9
+ end
10
+
11
+ def valid?
12
+ options[:date] &&
13
+ options[:title] &&
14
+ options[:message] &&
15
+ options[:hours]
16
+ end
17
+
18
+ # Print the usage and quit
19
+ def validate!
20
+ parse(['--help']) unless valid?
21
+ end
22
+
23
+ def parse(args)
24
+
25
+ OptionParser.new do |opts|
26
+
27
+ opts.banner = "Usage: sredder [options]"
28
+
29
+ opts.on("-t", "--title TITLE",
30
+ "The TITLE field to add to the wrike task") do |title|
31
+ options[:title] = title
32
+ end
33
+
34
+ opts.on("-m", "--message MESSAGE",
35
+ "The MESSAGE field to add to the wrike task") do |message|
36
+ options[:message] = message
37
+ end
38
+
39
+ opts.on("-h", "--hours N", Float, "The number of HOURS spent on the task") do |n|
40
+ options[:hours] = n
41
+ end
42
+
43
+ opts.on("-d", "--date DATE", Time, "The DATE (YY/MM/DD) on which the task was performed (default today)") do |date|
44
+ options[:date] = Util.time_stamp(date)
45
+ end
46
+
47
+ opts.on("-f", "--folder FOLDER", "The wrike FOLDER in which to place the task (default #{defaults[:folder]})") do |folder|
48
+ options[:folder] = folder
49
+ end
50
+
51
+ opts.on_tail("--help", "Show this message") do
52
+ puts opts
53
+ exit
54
+ end
55
+
56
+ opts.on_tail("--version", "Show version") do
57
+ puts Sredder::VERSION
58
+ exit
59
+ end
60
+
61
+ end.parse(args)
62
+
63
+ options
64
+ end
65
+
66
+ private
67
+
68
+ def defaults
69
+ {
70
+ :folder => 'Programming',
71
+ :date => Util.time_stamp
72
+ }
73
+ end
74
+
75
+ end
76
+ end
@@ -0,0 +1,33 @@
1
+ module Sredder
2
+
3
+ class Sredderc
4
+
5
+ attr_accessor :token, :secret
6
+ attr_reader :file_path
7
+
8
+ def initialize(path = '~/.sredderc')
9
+ @file_path = File.expand_path(path)
10
+ end
11
+
12
+ def exists?
13
+ File.exists?(file_path)
14
+ end
15
+
16
+ def load
17
+ if exists?
18
+ params = File.read(file_path).split
19
+ self.secret = params[0]
20
+ self.token = params[1]
21
+ end
22
+ end
23
+
24
+ def save
25
+ File.open(file_path, 'w') do |f|
26
+ f.puts(secret)
27
+ f.puts(token)
28
+ end
29
+ end
30
+
31
+ end
32
+
33
+ end
@@ -0,0 +1,19 @@
1
+ module Sredder
2
+
3
+ module Util
4
+
5
+ # Wrike expects this "yyyy-MM-dd'T'HH:mm.ss"
6
+ def self.time_stamp(time = Time.now)
7
+ time.strftime('%Y-%m-%d %R.00')
8
+ end
9
+
10
+ # just block execution until the user hits ENTER
11
+ def self.wait_for_input
12
+ puts 'Press ENTER to continue...'
13
+ sleep 4
14
+ gets
15
+ end
16
+
17
+ end
18
+
19
+ end
@@ -0,0 +1,3 @@
1
+ module Sredder
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,74 @@
1
+ require 'oauth'
2
+ require 'forwardable'
3
+
4
+ module Sredder
5
+
6
+ WRIKE_OAUTH_OPTIONS = {
7
+ :site => 'https://www.wrike.com',
8
+ :authorize_path => '/rest/auth/authorize',
9
+ :access_token_path => '/rest/auth/access_token',
10
+ :request_token_path => '/rest/auth/request_token'
11
+ }
12
+
13
+ class WrikeAuth
14
+
15
+ extend Forwardable
16
+
17
+ attr_accessor :sredderc
18
+ attr_writer :consumer
19
+
20
+ def_delegators :sredderc, :token, :token=, :secret, :secret=
21
+
22
+ def initialize(sredderc = Sredderc.new)
23
+ @sredderc = sredderc
24
+ @sredderc.load
25
+ end
26
+
27
+ def run_oauth_procedure
28
+ @request_token = consumer.get_request_token
29
+ puts 'Sredder is about to open your browser too complete the oauth protocol.'
30
+ puts 'Please return to the terminal after you athenticate with write.'
31
+
32
+ Util.wait_for_input
33
+
34
+ `open #{@request_token.authorize_url}`
35
+
36
+ Util.wait_for_input
37
+
38
+ store_tokens(@request_token.get_access_token)
39
+ end
40
+
41
+ def authorized?
42
+ !!token && !!secret
43
+ end
44
+
45
+ def oauth_access_token
46
+ if @access_token || authorized?
47
+ @access_token ||= OAuth::AccessToken.new(consumer, secret, token)
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+ def consumer
54
+ @consumer ||= OAuth::Consumer.new(key, oauth_secret, WRIKE_OAUTH_OPTIONS)
55
+ end
56
+
57
+ def key
58
+ '119705a437503d196da9eeab675808a4'
59
+ end
60
+
61
+ def oauth_secret
62
+ '4216face9995a5d6'
63
+ end
64
+
65
+ def store_tokens(access_token)
66
+ @access_token = access_token
67
+ self.secret = access_token.token
68
+ self.token = access_token.secret
69
+ sredderc.save
70
+ end
71
+
72
+ end
73
+
74
+ end
@@ -0,0 +1,32 @@
1
+ require 'json'
2
+
3
+ module Sredder
4
+
5
+ class WrikeRequest
6
+
7
+ HEADERS = {
8
+ 'Accept' => 'application/json'
9
+ }
10
+
11
+ attr_reader :access_token
12
+ attr_accessor :response
13
+
14
+ def initialize(access_token)
15
+ @access_token = access_token
16
+ end
17
+
18
+ def post(url, params)
19
+ @response = access_token.post(url, params, HEADERS)
20
+ end
21
+
22
+ def success?
23
+ response && response.is_a?(Net::HTTPSuccess)
24
+ end
25
+
26
+ def json
27
+ JSON.parse(@response.body)
28
+ end
29
+
30
+ end
31
+
32
+ end
data/lib/sredder.rb ADDED
@@ -0,0 +1,86 @@
1
+ require "sredder/arg_parser"
2
+ require "sredder/sredderc"
3
+ require "sredder/util"
4
+ require "sredder/version"
5
+ require "sredder/wrike_auth"
6
+ require "sredder/wrike_request"
7
+
8
+ module Sredder
9
+
10
+ def self.run_command(argv)
11
+ args_parser = ArgParser.new
12
+ args_parser.parse(argv)
13
+ args_parser.validate!
14
+ options = args_parser.options
15
+
16
+ access = get_access_token
17
+ folder_ids = get_folder(access, options[:folder])
18
+ task_id = create_task(access, options[:title], options[:message], folder_ids)
19
+ create_timelog(access, options[:date], task_id, options[:hours])
20
+ end
21
+
22
+ # gets an authenticated OAuth access token by loading the
23
+ # users .sredderc or prompting them to authenticate in their
24
+ # browser
25
+ def self.get_access_token
26
+ auth = WrikeAuth.new
27
+ auth.run_oauth_procedure unless auth.authorized?
28
+ auth.oauth_access_token
29
+ end
30
+
31
+ # Fetches the ID of a wrike folder by name. Currently this is
32
+ # limited to subfolders of "SRED Time Tracking/"
33
+ def self.get_folder(access, folder)
34
+ request = WrikeRequest.new(access)
35
+ request.post('/api/json/v2/wrike.folder.tree', {})
36
+ regex = Regexp.new(Regexp.escape("SRED Time Tracking/#{folder}"))
37
+ if request.success?
38
+ request.json["foldersTree"]["folders"].each_with_object([]) do |folder, arr|
39
+ arr << folder['id'].to_i if folder['fullPath'] =~ regex
40
+ end
41
+ end
42
+ end
43
+
44
+ # Create a Wrike task and return its ID
45
+ def self.create_task(access, title, description, parent_folder_ids)
46
+ request = WrikeRequest.new(access)
47
+ request.post('/api/json/v2/wrike.task.add', {
48
+ title: title,
49
+ description: description,
50
+ parents: parent_folder_ids
51
+ })
52
+ request.json["task"]["id"] if request.success?
53
+ end
54
+
55
+ # Attaches a timelog entry to a Wrike task
56
+ def self.create_timelog(access, date, task_id, hours, comment='')
57
+ request = WrikeRequest.new(access)
58
+ request.post('/api/json/v2/wrike.timelog.add', {
59
+ date: date,
60
+ taskId: task_id,
61
+ hours: hours,
62
+ comment: comment
63
+ })
64
+ end
65
+
66
+
67
+ # def self.run_oauth
68
+ # auth = WrikeAuth.new
69
+ # auth.run_oauth_procedure unless auth.authorized?
70
+
71
+
72
+ # parents = self.get_folder(auth.oauth_access_token)
73
+
74
+ # req = WrikeRequest.new(auth.oauth_access_token)
75
+ # puts req.post('/api/json/v2/wrike.task.add', {title: 'ermahgerd ruby', description: 'blah blah blah', parents: parents}).body
76
+
77
+ # req2 = WrikeRequest.new(auth.oauth_access_token)
78
+ # puts req2.post('/api/json/v2/wrike.timelog.add', {
79
+ # date: Util.time_stamp,
80
+ # taskId: req.json["task"]["id"],
81
+ # hours: 3.5,
82
+ # comment: 'lolz'
83
+ # })
84
+ # end
85
+
86
+ end
data/spec/.gitkeep ADDED
File without changes
@@ -0,0 +1,2 @@
1
+ secret
2
+ token
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.configure do |config|
4
+ config.before :all do
5
+ @orig_stderr = $stderr
6
+ @orig_stdout = $stdout
7
+
8
+ # redirect stderr and stdout to /dev/null
9
+ $stderr = File.new('/dev/null', 'w')
10
+ $stdout = File.new('/dev/null', 'w')
11
+ end
12
+ config.after :all do
13
+ $stderr = @orig_stderr
14
+ $stdout = @orig_stdout
15
+ @orig_stderr = nil
16
+ @orig_stdout = nil
17
+ end
18
+ end
@@ -0,0 +1,82 @@
1
+ require 'spec_helper'
2
+ require_relative '../../lib/sredder/arg_parser'
3
+ require_relative '../../lib/sredder/version'
4
+ require_relative '../../lib/sredder/util'
5
+
6
+ describe Sredder::ArgParser do
7
+
8
+ let(:parser) { Sredder::ArgParser.new }
9
+
10
+ describe 'parse' do
11
+
12
+ it 'parses the message' do
13
+ result = parser.parse(['-m', 'some message'])
14
+ result[:message].should == 'some message'
15
+
16
+ result = parser.parse(['--message', 'some message'])
17
+ result[:message].should == 'some message'
18
+ end
19
+
20
+ it 'parses hours as a double' do
21
+ result = parser.parse(['-h', '3.5'])
22
+ result[:hours].should == 3.5
23
+
24
+ result = parser.parse(['--hours', '3.5'])
25
+ result[:hours].should == 3.5
26
+ end
27
+
28
+ it 'parses the date as a time' do
29
+ time = Time.new(2012, 12, 19)
30
+ time_str = time.strftime('%y-%m-%d')
31
+
32
+ result = parser.parse(['-d', time_str])
33
+ result[:date].should == Sredder::Util.time_stamp(time)
34
+
35
+ result = parser.parse(['--date', time_str])
36
+ result[:date].should == Sredder::Util.time_stamp(time)
37
+ end
38
+
39
+ it 'it can print the help message' do
40
+ lambda { parser.parse(['--help']) }.should raise_error SystemExit
41
+ end
42
+
43
+ it 'it can print the version number' do
44
+ lambda { parser.parse(['--version']) }.should raise_error SystemExit
45
+ end
46
+
47
+ it 'sets defaults' do
48
+ result = parser.parse([])
49
+ result[:date].should_not be_nil
50
+ result[:folder].should == 'Programming'
51
+ end
52
+ end
53
+
54
+ describe '#valid?' do
55
+ it 'returns false by default' do
56
+ parser.parse([])
57
+ parser.valid?.should be_false
58
+ end
59
+
60
+ it 'returns true if all the options are set' do
61
+ parser.parse([
62
+ '-t', 'a title',
63
+ '-m', 'a message',
64
+ '-h', '3.5'
65
+ ])
66
+ parser.valid?.should be_true
67
+ end
68
+ end
69
+
70
+ describe '#validate!' do
71
+ it 'system exits if the options are not valid' do
72
+ parser.stub(:valid? => false)
73
+ lambda { parser.validate! }.should raise_error SystemExit
74
+ end
75
+
76
+ it 'is a no-op if the options are valid' do
77
+ parser.stub(:valid? => true)
78
+ lambda { parser.validate! }.should_not raise_error
79
+ end
80
+ end
81
+
82
+ end
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+ require_relative '../../lib/sredder/sredderc'
3
+
4
+ describe Sredder::Sredderc do
5
+
6
+ def sample_file
7
+ File.expand_path('spec/sample.sredderc')
8
+ end
9
+
10
+ describe 'initialization' do
11
+ it 'sets the default file_path' do
12
+ Sredder::Sredderc.new.file_path.should == File.expand_path('~/.sredderc')
13
+ end
14
+ end
15
+
16
+ describe '#exists?' do
17
+
18
+ it 'returns true if the file exists' do
19
+ Sredder::Sredderc.new(sample_file).exists?.should be_true
20
+ end
21
+
22
+ it 'returns false if the file does not exist' do
23
+ Sredder::Sredderc.new('/some/path').exists?.should be_false
24
+ end
25
+
26
+ end
27
+
28
+ describe '#load' do
29
+
30
+ it 'does not open the file if it does not exists' do
31
+ File.should_receive(:open).never
32
+ Sredder::Sredderc.new('/some/path').load
33
+ end
34
+
35
+ it 'loads the token and secret from the file if it exists' do
36
+ rc = Sredder::Sredderc.new(sample_file)
37
+ rc.load
38
+ rc.secret.should == 'secret'
39
+ rc.token.should == 'token'
40
+ end
41
+
42
+ end
43
+
44
+ describe '#save' do
45
+
46
+ it 'writes the data to the file' do
47
+ io_stub = stub('io')
48
+ io_stub.should_receive(:puts).with('secret')
49
+ io_stub.should_receive(:puts).with('token')
50
+ File.stub(:open).and_yield(io_stub)
51
+
52
+ rc = Sredder::Sredderc.new(sample_file)
53
+ rc.secret = 'secret'
54
+ rc.token = 'token'
55
+ rc.save
56
+ end
57
+
58
+ end
59
+
60
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+ require_relative '../../lib/sredder/util'
3
+
4
+ describe Sredder::Util do
5
+
6
+ describe '::timestamp' do
7
+
8
+ it 'returns the proper format' do
9
+ time = Time.new(2009, 3, 17, 12, 12)
10
+ Sredder::Util.time_stamp(time).should == "2009-03-17 12:12.00"
11
+ end
12
+
13
+ it 'it uses Time.now by default' do
14
+ time = Time.new(2009, 3, 17, 12, 12)
15
+ Time.stub(:now => time)
16
+ Sredder::Util.time_stamp.should == "2009-03-17 12:12.00"
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+ require_relative '../../lib/sredder/wrike_auth'
3
+ require_relative '../../lib/sredder/sredderc'
4
+
5
+ describe Sredder::WrikeAuth do
6
+
7
+ let(:auth) { Sredder::WrikeAuth.new }
8
+
9
+ it 'delegates token= to its sredderc' do
10
+ auth.token = 'banana'
11
+ auth.sredderc.token.should == 'banana'
12
+ end
13
+
14
+ it 'delegates secret= to its sredderc' do
15
+ auth.secret = 'banana'
16
+ auth.sredderc.secret.should == 'banana'
17
+ end
18
+
19
+ describe '#authorized?' do
20
+
21
+ it 'returns false by default' do
22
+ auth.authorized?.should be_false
23
+ end
24
+
25
+ it 'returns true if the token and secret attrs are set' do
26
+ auth.token = 'blah'
27
+ auth.secret = 'blah'
28
+ auth.authorized?.should be_true
29
+ end
30
+
31
+ end
32
+
33
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+ require_relative '../../lib/sredder/wrike_request'
3
+
4
+ describe Sredder::WrikeRequest do
5
+
6
+ describe 'initialization' do
7
+ it 'accepts the oauth access token as an arg' do
8
+ access_token = stub('access_token')
9
+ request = Sredder::WrikeRequest.new(access_token)
10
+ request.access_token.should == access_token
11
+ end
12
+ end
13
+
14
+ describe '#post' do
15
+ it 'passes parameter and headers to the put of the access token' do
16
+ access_token = stub('access_token')
17
+ access_token.should_receive(:post).
18
+ with('/do_stuff', {}, Sredder::WrikeRequest::HEADERS)
19
+ request = Sredder::WrikeRequest.new(access_token)
20
+ request.post('/do_stuff', {})
21
+ end
22
+
23
+ it 'it assigns the response' do
24
+ access_token = stub('access_token', :post => 'response')
25
+ request = Sredder::WrikeRequest.new(access_token)
26
+ request.post('/do_stuff', {})
27
+ request.response.should == 'response'
28
+ end
29
+ end
30
+
31
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+ require_relative '../lib/sredder'
3
+
4
+ describe Sredder do
5
+
6
+ it 'do it' do
7
+ # Sredder.run_oauth
8
+ end
9
+
10
+ end
data/sredder.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'sredder/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "sredder"
8
+ gem.version = Sredder::VERSION
9
+ gem.authors = ["Matthew Robertson"]
10
+ gem.email = ["matthew@cloudclinic.ca"]
11
+ gem.description = %q{Sred the gnarl of tracking the wriketious deeds.}
12
+
13
+ gem.summary = %q{Track yo time muthafucka}
14
+ gem.homepage = %q{https://github.com/CloudClinic/sredder}
15
+
16
+ gem.files = `git ls-files`.split($/)
17
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
18
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
+ gem.require_paths = ["lib"]
20
+
21
+ gem.add_dependency 'oauth'
22
+
23
+ gem.add_development_dependency 'rspec'
24
+
25
+
26
+ end
metadata ADDED
@@ -0,0 +1,111 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sredder
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.1
6
+ platform: ruby
7
+ authors:
8
+ - Matthew Robertson
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-12-19 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ version_requirements: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ none: false
21
+ name: oauth
22
+ type: :runtime
23
+ prerelease: false
24
+ requirement: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ! '>='
27
+ - !ruby/object:Gem::Version
28
+ version: '0'
29
+ none: false
30
+ - !ruby/object:Gem::Dependency
31
+ version_requirements: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ! '>='
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ none: false
37
+ name: rspec
38
+ type: :development
39
+ prerelease: false
40
+ requirement: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ none: false
46
+ description: Sred the gnarl of tracking the wriketious deeds.
47
+ email:
48
+ - matthew@cloudclinic.ca
49
+ executables:
50
+ - sredder
51
+ extensions: []
52
+ extra_rdoc_files: []
53
+ files:
54
+ - .gitignore
55
+ - Gemfile
56
+ - LICENSE.txt
57
+ - README.md
58
+ - Rakefile
59
+ - bin/sredder
60
+ - keys.yml
61
+ - lib/sredder.rb
62
+ - lib/sredder/arg_parser.rb
63
+ - lib/sredder/sredderc.rb
64
+ - lib/sredder/util.rb
65
+ - lib/sredder/version.rb
66
+ - lib/sredder/wrike_auth.rb
67
+ - lib/sredder/wrike_request.rb
68
+ - spec/.gitkeep
69
+ - spec/sample.sredderc
70
+ - spec/spec_helper.rb
71
+ - spec/sredder/arg_parser_spec.rb
72
+ - spec/sredder/sredderc_spec.rb
73
+ - spec/sredder/util_spec.rb
74
+ - spec/sredder/wrike_auth_spec.rb
75
+ - spec/sredder/wrike_request_spec.rb
76
+ - spec/sredder_spec.rb
77
+ - sredder.gemspec
78
+ homepage: https://github.com/CloudClinic/sredder
79
+ licenses: []
80
+ post_install_message:
81
+ rdoc_options: []
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ! '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ none: false
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ! '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ none: false
96
+ requirements: []
97
+ rubyforge_project:
98
+ rubygems_version: 1.8.24
99
+ signing_key:
100
+ specification_version: 3
101
+ summary: Track yo time muthafucka
102
+ test_files:
103
+ - spec/.gitkeep
104
+ - spec/sample.sredderc
105
+ - spec/spec_helper.rb
106
+ - spec/sredder/arg_parser_spec.rb
107
+ - spec/sredder/sredderc_spec.rb
108
+ - spec/sredder/util_spec.rb
109
+ - spec/sredder/wrike_auth_spec.rb
110
+ - spec/sredder/wrike_request_spec.rb
111
+ - spec/sredder_spec.rb