discourse_api 0.3.0 → 0.3.6

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