wordpress_client 0.0.1 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
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