wordpress_client 0.0.1 → 2.0.1

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 (56) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +30 -0
  3. data/.codeclimate.yml +23 -0
  4. data/.gitignore +1 -0
  5. data/.rubocop.yml +147 -90
  6. data/.yardopts +1 -0
  7. data/Changelog.md +16 -0
  8. data/Gemfile +6 -1
  9. data/README.md +48 -14
  10. data/Rakefile +37 -0
  11. data/lib/wordpress_client/category.rb +2 -0
  12. data/lib/wordpress_client/client.rb +235 -79
  13. data/lib/wordpress_client/connection.rb +10 -10
  14. data/lib/wordpress_client/errors.rb +41 -6
  15. data/lib/wordpress_client/media.rb +49 -1
  16. data/lib/wordpress_client/media_parser.rb +3 -0
  17. data/lib/wordpress_client/paginated_collection.rb +61 -4
  18. data/lib/wordpress_client/post.rb +63 -16
  19. data/lib/wordpress_client/post_parser.rb +12 -39
  20. data/lib/wordpress_client/rest_parser.rb +4 -0
  21. data/lib/wordpress_client/tag.rb +2 -0
  22. data/lib/wordpress_client/term.rb +30 -0
  23. data/lib/wordpress_client/version.rb +5 -1
  24. data/lib/wordpress_client.rb +21 -5
  25. data/spec/client_spec.rb +17 -181
  26. data/spec/connection_spec.rb +15 -14
  27. data/spec/docker/Dockerfile +35 -10
  28. data/spec/docker/README.md +53 -16
  29. data/spec/docker/dbdump.sql.gz +0 -0
  30. data/spec/docker/restore-dbdump.sh +2 -2
  31. data/spec/docker/yum.repos.d/CentOS-Base.repo +25 -0
  32. data/spec/fixtures/image-media.json +1 -1
  33. data/spec/fixtures/post-with-metadata.json +99 -1
  34. data/spec/fixtures/simple-post.json +324 -1
  35. data/spec/integration/attachments_crud_spec.rb +1 -1
  36. data/spec/integration/posts_crud_spec.rb +1 -1
  37. data/spec/integration/posts_finding_spec.rb +0 -69
  38. data/spec/integration/posts_metadata_spec.rb +11 -11
  39. data/spec/integration/posts_with_attachments_spec.rb +20 -6
  40. data/spec/media_spec.rb +14 -0
  41. data/spec/post_spec.rb +5 -31
  42. data/spec/spec_helper.rb +1 -0
  43. data/spec/support/docker_runner.rb +33 -13
  44. data/spec/support/wordpress_server.rb +112 -74
  45. data/wordpress_client.gemspec +17 -17
  46. metadata +43 -31
  47. data/.hound.yml +0 -2
  48. data/.ruby-version +0 -1
  49. data/circle.yml +0 -3
  50. data/lib/wordpress_client/replace_metadata.rb +0 -81
  51. data/lib/wordpress_client/replace_terms.rb +0 -62
  52. data/spec/fixtures/post-with-forbidden-metadata.json +0 -1
  53. data/spec/integration/category_assignment_spec.rb +0 -29
  54. data/spec/integration/tag_assignment_spec.rb +0 -29
  55. data/spec/replace_metadata_spec.rb +0 -56
  56. data/spec/replace_terms_spec.rb +0 -51
@@ -1,81 +0,0 @@
1
- require "set"
2
-
3
- module WordpressClient
4
- class ReplaceMetadata
5
- def self.apply(connection, post, meta)
6
- instance = new(connection, post, meta)
7
- instance.apply
8
- instance.number_of_changes
9
- end
10
-
11
- attr_reader :number_of_changes
12
-
13
- def initialize(connection, post, meta)
14
- @connection = connection
15
- @post = post
16
- @existing_meta = post.meta
17
- @new_meta = stringify_keys(meta)
18
- @number_of_changes = 0
19
- end
20
-
21
- def apply
22
- all_keys.each do |key|
23
- action = determine_action(key)
24
- send(action, key, new_meta[key])
25
- end
26
- end
27
-
28
- private
29
- attr_reader :connection, :post, :new_meta, :existing_meta
30
-
31
- def meta_id(key)
32
- post.meta_id_for(key)
33
- end
34
-
35
- def all_keys
36
- (new_meta.keys + existing_meta.keys).to_set
37
- end
38
-
39
- def determine_action(key)
40
- old_value = existing_meta[key]
41
- new_value = new_meta[key]
42
-
43
- if old_value.nil? && !new_value.nil?
44
- :add
45
- elsif old_value == new_value
46
- :keep
47
- elsif new_value.nil?
48
- :remove
49
- else
50
- :replace
51
- end
52
- end
53
-
54
- def add(key, value)
55
- connection.create_without_response("posts/#{post.id}/meta", key: key, value: value)
56
- @number_of_changes += 1
57
- end
58
-
59
- def remove(key, *)
60
- connection.delete("posts/#{post.id}/meta/#{meta_id(key)}", force: true)
61
- @number_of_changes += 1
62
- end
63
-
64
- def replace(key, value)
65
- connection.patch_without_response(
66
- "posts/#{post.id}/meta/#{meta_id(key)}", key: key, value: value
67
- )
68
- @number_of_changes += 1
69
- end
70
-
71
- def keep(*)
72
- # Do nothing. This method is here to satisfy every action of #determine_action.
73
- end
74
-
75
- def stringify_keys(hash)
76
- hash.each_with_object({}) do |(key, value), new_hash|
77
- new_hash[key.to_s] = value
78
- end
79
- end
80
- end
81
- end
@@ -1,62 +0,0 @@
1
- require "set"
2
-
3
- module WordpressClient
4
- class ReplaceTerms
5
- def self.apply_categories(connection, post, category_ids)
6
- instance = new(
7
- connection,
8
- post.id,
9
- post.category_ids,
10
- category_ids
11
- )
12
- instance.replace("category")
13
- instance.number_of_changes
14
- end
15
-
16
- def self.apply_tags(connection, post, tag_ids)
17
- instance = new(
18
- connection,
19
- post.id,
20
- post.tag_ids,
21
- tag_ids
22
- )
23
- instance.replace("tag")
24
- instance.number_of_changes
25
- end
26
-
27
- def initialize(connection, post_id, existing_ids, new_ids)
28
- @connection = connection
29
- @post_id = post_id
30
- @existing_ids = existing_ids.to_set
31
- @wanted_ids = new_ids.to_set
32
- end
33
-
34
- def replace(type)
35
- ids_to_add.each { |id| add_term_id(id, type) }
36
- ids_to_remove.each { |id| remove_term_id(id, type) }
37
- end
38
-
39
- def number_of_changes
40
- ids_to_add.size + ids_to_remove.size
41
- end
42
-
43
- private
44
- attr_reader :connection, :post_id, :wanted_ids, :existing_ids
45
-
46
- def ids_to_add
47
- wanted_ids - existing_ids
48
- end
49
-
50
- def ids_to_remove
51
- existing_ids - wanted_ids
52
- end
53
-
54
- def add_term_id(id, type)
55
- connection.create_without_response("posts/#{post_id}/terms/#{type}/#{id}", {})
56
- end
57
-
58
- def remove_term_id(id, type)
59
- connection.delete("posts/#{post_id}/terms/#{type}/#{id}", force: true)
60
- end
61
- end
62
- end
@@ -1 +0,0 @@
1
- {"id":4,"date":null,"guid":{"rendered":"http:\/\/192.168.99.100:8181\/?p=4"},"modified":null,"modified_gmt":null,"slug":"","type":"post","link":"http:\/\/192.168.99.100:8181\/?p=4","title":{"rendered":"Metadata creation"},"content":{"rendered":""},"excerpt":{"rendered":""},"author":1,"featured_image":0,"comment_status":"open","ping_status":"open","sticky":false,"format":"standard","_links":{"self":[{"href":"http:\/\/192.168.99.100:8181\/wp-json\/wp\/v2\/posts\/4"}],"collection":[{"href":"http:\/\/192.168.99.100:8181\/wp-json\/wp\/v2\/posts"}],"author":[{"embeddable":true,"href":"http:\/\/192.168.99.100:8181\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/192.168.99.100:8181\/wp-json\/wp\/v2\/comments?post_id=4"}],"version-history":[{"href":"http:\/\/192.168.99.100:8181\/wp-json\/wp\/v2\/posts\/4\/revisions"}],"https:\/\/api.w.org\/attachment":[{"embeddable":true,"href":"http:\/\/192.168.99.100:8181\/wp-json\/wp\/v2\/media?post_parent=4"}],"https:\/\/api.w.org\/term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/192.168.99.100:8181\/wp-json\/wp\/v2\/posts\/4\/terms\/category"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/192.168.99.100:8181\/wp-json\/wp\/v2\/posts\/4\/terms\/tag"},{"taxonomy":"post_format","embeddable":true,"href":"http:\/\/192.168.99.100:8181\/wp-json\/wp\/v2\/posts\/4\/terms\/post_format"}],"https:\/\/api.w.org\/meta":[{"embeddable":true,"href":"http:\/\/192.168.99.100:8181\/wp-json\/wp\/v2\/posts\/4\/meta"}]},"_embedded":{"author":[{"avatar_urls":{"24":"http:\/\/2.gravatar.com\/avatar\/55502f40dc8b7c769880b10874abc9d0?s=24&d=mm&r=g","48":"http:\/\/2.gravatar.com\/avatar\/55502f40dc8b7c769880b10874abc9d0?s=48&d=mm&r=g","96":"http:\/\/2.gravatar.com\/avatar\/55502f40dc8b7c769880b10874abc9d0?s=96&d=mm&r=g"},"description":"","id":1,"link":"http:\/\/192.168.99.100:8181\/author\/test\/","name":"test","url":"","_links":{"self":[{"href":"http:\/\/192.168.99.100:8181\/wp-json\/wp\/v2\/users\/1"}],"collection":[{"href":"http:\/\/192.168.99.100:8181\/wp-json\/wp\/v2\/users"}]}}],"replies":[[{"id":1,"parent":0,"author":0,"author_name":"Mr WordPress","author_url":"https:\/\/wordpress.org\/","author_avatar_urls":{"24":"http:\/\/1.gravatar.com\/avatar\/?s=24&d=mm&r=g","48":"http:\/\/1.gravatar.com\/avatar\/?s=48&d=mm&r=g","96":"http:\/\/2.gravatar.com\/avatar\/?s=96&d=mm&r=g"},"date":"2015-11-03T07:47:41","content":{"rendered":"<p>Hi, this is a comment.<br \/>\nTo delete a comment, just log in and view the post&#039;s comments. There you will have the option to edit or delete them.<\/p>\n"},"link":"http:\/\/192.168.99.100:8181\/2015\/11\/03\/hello-world\/#comment-1","type":"comment","_links":{"self":[{"href":"http:\/\/192.168.99.100:8181\/wp-json\/wp\/v2\/comments\/1"}],"collection":[{"href":"http:\/\/192.168.99.100:8181\/wp-json\/wp\/v2\/comments"}],"up":[{"embeddable":true,"post_type":"post","href":"http:\/\/192.168.99.100:8181\/wp-json\/wp\/v2\/posts\/1"}]}}]],"https:\/\/api.w.org\/term":[[{"id":1,"link":"http:\/\/192.168.99.100:8181\/category\/uncategorized\/","name":"Uncategorized","slug":"uncategorized","taxonomy":"category","_links":{"self":[{"href":"http:\/\/192.168.99.100:8181\/wp-json\/wp\/v2\/terms\/category\/1"}],"collection":[{"href":"http:\/\/192.168.99.100:8181\/wp-json\/wp\/v2\/terms\/category"}]}}],[],[{"code":"rest_no_route","message":"No route was found matching the URL and request method","data":{"status":404}}]],"https:\/\/api.w.org\/meta":[[{"code":"rest_forbidden","message":"Sorry, you cannot view the meta for this post.","data":{"status":403}}]]}}
@@ -1,29 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe "Category assignment" do
4
- setup_integration_client
5
- let(:existing_post) { find_existing_post }
6
-
7
- it "can be set for multiple categories when creating a post" do
8
- category = client.create_category(name: "Assignment test 1")
9
- post = client.create_post(category_ids: [category.id], title: "Assignment test")
10
-
11
- expect(post.categories).to eq [category]
12
- end
13
-
14
- it "can be changed when updating a post" do
15
- category = client.create_category(name: "Assignment test 2")
16
- post = find_existing_post
17
-
18
- client.update_post(post.id, category_ids: [category.id])
19
-
20
- post = client.find_post(post.id)
21
- expect(post.categories).to eq [category]
22
- end
23
-
24
- def find_existing_post
25
- posts = client.posts(per_page: 1)
26
- expect(posts).to_not be_empty
27
- posts.first
28
- end
29
- end
@@ -1,29 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe "Tag assignment" do
4
- setup_integration_client
5
- let(:existing_post) { find_existing_post }
6
-
7
- it "can be set for multiple tags when creating a post" do
8
- tag = client.create_tag(name: "Assignment test 1")
9
- post = client.create_post(tag_ids: [tag.id], title: "Assignment test")
10
-
11
- expect(post.tags).to eq [tag]
12
- end
13
-
14
- it "can be changed when updating a post" do
15
- tag = client.create_tag(name: "Assignment test 2")
16
- post = find_existing_post
17
-
18
- client.update_post(post.id, tag_ids: [tag.id])
19
-
20
- post = client.find_post(post.id)
21
- expect(post.tags).to eq [tag]
22
- end
23
-
24
- def find_existing_post
25
- posts = client.posts(per_page: 1)
26
- expect(posts).to_not be_empty
27
- posts.first
28
- end
29
- end
@@ -1,56 +0,0 @@
1
- require "spec_helper"
2
-
3
- module WordpressClient
4
- describe ReplaceMetadata do
5
- it "does nothing if the new metadata is equal to the existing one" do
6
- post = instance_double(Post, id: 5, meta: {"existing" => "1"})
7
-
8
- # Note: connection double does not accept any message.
9
- connection = instance_double(Connection)
10
-
11
- ReplaceMetadata.apply(connection, post, existing: "1")
12
- end
13
-
14
- it "adds missing metadata" do
15
- connection = instance_double(Connection)
16
- post = instance_double(Post, id: 5, meta: {"existing" => "1"})
17
-
18
- expect(connection).to receive(:create_without_response).with(
19
- "posts/5/meta", key: "new", value: "2"
20
- )
21
-
22
- ReplaceMetadata.apply(connection, post, existing: "1", new: "2")
23
- end
24
-
25
- it "replaces changed metadata" do
26
- connection = instance_double(Connection)
27
- post = instance_double(Post, id: 5, meta: {"change_me" => "1"})
28
-
29
- expect(post).to receive(:meta_id_for).with("change_me").and_return(13)
30
-
31
- expect(connection).to receive(:patch_without_response).with(
32
- "posts/5/meta/13", key: "change_me", value: "2"
33
- )
34
-
35
- ReplaceMetadata.apply(connection, post, change_me: "2")
36
- end
37
-
38
- it "removes extra metadata" do
39
- connection = instance_double(Connection)
40
- post = instance_double(Post, id: 5, meta: {"old" => "1", "new" => "2"})
41
-
42
- expect(post).to receive(:meta_id_for).with("old").and_return(45)
43
- expect(connection).to receive(:delete).with("posts/5/meta/45", force: true)
44
-
45
- ReplaceMetadata.apply(connection, post, new: "2")
46
- end
47
-
48
- it "returns the number of changes" do
49
- connection = instance_double(Connection).as_null_object
50
- post = instance_double(Post, id: 5, meta: {"old" => "1", "change" => "2"}).as_null_object
51
-
52
- result = ReplaceMetadata.apply(connection, post, change: "3", extra: "4")
53
- expect(result).to eq 3
54
- end
55
- end
56
- end
@@ -1,51 +0,0 @@
1
- require "spec_helper"
2
-
3
- module WordpressClient
4
- describe ReplaceTerms do
5
- it "adds missing categories" do
6
- connection = double(Connection)
7
- post = double(Post, id: 40, category_ids: [1])
8
-
9
- expect(connection).to receive(:create_without_response).with("posts/40/terms/category/5", {})
10
-
11
- ReplaceTerms.apply_categories(connection, post, [1, 5])
12
- end
13
-
14
- it "removes extra categories" do
15
- connection = double(Connection)
16
- post = double(Post, id: 40, category_ids: [8, 9, 10])
17
-
18
- expect(connection).to receive(:delete).with("posts/40/terms/category/8", force: true)
19
- expect(connection).to receive(:delete).with("posts/40/terms/category/9", force: true)
20
-
21
- ReplaceTerms.apply_categories(connection, post, [10])
22
- end
23
-
24
- it "adds missing tags" do
25
- connection = double(Connection)
26
- post = double(Post, id: 40, tag_ids: [1])
27
-
28
- expect(connection).to receive(:create_without_response).with("posts/40/terms/tag/5", {})
29
-
30
- ReplaceTerms.apply_tags(connection, post, [1, 5])
31
- end
32
-
33
- it "removes extra tags" do
34
- connection = double(Connection)
35
- post = double(Post, id: 40, tag_ids: [8, 9, 10])
36
-
37
- expect(connection).to receive(:delete).with("posts/40/terms/tag/8", force: true)
38
- expect(connection).to receive(:delete).with("posts/40/terms/tag/9", force: true)
39
-
40
- ReplaceTerms.apply_tags(connection, post, [10])
41
- end
42
-
43
- it "returns the amount of changes made" do
44
- connection = double(Connection).as_null_object
45
- post = double(Post, id: 40, tag_ids: [8, 9, 10])
46
-
47
- result = ReplaceTerms.apply_tags(connection, post, [10, 11])
48
- expect(result).to eq 3
49
- end
50
- end
51
- end