mite.cmd 0.1.10

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.
@@ -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