basecampx 0.0.3 → 0.0.4
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/basecampx.gemspec +2 -0
- data/lib/basecampx.rb +6 -0
- data/lib/basecampx/base.rb +39 -18
- data/lib/basecampx/relations.rb +47 -0
- data/lib/basecampx/resource.rb +5 -2
- data/lib/basecampx/resources/attachment.rb +14 -0
- data/lib/basecampx/resources/calendar.rb +30 -0
- data/lib/basecampx/resources/comment.rb +4 -7
- data/lib/basecampx/resources/document.rb +29 -0
- data/lib/basecampx/resources/event.rb +14 -0
- data/lib/basecampx/resources/message.rb +23 -0
- data/lib/basecampx/resources/person.rb +16 -2
- data/lib/basecampx/resources/project.rb +43 -20
- data/lib/basecampx/resources/todo.rb +6 -1
- data/lib/basecampx/resources/todo_list.rb +5 -2
- data/lib/basecampx/resources/topic.rb +14 -0
- data/lib/basecampx/version.rb +1 -1
- metadata +25 -2
data/basecampx.gemspec
CHANGED
data/lib/basecampx.rb
CHANGED
@@ -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'
|
data/lib/basecampx/base.rb
CHANGED
@@ -16,17 +16,7 @@ module Basecampx
|
|
16
16
|
}
|
17
17
|
end
|
18
18
|
|
19
|
-
|
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
|
48
|
-
|
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
|
52
|
-
|
53
|
-
|
52
|
+
def put url, params={}
|
53
|
+
params[:method] = :put
|
54
|
+
request url, params
|
54
55
|
end
|
55
56
|
|
56
|
-
def
|
57
|
-
|
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
|
data/lib/basecampx/resource.rb
CHANGED
@@ -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.
|
19
|
+
self.update_attributes args
|
17
20
|
end
|
18
21
|
|
19
|
-
def
|
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, :
|
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
|
-
|
22
|
-
|
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, :
|
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, :
|
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
|
data/lib/basecampx/version.rb
CHANGED
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.
|
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-
|
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
|