basecampx 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -22,4 +22,6 @@ Gem::Specification.new do |gem|
22
22
  # Dependencies
23
23
  gem.add_runtime_dependency "httparty"
24
24
  gem.add_runtime_dependency "json"
25
+
26
+ gem.add_development_dependency "debugger"
25
27
  end
@@ -4,9 +4,15 @@ require 'yaml'
4
4
 
5
5
  require "basecampx/version"
6
6
  require 'basecampx/base'
7
+ require 'basecampx/relations'
7
8
  require 'basecampx/resource'
9
+ require 'basecampx/resources/attachment'
10
+ require 'basecampx/resources/calendar'
8
11
  require 'basecampx/resources/comment'
12
+ require 'basecampx/resources/document'
13
+ require 'basecampx/resources/event'
9
14
  require 'basecampx/resources/person'
10
15
  require 'basecampx/resources/project'
11
16
  require 'basecampx/resources/todo'
12
17
  require 'basecampx/resources/todo_list'
18
+ require 'basecampx/resources/topic'
@@ -16,17 +16,7 @@ module Basecampx
16
16
  }
17
17
  end
18
18
 
19
- def params
20
- {
21
- :basic_auth => {
22
- :username => @connect_details['username'],
23
- :password => @connect_details['password']
24
- },
25
- :headers => {
26
- "User-Agent" => @connect_details['username']
27
- }
28
- }
29
- end
19
+
30
20
 
31
21
  def account_endpoint
32
22
  if @project.nil?
@@ -39,22 +29,53 @@ module Basecampx
39
29
  def handle response
40
30
  if response.code == 200
41
31
  JSON.parse(response.body)
32
+ elsif response.code == 204
33
+ true
34
+ elsif response.code == 404
35
+ raise Exception, "API can't find specified URL #{response.request.path}"
42
36
  else
43
37
  raise Exception, response
44
38
  end
45
39
  end
46
40
 
47
- def projects
48
- self.request "#{account_endpoint}/projects.json"
41
+ def request url, params={}
42
+ url = url.sub /https\:\/\/basecamp\.com\/\d*\/api\/v1/, ''
43
+
44
+ handle HTTParty.send(params[:method] || :get, "#{account_endpoint}/#{url.sub(/^\//, '')}", request_credentials )
45
+ end
46
+
47
+ def get url, params={}
48
+ params[:method] = :get
49
+ request url, params
49
50
  end
50
51
 
51
- def project id
52
- response = HTTParty.get "#{@account_endpoint}/projects/#{id}.json", params
53
- handle response
52
+ def put url, params={}
53
+ params[:method] = :put
54
+ request url, params
54
55
  end
55
56
 
56
- def request url
57
- handle HTTParty.get "#{account_endpoint}/#{url.sub(/^\//, '')}", params
57
+ def post url, params={}
58
+ params[:method] = :post
59
+ request url, params
60
+ end
61
+
62
+ def delete url, params={}
63
+ params[:method] = :delete
64
+ request url, params
65
+ end
66
+
67
+ private
68
+
69
+ def request_credentials
70
+ {
71
+ :basic_auth => {
72
+ :username => @connect_details['username'],
73
+ :password => @connect_details['password']
74
+ },
75
+ :headers => {
76
+ "User-Agent" => @connect_details['username']
77
+ }
78
+ }
58
79
  end
59
80
 
60
81
  end
@@ -0,0 +1,47 @@
1
+ module Basecampx
2
+ module Relations
3
+
4
+ def mount method, klass
5
+ self.class_eval <<-EOB
6
+
7
+ def #{method.to_s}
8
+ @#{method.to_s}
9
+ end
10
+
11
+ def #{method.to_s}=#{method.to_s}_obj
12
+ @#{method.to_s} ||= #{klass.to_s.titleize}.new #{method.to_s}_obj
13
+ end
14
+
15
+ EOB
16
+ end
17
+
18
+ def has_one method, klass
19
+ self.class_eval <<-EOB
20
+
21
+ def #{method.to_s}
22
+ @#{method.to_s}
23
+ end
24
+
25
+ def #{method.to_s}=#{method.to_s}_obj
26
+ @#{method.to_s} ||= #{klass.to_s.titleize}.new #{method.to_s}_obj
27
+ end
28
+
29
+ EOB
30
+ end
31
+
32
+ def has_many method, klass
33
+ self.class_eval <<-EOB
34
+
35
+ def #{method.to_s}
36
+ @#{method.to_s}
37
+ end
38
+
39
+ def #{method.to_s}=#{method.to_s}_obj
40
+ @#{method.to_s} ||= #{klass.to_s.titleize}.parse #{method.to_s}_obj
41
+ end
42
+
43
+ EOB
44
+ end
45
+
46
+ end
47
+ end
@@ -1,5 +1,8 @@
1
1
  module Basecampx
2
2
  class Resource
3
+
4
+ extend Basecampx::Relations
5
+
3
6
  class << self
4
7
  def parse json
5
8
  output = []
@@ -13,10 +16,10 @@ module Basecampx
13
16
  end
14
17
 
15
18
  def initialize args=[]
16
- self.update_details args
19
+ self.update_attributes args
17
20
  end
18
21
 
19
- def update_details args
22
+ def update_attributes args
20
23
  args.each do |key, value|
21
24
  self.send(key.to_s+'=', value) if self.respond_to?((key.to_s+'=').to_s)
22
25
  end
@@ -0,0 +1,14 @@
1
+ module Basecampx
2
+ class Attachment < Basecampx::Resource
3
+
4
+ attr_accessor :key, :name, :byte_size, :content_type, :created_at, :url, :attachable
5
+
6
+ has_one :creator, :person
7
+
8
+ # GET /attachments.json
9
+ def self.all
10
+ self.parse Basecampx.request "/attachments.json"
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,30 @@
1
+ module Basecampx
2
+ class Calendar < Basecampx::Resource
3
+
4
+ attr_accessor :id, :name, :created_at, :updated_at, :accesses, :calendar_events
5
+
6
+ has_one :creator, :person
7
+
8
+ def self.find calendar_id
9
+ self.new Basecampx.request "calendars/#{calendar_id}.json"
10
+ end
11
+
12
+ def self.all
13
+ self.parse Basecampx.request "calendars.json"
14
+ end
15
+
16
+ def save
17
+ # PUT /calendars/1.json
18
+ if self.id
19
+ params = JSON.parse self.to_json
20
+ params.delete 'id'
21
+
22
+ Basecampx.put "calendars/#{self.id}.json", params
23
+ else
24
+ params = JSON.parse self.to_json
25
+ Basecampx.post "calendars.json", params
26
+ end
27
+ end
28
+
29
+ end
30
+ end
@@ -1,7 +1,10 @@
1
1
  module Basecampx
2
2
  class Comment < Basecampx::Resource
3
3
 
4
- attr_accessor :id, :content, :created_at, :updated_at, :attachments, :creator, :topic_url
4
+ attr_accessor :id, :content, :created_at, :updated_at, :topic_url
5
+
6
+ has_one :creator, :person
7
+ has_many :attachments, :attachment
5
8
 
6
9
  def self.find person_id
7
10
  self.new Basecampx.request "people/#{person_id}.json"
@@ -16,11 +19,5 @@ module Basecampx
16
19
  TodoList.parse Basecampx.request "people/#{self.id}/assigned_todos.json"
17
20
  end
18
21
 
19
- def details
20
- resp = Basecampx.request self.url
21
- update_details resp
22
- self
23
- end
24
-
25
22
  end
26
23
  end
@@ -0,0 +1,29 @@
1
+ # https://github.com/37signals/bcx-api/blob/master/sections/documents.md
2
+
3
+ module Basecampx
4
+ class Document < Basecampx::Resource
5
+
6
+ attr_accessor :id, :title, :content, :created_at, :updated_at, :url
7
+
8
+ has_one :last_updater, :person
9
+ has_many :comments, :comment
10
+ has_many :subscribers, :person
11
+
12
+ # GET /documents.json
13
+ def self.all
14
+ self.parse Basecampx.request "/documents.json"
15
+ end
16
+
17
+ def details
18
+ update_details self.url
19
+ end
20
+
21
+ private
22
+
23
+ def update_details url=nil
24
+ self.update_attributes Basecampx.request(url || "documents/#{self.id}.json")
25
+ self
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,14 @@
1
+ module Basecampx
2
+ class Event < Basecampx::Resource
3
+
4
+ attr_accessor :id, :created_at, :updated_at, :summary, :url
5
+
6
+ mount :creator, :person
7
+ mount :bucket, :project
8
+
9
+ def self.all since=1.day.ago
10
+ Event.parse Basecampx.request "events.json?since=#{since.to_time.iso8601}"
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,23 @@
1
+ module Basecampx
2
+ class Message < Basecampx::Resource
3
+
4
+ attr_accessor :id, :subject, :created_at, :updated_at, :content
5
+
6
+ has_one :creator, :person
7
+ has_many :comments, :comment
8
+ has_many :subscribers, :person
9
+
10
+ #def save
11
+ # if self.id
12
+ # params = JSON.parse self.to_json
13
+ # params.delete 'id'
14
+ #
15
+ # Basecampx.put "calendars/#{self.id}.json", params
16
+ # else
17
+ # params = JSON.parse self.to_json
18
+ # Basecampx.post "calendars.json", params
19
+ # end
20
+ #end
21
+
22
+ end
23
+ end
@@ -18,8 +18,22 @@ module Basecampx
18
18
  end
19
19
 
20
20
  def details
21
- resp = Basecampx.request self.url
22
- update_details resp
21
+ update_details self.url
22
+ end
23
+
24
+ def last_events since=1.day.ago
25
+ Event.parse Basecampx.request "people/#{self.id}/events.json?since=#{since.to_time.iso8601}"
26
+ end
27
+
28
+ # GET /projects/1/topics.json
29
+ def topics
30
+ Topic.parse Basecampx.request "projects/#{self.id}/topics.json"
31
+ end
32
+
33
+ private
34
+
35
+ def update_details url=nil
36
+ self.update_attributes Basecampx.request(url || "people/#{self.id}.json")
23
37
  self
24
38
  end
25
39
 
@@ -11,26 +11,6 @@ module Basecampx
11
11
  Project.new Basecampx.request "projects/#{project_id}.json"
12
12
  end
13
13
 
14
- def initialize args
15
- self.update_details args
16
- end
17
-
18
- def update_details args
19
- args.each do |key, value|
20
- self.send(key.to_s+'=', value) if self.respond_to?((key.to_s+'=').to_s)
21
- end
22
- end
23
-
24
- def self.parse json
25
- output = []
26
-
27
- json.each do |user|
28
- output << self.new(user)
29
- end
30
-
31
- output
32
- end
33
-
34
14
  # GET /projects/1/todos/1.json will return the specified todo.
35
15
  def todo todo_id
36
16
  Todo.new Basecampx.request "projects/#{self.id}/todos/#{todo_id}.json"
@@ -47,5 +27,48 @@ module Basecampx
47
27
  TodoList.new Basecampx.request "projects/#{self.id}/todolists/#{todo_list_id}.json"
48
28
  end
49
29
 
30
+ def events since=1.day.ago
31
+ Event.parse Basecampx.request "/projects/#{self.id}/events.json?since=#{since.to_time.iso8601}"
32
+ end
33
+
34
+ # GET /projects/1/attachments.json
35
+ def attachments
36
+ Attachment.parse Basecampx.request "projects/#{self.id}/attachments.json"
37
+ end
38
+
39
+ # GET /projects/1/documents.json
40
+ def documents
41
+ Document.parse Basecampx.request "projects/#{self.id}/documents.json"
42
+ end
43
+
44
+ # GET /projects/1/documents/1.json
45
+ def document document_id
46
+ Document.new Basecampx.request "projects/#{self.id}/documents/#{document_id}.json"
47
+ end
48
+
49
+ # GET /projects/1/accesses.json
50
+ def accesses
51
+ Person.parse Basecampx.request "projects/#{self.id}/accesses.json"
52
+ end
53
+
54
+ # POST /projects/1/accesses.json
55
+ #def grant_access ids, emails
56
+ # Basecampx.post "projects/#{self.id}/accesses.json"
57
+ #end
58
+
59
+ # DELETE /projects/1/accesses/1.json
60
+ def revoke_access person_id
61
+ if person_id.class.name == 'Basecampx::Person'
62
+ person_id = person_id.id
63
+ end
64
+
65
+ Basecampx.delete "projects/#{self.id}/accesses/#{person_id}.json"
66
+ end
67
+
68
+ # GET /projects/1/messages/1.json
69
+ def message message_id
70
+ Message.parse Basecampx.request "projects/#{self.id}/messages/#{message_id}.json"
71
+ end
72
+
50
73
  end
51
74
  end
@@ -2,7 +2,12 @@ module Basecampx
2
2
  class Todo < Basecampx::Resource
3
3
 
4
4
  attr_accessor :id, :todolist_id, :position, :content, :completed, :due_at, :created_at, :updated_at,
5
- :comments_count, :creator, :assignee, :comments, :subscribers, :attachments
5
+ :comments_count, :attachments
6
+
7
+ has_many :comments, :comment
8
+ has_many :subscribers, :person
9
+ has_one :creator, :person
10
+ has_one :assignee, :person
6
11
 
7
12
  def self.find project_id, todo_id
8
13
  Todo.new Basecampx.request "projects/#{project_id}/todos/#{todo_id}.json"
@@ -2,7 +2,10 @@ module Basecampx
2
2
  class TodoList < Basecampx::Resource
3
3
 
4
4
  attr_accessor :id, :name, :description, :created_at, :updated_at, :completed, :position, :remaining_count,
5
- :completed_count, :creator, :url, :assigned_todos, :bucket
5
+ :completed_count, :url, :bucket
6
+
7
+ has_one :creator, :person
8
+ has_many :assigned_todos, :todo
6
9
 
7
10
  # GET /todolists.json shows active todolists for all projects.
8
11
  def self.all
@@ -19,7 +22,7 @@ module Basecampx
19
22
  end
20
23
 
21
24
  def todos
22
-
25
+ assigned_todos
23
26
  end
24
27
 
25
28
  end
@@ -0,0 +1,14 @@
1
+ module Basecampx
2
+ class Topic < Basecampx::Resource
3
+
4
+ attr_accessor :id, :title, :excerpt, :created_at, :updated_at, :attachments, :topicable
5
+
6
+ has_one :last_updater, :person
7
+
8
+ # GET /topics.json
9
+ def self.all
10
+ self.parse Basecampx.request "/topics.json"
11
+ end
12
+
13
+ end
14
+ end
@@ -1,3 +1,3 @@
1
1
  module Basecampx
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: basecampx
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-11-15 00:00:00.000000000 Z
13
+ date: 2012-11-28 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: httparty
@@ -44,6 +44,22 @@ dependencies:
44
44
  - - ! '>='
45
45
  - !ruby/object:Gem::Version
46
46
  version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: debugger
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
47
63
  description: Basecamp new ruby api wrapper
48
64
  email:
49
65
  - ! '"me@antonzaytsev.com"'
@@ -59,12 +75,19 @@ files:
59
75
  - basecampx.gemspec
60
76
  - lib/basecampx.rb
61
77
  - lib/basecampx/base.rb
78
+ - lib/basecampx/relations.rb
62
79
  - lib/basecampx/resource.rb
80
+ - lib/basecampx/resources/attachment.rb
81
+ - lib/basecampx/resources/calendar.rb
63
82
  - lib/basecampx/resources/comment.rb
83
+ - lib/basecampx/resources/document.rb
84
+ - lib/basecampx/resources/event.rb
85
+ - lib/basecampx/resources/message.rb
64
86
  - lib/basecampx/resources/person.rb
65
87
  - lib/basecampx/resources/project.rb
66
88
  - lib/basecampx/resources/todo.rb
67
89
  - lib/basecampx/resources/todo_list.rb
90
+ - lib/basecampx/resources/topic.rb
68
91
  - lib/basecampx/version.rb
69
92
  - lib/generators/basecampx/install/install_generator.rb
70
93
  - lib/generators/basecampx/install/templates/basecampx.yaml