mite.cmd 0.1.10

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,4 @@
1
+ ---
2
+ :minor: 0
3
+ :patch: 3
4
+ :major: 0
@@ -0,0 +1,105 @@
1
+ $:.unshift(File.dirname(__FILE__))
2
+
3
+ require 'rubygems'
4
+ require 'active_support'
5
+ require 'active_resource'
6
+
7
+ # The official ruby library for interacting with the RESTful API of mite,
8
+ # a sleek time tracking webapp.
9
+
10
+ module Mite
11
+
12
+ class << self
13
+ attr_accessor :email, :password, :host_format, :domain_format, :protocol, :port
14
+ attr_reader :account, :key
15
+
16
+ # Sets the account name, and updates all resources with the new domain.
17
+ def account=(name)
18
+ resources.each do |klass|
19
+ klass.site = klass.site_format % (host_format % [protocol, domain_format % name, ":#{port}"])
20
+ end
21
+ @account = name
22
+ end
23
+
24
+ # Sets up basic authentication credentials for all resources.
25
+ def authenticate(user, password)
26
+ resources.each do |klass|
27
+ klass.user = user
28
+ klass.password = password
29
+ end
30
+ @user = user
31
+ @password = password
32
+ true
33
+ end
34
+
35
+ # Sets the mite.api key for all resources.
36
+ def key=(value)
37
+ resources.each do |klass|
38
+ klass.headers['X-MiteApiKey'] = value
39
+ end
40
+ @key = value
41
+ end
42
+
43
+ def resources
44
+ @resources ||= []
45
+ end
46
+ end
47
+
48
+ self.host_format = '%s://%s%s'
49
+ self.domain_format = '%s.mite.yo.lk'
50
+ self.protocol = 'http'
51
+ self.port = ''
52
+
53
+ class Base < ActiveResource::Base
54
+ class << self
55
+
56
+ def inherited(base)
57
+ Mite.resources << base
58
+ class << base
59
+ attr_accessor :site_format
60
+ end
61
+ base.site_format = '%s'
62
+ base.timeout = 20
63
+ super
64
+ end
65
+
66
+ # Common shortcuts known from ActiveRecord
67
+ def all(options={})
68
+ find_every(options)
69
+ end
70
+
71
+ def first(options={})
72
+ find_every(options).first
73
+ end
74
+
75
+ def last(options={})
76
+ find_every(options).last
77
+ end
78
+
79
+ # Undo destroy action on the resource with the ID in the +id+ parameter.
80
+ def undo_destroy(id)
81
+ returning(self.new(:id => id)) { |res| res.undo_destroy }
82
+ end
83
+ end
84
+
85
+ # Undo destroy action.
86
+ def undo_destroy
87
+ path = element_path(prefix_options).sub(/\.([\w]+)/, '/undo_delete.\1')
88
+
89
+ returning connection.post(path, "", self.class.headers) do |response|
90
+ load_attributes_from_response(response)
91
+ end
92
+ end
93
+
94
+ end
95
+
96
+ class Error < StandardError; end
97
+ end
98
+
99
+ require 'mite/customer'
100
+ require 'mite/project'
101
+ require 'mite/service'
102
+ require 'mite/time_entry'
103
+ require 'mite/time_entry_group'
104
+ require 'mite/tracker'
105
+ require 'mite/user'
@@ -0,0 +1,9 @@
1
+ class Mite::Customer < Mite::Base
2
+ def time_entries(options = {})
3
+ TimeEntry.find(:all, :params => options.update(:customer_id => id))
4
+ end
5
+
6
+ def projects(options = {})
7
+ Project.find(:all, :params => options.update(:customer_id => id))
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ class Mite::Project < Mite::Base
2
+
3
+ def time_entries(options = {})
4
+ TimeEntry.find(:all, :params => options.update(:project_id => id))
5
+ end
6
+
7
+ def customer
8
+ @customer ||= Customer.find(customer_id) unless customer_id.blank?
9
+ end
10
+
11
+ def customer=(customer)
12
+ self.customer_id = customer ? customer.id : nil
13
+ @customer = customer
14
+ end
15
+
16
+ end
@@ -0,0 +1,7 @@
1
+ class Mite::Service < Mite::Base
2
+
3
+ def time_entries(options = {})
4
+ TimeEntry.find(:all, :params => options.update(:service_id => id))
5
+ end
6
+
7
+ end
@@ -0,0 +1,54 @@
1
+ class Mite::TimeEntry < Mite::Base
2
+
3
+ def service
4
+ @service ||= Service.find(service_id) unless service_id.blank?
5
+ end
6
+
7
+ def service=(service)
8
+ self.service_id = service ? service.id : nil
9
+ @service = service
10
+ end
11
+
12
+ def project
13
+ @project ||= Project.find(project_id) unless project_id.blank?
14
+ end
15
+
16
+ def project=(project)
17
+ self.project_id = project ? project.id : nil
18
+ @project = project
19
+ end
20
+
21
+ def customer
22
+ @customer ||= begin
23
+ p = project
24
+ p.customer unless p.blank?
25
+ end
26
+ end
27
+
28
+ def tracking?
29
+ !!attributes["tracker"]
30
+ end
31
+
32
+ def start_tracker
33
+ attributes["tracker"] = Mite::Tracker.start(id) || nil
34
+ end
35
+
36
+ def stop_tracker
37
+ Mite::Tracker.stop if tracking?
38
+ end
39
+
40
+ def load(attr)
41
+ super(attr)
42
+ if attributes["tracking"]
43
+ attributes["tracker"] = Mite::Tracker.new.load(attributes.delete("tracking").attributes)
44
+ end
45
+ self
46
+ end
47
+
48
+ class << self
49
+ def find_every(options={})
50
+ return super(options) if !options[:params] || !options[:params][:group_by]
51
+ TimeEntryGroup.all(options)
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,36 @@
1
+ class Mite::TimeEntryGroup < Mite::Base
2
+ self.collection_name = "time_entries"
3
+
4
+ attr_accessor :time_entries_params
5
+
6
+ class << self
7
+ def find_every(options={})
8
+ return TimeEntry.all(options) if !options[:params] || !options[:params][:group_by]
9
+
10
+ returning super(options) do |records|
11
+ records.each do |record|
12
+ if record.attributes["time_entries_params"]
13
+ record.time_entries_params = record.attributes.delete("time_entries_params").attributes.stringify_keys
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ def time_entries(options={})
21
+ return [] unless time_entries_params.is_a?(Hash)
22
+
23
+ empty_result = false
24
+
25
+ options[:params] ||= {}
26
+ options[:params].stringify_keys!
27
+ options[:params].merge!(time_entries_params) do |key, v1, v2|
28
+ empty_result = (v1 != v2)
29
+ v2
30
+ end
31
+
32
+ return [] if empty_result
33
+
34
+ TimeEntry.all(options)
35
+ end
36
+ end
@@ -0,0 +1,34 @@
1
+ class Mite::Tracker < Mite::Base
2
+
3
+ self.collection_name = "tracker"
4
+
5
+ def self.current
6
+ tracking_time_entry = connection.get(collection_path, headers)["tracking_time_entry"]
7
+ tracking_time_entry ? instantiate_record(tracking_time_entry) : nil
8
+ end
9
+
10
+ def self.start(time_entry_or_id)
11
+ id = time_entry_or_id.is_a?(Mite::TimeEntry) ? time_entry_or_id.id : time_entry_or_id
12
+ self.new(:id => id).start
13
+ end
14
+
15
+ def self.stop
16
+ tracker = current
17
+ tracker ? tracker.stop : false
18
+ end
19
+
20
+ def start
21
+ response = connection.put(element_path(prefix_options), encode, self.class.headers)
22
+ load(self.class.format.decode(response.body)["tracking_time_entry"])
23
+ response.is_a?(Net::HTTPSuccess) ? self : false
24
+ end
25
+
26
+ def stop
27
+ connection.delete(element_path, self.class.headers).is_a?(Net::HTTPSuccess) ? self : false
28
+ end
29
+
30
+ def time_entry
31
+ Mite::TimeEntry.find(id)
32
+ end
33
+
34
+ end
@@ -0,0 +1,19 @@
1
+ class Mite::User < Mite::Base
2
+
3
+ def time_entries(options = {})
4
+ TimeEntry.find(:all, :params => options.update(:user_id => id))
5
+ end
6
+
7
+ def save
8
+ raise Error, "Cannot modify users over mite.api"
9
+ end
10
+
11
+ def create
12
+ raise Error, "Cannot create users over mite.api"
13
+ end
14
+
15
+ def destroy
16
+ raise Error, "Cannot destroy users over mite.api"
17
+ end
18
+
19
+ end
metadata ADDED
@@ -0,0 +1,92 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mite.cmd
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.10
5
+ platform: ruby
6
+ authors:
7
+ - Lukas Rieder
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-02-11 00:00:00 +01:00
13
+ default_executable: mite
14
+ dependencies: []
15
+
16
+ description: A simple command line interface for mite, a sleek time tracking webapp.
17
+ email: l.rieder@gmail.com
18
+ executables:
19
+ - mite
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - LICENSE
24
+ - README.textile
25
+ files:
26
+ - .gitignore
27
+ - LICENSE
28
+ - README.textile
29
+ - Rakefile
30
+ - TODO
31
+ - VERSION
32
+ - bin/mite
33
+ - lib/mite_cmd.rb
34
+ - lib/mite_cmd/application.rb
35
+ - lib/mite_cmd/autocomplete.rb
36
+ - lib/mite_ext.rb
37
+ - lib/string_ext.rb
38
+ - mite.cmd.gemspec
39
+ - spec/mite_cmd/application_spec.rb
40
+ - spec/mite_cmd/autocomplete_spec.rb
41
+ - spec/mite_cmd_spec.rb
42
+ - spec/mite_ext_spec.rb
43
+ - spec/spec_helper.rb
44
+ - spec/string_ext_spec.rb
45
+ - vendor/yolk-mite-rb-0.0.3/CHANGES.txt
46
+ - vendor/yolk-mite-rb-0.0.3/LICENSE
47
+ - vendor/yolk-mite-rb-0.0.3/README.textile
48
+ - vendor/yolk-mite-rb-0.0.3/Rakefile
49
+ - vendor/yolk-mite-rb-0.0.3/VERSION.yml
50
+ - vendor/yolk-mite-rb-0.0.3/lib/mite-rb.rb
51
+ - vendor/yolk-mite-rb-0.0.3/lib/mite/customer.rb
52
+ - vendor/yolk-mite-rb-0.0.3/lib/mite/project.rb
53
+ - vendor/yolk-mite-rb-0.0.3/lib/mite/service.rb
54
+ - vendor/yolk-mite-rb-0.0.3/lib/mite/time_entry.rb
55
+ - vendor/yolk-mite-rb-0.0.3/lib/mite/time_entry_group.rb
56
+ - vendor/yolk-mite-rb-0.0.3/lib/mite/tracker.rb
57
+ - vendor/yolk-mite-rb-0.0.3/lib/mite/user.rb
58
+ has_rdoc: true
59
+ homepage: http://github.com/Overbryd/mite.cmd
60
+ licenses: []
61
+
62
+ post_install_message:
63
+ rdoc_options:
64
+ - --charset=UTF-8
65
+ require_paths:
66
+ - lib
67
+ required_ruby_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: "0"
72
+ version:
73
+ required_rubygems_version: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: "0"
78
+ version:
79
+ requirements: []
80
+
81
+ rubyforge_project:
82
+ rubygems_version: 1.3.5
83
+ signing_key:
84
+ specification_version: 3
85
+ summary: A simple command line interface for basic mite tasks.
86
+ test_files:
87
+ - spec/mite_cmd/application_spec.rb
88
+ - spec/mite_cmd/autocomplete_spec.rb
89
+ - spec/mite_cmd_spec.rb
90
+ - spec/mite_ext_spec.rb
91
+ - spec/spec_helper.rb
92
+ - spec/string_ext_spec.rb