discourse_api 0.3.0 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +5 -13
  2. data/CHANGELOG.md +16 -2
  3. data/README.md +2 -0
  4. data/examples/category.rb +12 -0
  5. data/lib/discourse_api/api/api_admin.rb +10 -0
  6. data/lib/discourse_api/api/backups.rb +10 -0
  7. data/lib/discourse_api/api/badges.rb +15 -0
  8. data/lib/discourse_api/api/categories.rb +13 -7
  9. data/lib/discourse_api/api/email.rb +15 -0
  10. data/lib/discourse_api/api/groups.rb +5 -6
  11. data/lib/discourse_api/api/params.rb +1 -1
  12. data/lib/discourse_api/api/posts.rb +15 -1
  13. data/lib/discourse_api/api/topics.rb +8 -8
  14. data/lib/discourse_api/api/users.rb +20 -14
  15. data/lib/discourse_api/client.rb +17 -5
  16. data/lib/discourse_api/version.rb +1 -1
  17. data/spec/discourse_api/api/api_admin_spec.rb +23 -0
  18. data/spec/discourse_api/api/backups_spec.rb +23 -0
  19. data/spec/discourse_api/api/badges_spec.rb +40 -0
  20. data/spec/discourse_api/api/categories_spec.rb +6 -0
  21. data/spec/discourse_api/api/email_spec.rb +39 -0
  22. data/spec/discourse_api/api/params_spec.rb +20 -0
  23. data/spec/discourse_api/api/posts_spec.rb +29 -0
  24. data/spec/discourse_api/api/topics_spec.rb +6 -0
  25. data/spec/discourse_api/api/users_spec.rb +78 -8
  26. data/spec/fixtures/api.json +12 -0
  27. data/spec/fixtures/backups.json +12 -0
  28. data/spec/fixtures/badges.json +569 -0
  29. data/spec/fixtures/email_list_all.json +749 -0
  30. data/spec/fixtures/email_settings.json +13 -0
  31. data/spec/fixtures/post.json +94 -0
  32. data/spec/fixtures/user_activate_success.json +3 -0
  33. data/spec/fixtures/user_badges.json +170 -0
  34. data/spec/fixtures/user_list.json +583 -0
  35. data/spec/fixtures/user_log_out_success.json +3 -0
  36. data/spec/fixtures/user_update_avatar_success.json +3 -0
  37. data/spec/fixtures/user_update_username.json +2 -1
  38. metadata +66 -28
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- Mjg1NDk2YjJiNTdlYmVhYmMwMDZjNTc3NjIxN2EwZWJjYmMyMmVhZQ==
5
- data.tar.gz: !binary |-
6
- NDkwMWZjYTQ0MzkwZDY3ODNkMjdlNjFkOTZiMTUzOTMzMmQ5YzIyMQ==
2
+ SHA1:
3
+ metadata.gz: 10a7f2e9839bfeea9edbb43a4f2fe535723e237e
4
+ data.tar.gz: d8de8c9500231bd8ba26593e2ac7b266e4be067c
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- NzJmZjQ1ZTA0MzA4MThmMzE3YWFhOWI5MDYyYmVjM2E5ZTE0Yjg3ZjI2ZDA3
10
- MDllNzlkNmJkNjA5MjEzMzY1MDg5MTNlM2E1YWQxNTU1YmMxMzE0MjRlNTQz
11
- YjdkZTNlMzEwYjQ3OTk2MzRhZjQ0ZWRmN2JlZWQ5YzBiMjc1NjE=
12
- data.tar.gz: !binary |-
13
- NmFhYzQyYTAwYjdjMzRiNzgxYmQ3OWM4NzE5MWVlOTkzZmFlNWQxYzI2NzBi
14
- ZWY3ODNlODZmNzFjNGY1ZmZlN2I1NDY0MDBhODUzYjJiOTBiOTA0NGFhYjE2
15
- ZWJjMDdiZTU4NWU4ODliOGQ4NWRiMjdiZmQ4Y2M3NGYwYjk3NjA=
6
+ metadata.gz: 14b552567338b8f699eeb77efa4de86e334052989a5cdbf6007ecfde4e1a128e9d03ae1d9d9c2c5a501fe1f3da2f76572122b26472f60c462c909bbf2107aaa4
7
+ data.tar.gz: 61ac275015ae01fef9b9e0b6434e2c175a1f17b7dab3bd291418b53284063e7da45373affab2a741e4f74eaf4f3de6b5748c5683258307411feee37e2a8ee442
@@ -2,8 +2,22 @@
2
2
 
3
3
  ## master
4
4
 
5
- * Added `client.category_latest_posts("category-slug")` endpoint
5
+ - Added `client.category_latest_posts("category-slug")` endpoint
6
6
 
7
7
  ## 0.1.2
8
8
 
9
- * Release
9
+ - Release
10
+
11
+ ## 0.3.5
12
+
13
+ - Can now get a list of users by type: active, new, staff, etc.
14
+
15
+ ## 0.3.6
16
+
17
+ - list badges
18
+ - view email settings
19
+ - list emails sent
20
+ - list badges by user
21
+ - be able to specify SSL connection settings
22
+ - list api keys generated
23
+ - list backups created
data/README.md CHANGED
@@ -32,6 +32,8 @@ client = DiscourseApi::Client.new("http://try.discourse.org")
32
32
  client.api_key = "YOUR_API_KEY"
33
33
  client.api_username = "YOUR_USERNAME"
34
34
 
35
+ client.ssl(...) #=> specify SSL connection settings if needed
36
+
35
37
  # Topic endpoints
36
38
  client.latest_topics #=> Gets a list of the latest topics
37
39
  client.hot_topics #=> Gets a list of hot topics
@@ -0,0 +1,12 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+ require File.expand_path('../../lib/discourse_api', __FILE__)
3
+
4
+ client = DiscourseApi::Client.new("http://localhost:3000")
5
+ client.api_key = "YOUR_API_KEY"
6
+ client.api_username = "YOUR_USERNAME"
7
+
8
+ # get categories
9
+ puts client.categories()
10
+
11
+ # get sub categories for parent category with id 2
12
+ puts client.categories(parent_category_id: 2)
@@ -0,0 +1,10 @@
1
+ module DiscourseApi
2
+ module API
3
+ module ApiAdmin
4
+ def api
5
+ response = get("/admin/api.json")
6
+ response.body
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module DiscourseApi
2
+ module API
3
+ module Backups
4
+ def backups
5
+ response = get("/admin/backups.json")
6
+ response.body
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,15 @@
1
+ module DiscourseApi
2
+ module API
3
+ module Badges
4
+ def badges
5
+ response = get("/admin/badges.json")
6
+ response.body
7
+ end
8
+
9
+ def user_badges(username)
10
+ response = get("/users/#{username}/activity/badges.json")
11
+ response.body['badges']
12
+ end
13
+ end
14
+ end
15
+ end
@@ -3,15 +3,16 @@ module DiscourseApi
3
3
  module Categories
4
4
  # :color and :text_color are RGB hexadecimal strings
5
5
  def create_category(args)
6
- post("/categories", API.params(args)
7
- .required(:name)
8
- .optional(:color, :text_color)
9
- .default(parent_category_id: nil)
10
- )
6
+ params = API.params(args)
7
+ .required(:name, :color, :text_color)
8
+ .optional(:description)
9
+ .default(parent_category_id: nil)
10
+ response = (post "/categories", params)
11
+ response['category']
11
12
  end
12
13
 
13
- def categories(*args)
14
- response = get('/categories.json', args)
14
+ def categories(params={})
15
+ response = get('/categories.json', params)
15
16
  response[:body]['category_list']['categories']
16
17
  end
17
18
 
@@ -19,6 +20,11 @@ module DiscourseApi
19
20
  response = get("/category/#{category_slug}/l/latest.json")
20
21
  response[:body]['topic_list']['topics']
21
22
  end
23
+
24
+ def category(id)
25
+ response = get("/c/#{id}/show")
26
+ response.body['category']
27
+ end
22
28
  end
23
29
  end
24
30
  end
@@ -0,0 +1,15 @@
1
+ module DiscourseApi
2
+ module API
3
+ module Email
4
+ def email_settings
5
+ response = get("/admin/email.json")
6
+ response.body
7
+ end
8
+
9
+ def list_email(filter)
10
+ response = get("/admin/email/#{filter}.json")
11
+ response.body
12
+ end
13
+ end
14
+ end
15
+ end
@@ -2,12 +2,11 @@ module DiscourseApi
2
2
  module API
3
3
  module Groups
4
4
  def create_group(args)
5
-
6
- post("/admin/groups", group: API.params(args)
7
- .required(:name)
8
- .default(visible: true)
9
- .to_h
10
- )
5
+ params = API.params(args)
6
+ .required(:name)
7
+ .default(visible: true)
8
+ .to_h
9
+ post("/admin/groups", group: params)
11
10
  end
12
11
 
13
12
  def groups
@@ -42,7 +42,7 @@ module DiscourseApi
42
42
  @args.dup
43
43
  else
44
44
  @optional.each do |k|
45
- h[k] = @args[k]
45
+ h[k] = @args[k] if @args.include?(k)
46
46
  end
47
47
  h
48
48
  end
@@ -3,7 +3,21 @@ module DiscourseApi
3
3
  module Posts
4
4
  def create_post(args)
5
5
  post("/posts", API.params(args)
6
- .required(:topic_id, :raw))
6
+ .required(:topic_id, :raw))
7
+ end
8
+
9
+ def get_post(id, args = {})
10
+ response = get("/posts/#{id}.json", API.params(args)
11
+ .optional(:version))
12
+ response[:body]
13
+ end
14
+
15
+ def wikify_post(id)
16
+ put("/posts/#{id}/wiki", wiki: true)
17
+ end
18
+
19
+ def edit_post(id, raw)
20
+ put("/posts/#{id}", post: {raw: raw})
7
21
  end
8
22
  end
9
23
  end
@@ -14,13 +14,13 @@ module DiscourseApi
14
14
  post("/posts", args.to_h)
15
15
  end
16
16
 
17
- def latest_topics(*args)
18
- response = get('/latest.json', args)
17
+ def latest_topics(params={})
18
+ response = get('/latest.json', params)
19
19
  response[:body]['topic_list']['topics']
20
20
  end
21
21
 
22
- def new_topics(*args)
23
- response = get("/new.json", args)
22
+ def new_topics(params={})
23
+ response = get("/new.json", params)
24
24
  response[:body]['topic_list']['topics']
25
25
  end
26
26
 
@@ -32,13 +32,13 @@ module DiscourseApi
32
32
  put("/t/#{topic_id}.json", { topic_id: topic_id, category_id: category_id })
33
33
  end
34
34
 
35
- def topic(id, *args)
36
- response = get("/t/#{id}.json", args)
35
+ def topic(id, params={})
36
+ response = get("/t/#{id}.json", params)
37
37
  response[:body]
38
38
  end
39
39
 
40
- def topics_by(username, *args)
41
- response = get("/topics/created-by/#{username}.json", args)
40
+ def topics_by(username, params={})
41
+ response = get("/topics/created-by/#{username}.json", params)
42
42
  response[:body]['topic_list']['topics']
43
43
  end
44
44
 
@@ -5,13 +5,18 @@ module DiscourseApi
5
5
  put "/admin/users/#{id}/activate", api_key: api_key, api_username: api_username
6
6
  end
7
7
 
8
- def user(username, *args)
9
- response = get("/users/#{username}.json", args)
8
+ def user(username, params={})
9
+ response = get("/users/#{username}.json", params)
10
10
  response[:body]['user']
11
11
  end
12
12
 
13
- def update_avatar(username, file)
14
- put("/users/#{username}/preferences/avatar", { file: file, api_key: api_key })
13
+ def update_avatar(args)
14
+ params = API.params(args)
15
+ .required(:username, :file)
16
+ .default(image_type: 'avatar')
17
+ .to_h
18
+ upload_response = post("/users/#{args[:username]}/preferences/user_image", params)
19
+ put("/users/#{args[:username]}/preferences/avatar/pick", { upload_id: upload_response['upload_id'] })
15
20
  end
16
21
 
17
22
  def update_email(username, email)
@@ -26,16 +31,12 @@ module DiscourseApi
26
31
  put("/users/#{username}/preferences/username", { new_username: new_username, api_key: api_key })
27
32
  end
28
33
 
29
- # Create a user
30
- def create_user(args={})
31
- # First retrieve the honeypot values
32
- # TODO, none of this should be needed via API
33
- response = get("/users/hp.json")
34
- args[:password_confirmation] = response[:body]['value']
35
- args[:challenge] = response[:body]['challenge'].reverse
36
-
37
- # POST the args
38
- post("/users", args)
34
+ def create_user(args)
35
+ params = API.params(args)
36
+ .required(:name, :email, :password, :username)
37
+ .optional(:active)
38
+ .to_h
39
+ post("/users", params)
39
40
  end
40
41
 
41
42
  def log_out(id)
@@ -45,6 +46,11 @@ module DiscourseApi
45
46
  def invite_admin(args={})
46
47
  post("/admin/users/invite_admin", args)
47
48
  end
49
+
50
+ def list_users(type)
51
+ response = get("admin/users/list/#{type}.json")
52
+ response[:body]
53
+ end
48
54
  end
49
55
  end
50
56
  end
@@ -13,6 +13,10 @@ require 'discourse_api/api/groups'
13
13
  require 'discourse_api/api/invite'
14
14
  require 'discourse_api/api/private_messages'
15
15
  require 'discourse_api/api/notifications'
16
+ require 'discourse_api/api/badges'
17
+ require 'discourse_api/api/email'
18
+ require 'discourse_api/api/api_admin'
19
+ require 'discourse_api/api/backups'
16
20
 
17
21
  module DiscourseApi
18
22
  class Client
@@ -29,6 +33,10 @@ module DiscourseApi
29
33
  include DiscourseApi::API::Invite
30
34
  include DiscourseApi::API::PrivateMessages
31
35
  include DiscourseApi::API::Notifications
36
+ include DiscourseApi::API::Badges
37
+ include DiscourseApi::API::Email
38
+ include DiscourseApi::API::ApiAdmin
39
+ include DiscourseApi::API::Backups
32
40
 
33
41
  def initialize(host = ENV["DISCOURSE_URL"],
34
42
  api_key = ENV["DISCOURSE_API_KEY"],
@@ -41,14 +49,18 @@ module DiscourseApi
41
49
 
42
50
  def connection_options
43
51
  @connection_options ||= {
44
- url: @host,
45
- headers: {
46
- accept: 'application/json',
47
- user_agent: user_agent,
48
- }
52
+ url: @host,
53
+ headers: {
54
+ accept: 'application/json',
55
+ user_agent: user_agent,
56
+ }
49
57
  }
50
58
  end
51
59
 
60
+ def ssl(options)
61
+ connection_options[:ssl] = options
62
+ end
63
+
52
64
  def delete(path, params={})
53
65
  request(:delete, path, params)
54
66
  end
@@ -1,3 +1,3 @@
1
1
  module DiscourseApi
2
- VERSION = "0.3.0"
2
+ VERSION = "0.3.6"
3
3
  end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe DiscourseApi::API::ApiAdmin do
4
+ subject { DiscourseApi::Client.new("http://localhost:3000", "test_d7fd0429940", "test_user" )}
5
+
6
+ describe "#api" do
7
+ before do
8
+ stub_get("http://localhost:3000/admin/api.json?api_key=test_d7fd0429940&api_username=test_user").to_return(body: fixture("api.json"), headers: { content_type: "application/json" })
9
+ end
10
+
11
+ it "requests the correct resource" do
12
+ subject.api
13
+ expect(a_get("http://localhost:3000/admin/api.json?api_key=test_d7fd0429940&api_username=test_user")).to have_been_made
14
+ end
15
+
16
+ it "returns the requested api keys" do
17
+ api = subject.api
18
+ expect(api).to be_an Array
19
+ expect(api.first).to be_a Hash
20
+ expect(api.first).to have_key('key')
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe DiscourseApi::API::Backups do
4
+ subject { DiscourseApi::Client.new("http://localhost:3000", "test_d7fd0429940", "test_user" )}
5
+
6
+ describe "#backups" do
7
+ before do
8
+ stub_get("http://localhost:3000/admin/backups.json?api_key=test_d7fd0429940&api_username=test_user").to_return(body: fixture("backups.json"), headers: { content_type: "application/json" })
9
+ end
10
+
11
+ it "requests the correct resource" do
12
+ subject.backups
13
+ expect(a_get("http://localhost:3000/admin/backups.json?api_key=test_d7fd0429940&api_username=test_user")).to have_been_made
14
+ end
15
+
16
+ it "returns the requested backups" do
17
+ backups = subject.backups
18
+ expect(backups).to be_an Array
19
+ expect(backups.first).to be_a Hash
20
+ expect(backups.first).to have_key('filename')
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe DiscourseApi::API::Badges do
4
+ subject { DiscourseApi::Client.new("http://localhost:3000", "test_d7fd0429940", "test_user" )}
5
+
6
+ describe "#badges" do
7
+ before do
8
+ stub_get("http://localhost:3000/admin/badges.json?api_key=test_d7fd0429940&api_username=test_user").to_return(body: fixture("badges.json"), headers: { content_type: "application/json" })
9
+ end
10
+
11
+ it "requests the correct resource" do
12
+ subject.badges
13
+ expect(a_get("http://localhost:3000/admin/badges.json?api_key=test_d7fd0429940&api_username=test_user")).to have_been_made
14
+ end
15
+
16
+ it "returns the requested badges" do
17
+ badges = subject.badges
18
+ expect(badges).to be_a Hash
19
+ expect(badges['badges']).to be_an Array
20
+ end
21
+ end
22
+
23
+ describe "#user_badges" do
24
+ before do
25
+ stub_get("http://localhost:3000/users/test_user/activity/badges.json?api_key=test_d7fd0429940&api_username=test_user").to_return(body: fixture("user_badges.json"), headers: { content_type: "application/json" })
26
+ end
27
+
28
+ it "requests the correct resource" do
29
+ subject.user_badges('test_user')
30
+ expect(a_get("http://localhost:3000/users/test_user/activity/badges.json?api_key=test_d7fd0429940&api_username=test_user")).to have_been_made
31
+ end
32
+
33
+ it "returns the requested user badges" do
34
+ badges = subject.user_badges('test_user')
35
+ expect(badges).to be_an Array
36
+ expect(badges.first).to be_a Hash
37
+ expect(badges.first).to have_key('badge_type_id')
38
+ end
39
+ end
40
+ end