discourse_api 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +20 -0
- data/.travis.yml +4 -0
- data/Gemfile +4 -0
- data/Guardfile +5 -0
- data/LICENSE.txt +22 -0
- data/README.md +55 -0
- data/Rakefile +7 -0
- data/discourse_api.gemspec +31 -0
- data/examples/example.rb +7 -0
- data/examples/invite_users.rb +10 -0
- data/examples/post_topic.rb +16 -0
- data/examples/topic_lists.rb +13 -0
- data/examples/update_user.rb +14 -0
- data/lib/discourse_api.rb +3 -0
- data/lib/discourse_api/api/categories.rb +10 -0
- data/lib/discourse_api/api/search.rb +16 -0
- data/lib/discourse_api/api/topics.rb +35 -0
- data/lib/discourse_api/api/users.rb +30 -0
- data/lib/discourse_api/client.rb +76 -0
- data/lib/discourse_api/error.rb +14 -0
- data/lib/discourse_api/version.rb +3 -0
- data/routes.txt +203 -0
- data/spec/discourse_api/api/categories_spec.rb +22 -0
- data/spec/discourse_api/api/search_spec.rb +22 -0
- data/spec/discourse_api/api/topics_spec.rb +94 -0
- data/spec/discourse_api/api/users_spec.rb +41 -0
- data/spec/discourse_api/client_spec.rb +105 -0
- data/spec/fixtures/categories.json +1 -0
- data/spec/fixtures/hot.json +1 -0
- data/spec/fixtures/latest.json +1 -0
- data/spec/fixtures/new.json +1 -0
- data/spec/fixtures/search.json +1 -0
- data/spec/fixtures/topic.json +1 -0
- data/spec/fixtures/topics_created_by.json +1 -0
- data/spec/fixtures/user.json +1 -0
- data/spec/spec_helper.rb +60 -0
- metadata +238 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 85bfc87d0fafa517bf76b417bc63d77cc1e4981f
|
4
|
+
data.tar.gz: 220503a989f470fdb0b9edec7732e8b53eebf7ab
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 0e78225f1b54155f57a86f147f4323c96aadfb20737a294df74cd41cb3eda9cc9ed95578bbbd9c5bfdfef6563b6798fe357ba4e2d8cbd533d8a7b5988e9f09e3
|
7
|
+
data.tar.gz: 9390284acb2d3b7660dabeae0fdcc953e4f4707772977f88ee295020901430d17285550c4163efa0ef6ff10bd5804147f0601a97a8aa06f5e62cf1553d434588
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Discourse
|
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,55 @@
|
|
1
|
+
# DiscourseApi
|
2
|
+
|
3
|
+
[![Build Status](https://travis-ci.org/discourse/discourse_api.pong?branch=master)][travis]
|
4
|
+
[![Code Climate](https://codeclimate.com/github/discourse/discourse_api.png)][codeclimate]
|
5
|
+
|
6
|
+
[travis]: http://travis-ci.org/discourse/discourse_api
|
7
|
+
[codeclimate]: https://codeclimate.com/github/discourse/discourse_api
|
8
|
+
|
9
|
+
The Discourse API gem allows you to consume the Discourse API
|
10
|
+
|
11
|
+
## Installation
|
12
|
+
|
13
|
+
Add this line to your application's Gemfile:
|
14
|
+
|
15
|
+
gem 'discourse_api'
|
16
|
+
|
17
|
+
And then execute:
|
18
|
+
|
19
|
+
$ bundle
|
20
|
+
|
21
|
+
Or install it yourself as:
|
22
|
+
|
23
|
+
$ gem install discourse_api
|
24
|
+
|
25
|
+
## Usage
|
26
|
+
|
27
|
+
Over time this project intends to have a full Discourse API. At the moment there are only a
|
28
|
+
few endpoints available:
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
client = DiscourseApi::Client.new("http://try.discourse.org")
|
32
|
+
|
33
|
+
# Topic endpoints
|
34
|
+
client.latest_topics #=> Gets a list of the latest topics
|
35
|
+
client.hot_topics #=> Gets a list of hot topics
|
36
|
+
client.new_topics #=> Gets a list of new topics
|
37
|
+
client.topics_by("sam") #=> Gets a list of topics created by user "sam"
|
38
|
+
client.topic(57) #=> Gets the topic with id 57
|
39
|
+
|
40
|
+
# Search endpoint
|
41
|
+
client.search("sandbox") #=> Gets a list of topics that match "sandbox"
|
42
|
+
|
43
|
+
# Categories endpoint
|
44
|
+
client.categories #=> Gets a list of categories
|
45
|
+
|
46
|
+
```
|
47
|
+
|
48
|
+
|
49
|
+
## Contributing
|
50
|
+
|
51
|
+
1. Fork it
|
52
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
53
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
54
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
55
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'discourse_api/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "discourse_api"
|
8
|
+
spec.version = DiscourseApi::VERSION
|
9
|
+
spec.authors = ["Sam Saffron", "John Paul Ashenfelter", "Michael Herold"]
|
10
|
+
spec.email = ["sam.saffron@gmail.com", "john@ashenfelter.com", "michael.j.herold@gmail.com"]
|
11
|
+
spec.description = %q{Discourse API}
|
12
|
+
spec.summary = %q{Allows access to the Discourse API}
|
13
|
+
spec.homepage = "http://github.com/discourse/discourse_api"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency "faraday", "~> 0.8.8"
|
22
|
+
spec.add_dependency "faraday_middleware", "~> 0.9"
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
24
|
+
spec.add_development_dependency "rake"
|
25
|
+
spec.add_development_dependency "rspec"
|
26
|
+
spec.add_development_dependency "webmock"
|
27
|
+
spec.add_development_dependency "guard-rspec"
|
28
|
+
spec.add_development_dependency "guard"
|
29
|
+
spec.add_development_dependency "rb-inotify"
|
30
|
+
spec.add_development_dependency "simplecov"
|
31
|
+
end
|
data/examples/example.rb
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
# require 'discourse_api'
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
4
|
+
require File.expand_path('../../lib/discourse_api', __FILE__)
|
5
|
+
|
6
|
+
client = DiscourseApi::Client.new("http://localhost:3000", '6157bad92b3b5f8004aedc82220281c5966e5d560bb2bb6f962123474db4ac98')
|
7
|
+
puts client.latest
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# require 'discourse_api'
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
4
|
+
require File.expand_path('../../lib/discourse_api', __FILE__)
|
5
|
+
|
6
|
+
client = DiscourseApi::Client.new("localhost",3000)
|
7
|
+
client.api_key = "6157bad92b3b5f8004aedc82220281c5966e5d560bb2bb6f962123474db4ac98"
|
8
|
+
client.api_username = "forumadmin"
|
9
|
+
|
10
|
+
client.topic_invite_user(topic_id: 1, email: "bob@bob.com")
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# require 'discourse_api'
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
4
|
+
require File.expand_path('../../lib/discourse_api', __FILE__)
|
5
|
+
|
6
|
+
client = DiscourseApi::Client.new("localhost", 3000)
|
7
|
+
client.api_key = "YOUR_API_KEY"
|
8
|
+
client.api_username = "YOUR_USERNAME"
|
9
|
+
|
10
|
+
client.post_create(
|
11
|
+
category: "Boing Boing",
|
12
|
+
skip_validations: true,
|
13
|
+
auto_track: false,
|
14
|
+
title: "Concert Master: A new way to choose",
|
15
|
+
raw: "This is the raw markdown for my post"
|
16
|
+
)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# require 'discourse_api'
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
4
|
+
require File.expand_path('../../lib/discourse_api', __FILE__)
|
5
|
+
|
6
|
+
client = DiscourseApi::Client.new("localhost", 3000)
|
7
|
+
client.api_key = "YOUR_API_KEY"
|
8
|
+
client.api_username = "YOUR_USERNAME"
|
9
|
+
|
10
|
+
puts client.topics_latest({})
|
11
|
+
puts client.topics_hot({})
|
12
|
+
puts client.categories({})
|
13
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# require 'discourse_api'
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
4
|
+
require File.expand_path('../../lib/discourse_api', __FILE__)
|
5
|
+
|
6
|
+
client = DiscourseApi::Client.new("localhost", 3000)
|
7
|
+
client.api_key = "YOUR_API_KEY"
|
8
|
+
client.api_username = "YOUR_USERNAME"
|
9
|
+
|
10
|
+
puts client.username_update(username: "Batman", new_username: "Alfred")
|
11
|
+
puts client.user_update(username: "Batman", name: "Bruce Wayne")
|
12
|
+
puts client.email_update(username: "Batman", email: "batman@example.com")
|
13
|
+
puts client.toggle_avatar(username: "Batman", use_uploaded_avatar: true)
|
14
|
+
puts client.upload_avatar(username: "DiscourseHero", file: "http://cdn.discourse.org/assets/logo.png")
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module DiscourseApi
|
2
|
+
module API
|
3
|
+
module Search
|
4
|
+
# Returns search results that match the specified term.
|
5
|
+
#
|
6
|
+
# @param term [String] a search term
|
7
|
+
# @param options [Hash] A customizable set of options
|
8
|
+
# @option options [String] :type_filter Returns results of the specified type.
|
9
|
+
# @return [Array] Return results as an array of Hashes.
|
10
|
+
def search(term, options={})
|
11
|
+
response = get('/search.json', options.merge(term: term))
|
12
|
+
response[:body]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module DiscourseApi
|
2
|
+
module API
|
3
|
+
module Topics
|
4
|
+
def hot_topics(*args)
|
5
|
+
response = get('/hot.json', args)
|
6
|
+
response[:body]['topic_list']['topics']
|
7
|
+
end
|
8
|
+
|
9
|
+
def invite_user_to_topic(user_email, topic_id)
|
10
|
+
params = { email: user_email, topic_id: topic_id }
|
11
|
+
post "/t/#{topic_id}/invite.json", params
|
12
|
+
end
|
13
|
+
|
14
|
+
def latest_topics(*args)
|
15
|
+
response = get('/latest.json', args)
|
16
|
+
response[:body]['topic_list']['topics']
|
17
|
+
end
|
18
|
+
|
19
|
+
def new_topics(*args)
|
20
|
+
response = get("/new.json", args)
|
21
|
+
response[:body]['topic_list']['topics']
|
22
|
+
end
|
23
|
+
|
24
|
+
def topic(id, *args)
|
25
|
+
response = get("/t/#{id}.json", args)
|
26
|
+
response[:body]
|
27
|
+
end
|
28
|
+
|
29
|
+
def topics_by(username, *args)
|
30
|
+
response = get("/topics/created-by/#{username}.json", args)
|
31
|
+
response[:body]['topic_list']['topics']
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module DiscourseApi
|
2
|
+
module API
|
3
|
+
module Users
|
4
|
+
def toggle_avatar(username, use_uploaded_avatar)
|
5
|
+
put("/users/#{username}/preferences/avatar/toggle", { use_uploaded_avatar: use_uploaded_avatar })
|
6
|
+
end
|
7
|
+
|
8
|
+
def user(username, *args)
|
9
|
+
response = get("/user/#{username}.json", args)
|
10
|
+
response[:body]['user']
|
11
|
+
end
|
12
|
+
|
13
|
+
def update_avatar(username, file)
|
14
|
+
put("/users/#{username}/preferences/avatar", { file: file })
|
15
|
+
end
|
16
|
+
|
17
|
+
def update_email(username, email)
|
18
|
+
put("/users/#{username}/preferences/email", { email: email })
|
19
|
+
end
|
20
|
+
|
21
|
+
def update_user(username, *args)
|
22
|
+
put("/users/#{username}", args)
|
23
|
+
end
|
24
|
+
|
25
|
+
def update_username(username, new_username)
|
26
|
+
put("/users/#{username}/preferences/username", { new_username: new_username })
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'faraday_middleware'
|
3
|
+
require 'json'
|
4
|
+
require 'discourse_api/version'
|
5
|
+
require 'discourse_api/api/categories'
|
6
|
+
require 'discourse_api/api/search'
|
7
|
+
require 'discourse_api/api/topics'
|
8
|
+
require 'discourse_api/api/users'
|
9
|
+
|
10
|
+
module DiscourseApi
|
11
|
+
class Client
|
12
|
+
attr_accessor :api_key, :api_username
|
13
|
+
attr_reader :host
|
14
|
+
|
15
|
+
include DiscourseApi::API::Categories
|
16
|
+
include DiscourseApi::API::Search
|
17
|
+
include DiscourseApi::API::Topics
|
18
|
+
include DiscourseApi::API::Users
|
19
|
+
|
20
|
+
def initialize(host, api_key=nil, api_username=nil)
|
21
|
+
@host = host
|
22
|
+
@api_key = api_key
|
23
|
+
@api_username = api_username
|
24
|
+
end
|
25
|
+
|
26
|
+
def connection_options
|
27
|
+
@connection_options ||= {
|
28
|
+
url: @host,
|
29
|
+
headers: {
|
30
|
+
accept: 'application/json',
|
31
|
+
user_agent: user_agent,
|
32
|
+
}
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
def delete(path, params={})
|
37
|
+
request(:delete, path, params)
|
38
|
+
end
|
39
|
+
|
40
|
+
def get(path, params={})
|
41
|
+
request(:get, path, params)
|
42
|
+
end
|
43
|
+
|
44
|
+
def post(path, params={})
|
45
|
+
request(:post, path, params)
|
46
|
+
end
|
47
|
+
|
48
|
+
def put(path, params={})
|
49
|
+
request(:put, path, params)
|
50
|
+
end
|
51
|
+
|
52
|
+
def user_agent
|
53
|
+
@user_agent ||= "DiscourseAPI Ruby Gem #{DiscourseApi::VERSION}"
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def connection
|
59
|
+
@connection ||= Faraday.new connection_options do |conn|
|
60
|
+
# Convert request params to "www-form-encoded"
|
61
|
+
conn.request :url_encoded
|
62
|
+
# Parse responses as JSON
|
63
|
+
conn.response :json
|
64
|
+
# Use Faraday's default HTTP adapter
|
65
|
+
conn.adapter Faraday.default_adapter
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def request(method, path, params={})
|
70
|
+
response = connection.send(method.to_sym, path, params)
|
71
|
+
response.env
|
72
|
+
rescue Faraday::Error::ClientError, JSON::ParserError
|
73
|
+
raise DiscourseApi::Error
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module DiscourseApi
|
2
|
+
class Error < StandardError
|
3
|
+
attr_reader :wrapped_exception
|
4
|
+
|
5
|
+
# Initializes a new Error object
|
6
|
+
#
|
7
|
+
# @param exception [Exception, String]
|
8
|
+
# @return [DiscourseApi::Error]
|
9
|
+
def initialize(exception=$!)
|
10
|
+
@wrapped_exception = exception
|
11
|
+
exception.respond_to?(:message) ? super(exception.message) : super(exception.to_s)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|