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.
- checksums.yaml +5 -5
- data/.circleci/config.yml +30 -0
- data/.codeclimate.yml +23 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +147 -90
- data/.yardopts +1 -0
- data/Changelog.md +16 -0
- data/Gemfile +6 -1
- data/README.md +48 -14
- data/Rakefile +37 -0
- data/lib/wordpress_client/category.rb +2 -0
- data/lib/wordpress_client/client.rb +235 -79
- data/lib/wordpress_client/connection.rb +10 -10
- data/lib/wordpress_client/errors.rb +41 -6
- data/lib/wordpress_client/media.rb +49 -1
- data/lib/wordpress_client/media_parser.rb +3 -0
- data/lib/wordpress_client/paginated_collection.rb +61 -4
- data/lib/wordpress_client/post.rb +63 -16
- data/lib/wordpress_client/post_parser.rb +12 -39
- data/lib/wordpress_client/rest_parser.rb +4 -0
- data/lib/wordpress_client/tag.rb +2 -0
- data/lib/wordpress_client/term.rb +30 -0
- data/lib/wordpress_client/version.rb +5 -1
- data/lib/wordpress_client.rb +21 -5
- data/spec/client_spec.rb +17 -181
- data/spec/connection_spec.rb +15 -14
- data/spec/docker/Dockerfile +35 -10
- data/spec/docker/README.md +53 -16
- data/spec/docker/dbdump.sql.gz +0 -0
- data/spec/docker/restore-dbdump.sh +2 -2
- data/spec/docker/yum.repos.d/CentOS-Base.repo +25 -0
- data/spec/fixtures/image-media.json +1 -1
- data/spec/fixtures/post-with-metadata.json +99 -1
- data/spec/fixtures/simple-post.json +324 -1
- data/spec/integration/attachments_crud_spec.rb +1 -1
- data/spec/integration/posts_crud_spec.rb +1 -1
- data/spec/integration/posts_finding_spec.rb +0 -69
- data/spec/integration/posts_metadata_spec.rb +11 -11
- data/spec/integration/posts_with_attachments_spec.rb +20 -6
- data/spec/media_spec.rb +14 -0
- data/spec/post_spec.rb +5 -31
- data/spec/spec_helper.rb +1 -0
- data/spec/support/docker_runner.rb +33 -13
- data/spec/support/wordpress_server.rb +112 -74
- data/wordpress_client.gemspec +17 -17
- metadata +43 -31
- data/.hound.yml +0 -2
- data/.ruby-version +0 -1
- data/circle.yml +0 -3
- data/lib/wordpress_client/replace_metadata.rb +0 -81
- data/lib/wordpress_client/replace_terms.rb +0 -62
- data/spec/fixtures/post-with-forbidden-metadata.json +0 -1
- data/spec/integration/category_assignment_spec.rb +0 -29
- data/spec/integration/tag_assignment_spec.rb +0 -29
- data/spec/replace_metadata_spec.rb +0 -56
- data/spec/replace_terms_spec.rb +0 -51
@@ -1,19 +1,58 @@
|
|
1
1
|
module WordpressClient
|
2
|
+
# Represents a media record in Wordpress.
|
2
3
|
class Media
|
3
4
|
attr_accessor(
|
4
|
-
:id, :slug, :title_html, :description,
|
5
|
+
:id, :slug, :media_type, :title_html, :description, :alt_text,
|
5
6
|
:date, :updated_at,
|
6
7
|
:guid, :link, :media_details
|
7
8
|
)
|
8
9
|
|
10
|
+
# @!attribute [r] media_type
|
11
|
+
# @return [String] the type of the media
|
12
|
+
# @example
|
13
|
+
# media.media_type #=> "image"
|
14
|
+
|
15
|
+
# @!attribute [rw] title_html
|
16
|
+
# @return [String] the title of the media, HTML escaped
|
17
|
+
# @example
|
18
|
+
# media.title_html #=> "Sunset — Painting by some person"
|
19
|
+
|
20
|
+
# @!attribute [rw] date
|
21
|
+
# @return [Time, nil] the date of the media, in UTC if available
|
22
|
+
|
23
|
+
# @!attribute [rw] updated_at
|
24
|
+
# @return [Time, nil] the modification date of the media, in UTC if available
|
25
|
+
|
26
|
+
# @!attribute [rw] guid
|
27
|
+
# Returns the permalink/GUID – or +source_url+ – of the media.
|
28
|
+
#
|
29
|
+
# Media that are embedded in posts have a +source_url+ attribute and no
|
30
|
+
# +guid+, and stand-alone media has a +guid+ but no +source_url+. They
|
31
|
+
# are both backed by the same data, so this method handles both cases,
|
32
|
+
# and is aliased to both names.
|
33
|
+
#
|
34
|
+
# @return [String] the permalink/GUID – or +source_url+ – of the media
|
35
|
+
|
36
|
+
# @!attribute [rw] media_details
|
37
|
+
# Returns the media details if available.
|
38
|
+
#
|
39
|
+
# Media details cannot be documented here. It's up to you to handle this
|
40
|
+
# generic "payload" attribute the best way you can.
|
41
|
+
#
|
42
|
+
# @return [Hash<String,Object>] the media details returned from the server
|
43
|
+
|
44
|
+
# @api private
|
9
45
|
def self.parse(data)
|
10
46
|
MediaParser.parse(data)
|
11
47
|
end
|
12
48
|
|
49
|
+
# Creates a new instance, populating the fields with the passed values.
|
13
50
|
def initialize(
|
14
51
|
id: nil,
|
15
52
|
slug: nil,
|
53
|
+
media_type: nil,
|
16
54
|
title_html: nil,
|
55
|
+
alt_text: nil,
|
17
56
|
description: nil,
|
18
57
|
date: nil,
|
19
58
|
updated_at: nil,
|
@@ -23,9 +62,11 @@ module WordpressClient
|
|
23
62
|
)
|
24
63
|
@id = id
|
25
64
|
@slug = slug
|
65
|
+
@media_type = media_type
|
26
66
|
@title_html = title_html
|
27
67
|
@date = date
|
28
68
|
@updated_at = updated_at
|
69
|
+
@alt_text = alt_text
|
29
70
|
@description = description
|
30
71
|
@guid = guid
|
31
72
|
@link = link
|
@@ -33,5 +74,12 @@ module WordpressClient
|
|
33
74
|
end
|
34
75
|
|
35
76
|
alias source_url guid
|
77
|
+
|
78
|
+
# Returns the same +Media+ instance if it is an image, else +nil+.
|
79
|
+
def as_image
|
80
|
+
if media_type == "image"
|
81
|
+
self
|
82
|
+
end
|
83
|
+
end
|
36
84
|
end
|
37
85
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
module WordpressClient
|
2
|
+
# @private
|
2
3
|
class MediaParser
|
3
4
|
include RestParser
|
4
5
|
|
@@ -26,8 +27,10 @@ module WordpressClient
|
|
26
27
|
|
27
28
|
def assign_basic(media)
|
28
29
|
media.id = data.fetch("id")
|
30
|
+
media.media_type = data.fetch("media_type")
|
29
31
|
media.slug = data.fetch("slug")
|
30
32
|
media.link = data.fetch("link")
|
33
|
+
media.alt_text = data.fetch("alt_text")
|
31
34
|
media.description = data["description"]
|
32
35
|
media.media_details = data["media_details"]
|
33
36
|
end
|
@@ -1,9 +1,31 @@
|
|
1
1
|
require "delegate"
|
2
2
|
|
3
3
|
module WordpressClient
|
4
|
+
# Represents a paginated list of resources.
|
5
|
+
#
|
6
|
+
# @note This class has the full +Array+ interface by using
|
7
|
+
# +DelegateClass(Array)+. Methods do not show up in the documentation
|
8
|
+
# unless when manually documented.
|
4
9
|
class PaginatedCollection < DelegateClass(Array)
|
10
|
+
# @!method size
|
11
|
+
# @return [Fixnum] the number of records actually in this "page".
|
12
|
+
# @see Array#size
|
13
|
+
|
5
14
|
attr_reader :total, :current_page, :per_page
|
6
15
|
|
16
|
+
# @!attribute [r] total
|
17
|
+
# @return [Fixnum] the total hits in the full collection.
|
18
|
+
# @see #size #size is the size of the current "page".
|
19
|
+
|
20
|
+
# @!attribute [r] current_page
|
21
|
+
# @return [Fixnum] the current page number, where +1+ is the first page.
|
22
|
+
|
23
|
+
# @!attribute [r] per_page
|
24
|
+
# @return [Fixnum] the current page size setting, for example +30+.
|
25
|
+
|
26
|
+
# Create a new collection using the passed array +entries+.
|
27
|
+
#
|
28
|
+
# @param entries [Array] the original "page" array
|
7
29
|
def initialize(entries, total:, current_page:, per_page:)
|
8
30
|
super(entries)
|
9
31
|
@total = total
|
@@ -11,12 +33,15 @@ module WordpressClient
|
|
11
33
|
@per_page = per_page
|
12
34
|
end
|
13
35
|
|
14
|
-
#
|
15
|
-
# Pagination methods. Fulfilling will_paginate protocol
|
16
|
-
#
|
36
|
+
# @!group will_paginate protocol
|
17
37
|
|
18
38
|
alias total_entries total
|
19
39
|
|
40
|
+
# @note This method is used by +will_paginate+. By implementing this
|
41
|
+
# interface, you can use a {PaginatedCollection} in place of a
|
42
|
+
# +WillPaginate::Collection+ to render pagination details.
|
43
|
+
# @return [Fixnum] the total number of pages that can show the {#total}
|
44
|
+
# entries with {#per_page} records per page. +0+ if no entries.
|
20
45
|
def total_pages
|
21
46
|
if total.zero? || per_page.zero?
|
22
47
|
0
|
@@ -25,23 +50,53 @@ module WordpressClient
|
|
25
50
|
end
|
26
51
|
end
|
27
52
|
|
53
|
+
# @note This method is used by +will_paginate+. By implementing this
|
54
|
+
# interface, you can use a {PaginatedCollection} in place of a
|
55
|
+
# +WillPaginate::Collection+ to render pagination details.
|
56
|
+
# @return [Fixnum, nil] the next page number or +nil+ if on last page.
|
28
57
|
def next_page
|
29
58
|
if current_page < total_pages
|
30
59
|
current_page + 1
|
31
60
|
end
|
32
61
|
end
|
33
62
|
|
63
|
+
# @note This method is used by +will_paginate+. By implementing this
|
64
|
+
# interface, you can use a {PaginatedCollection} in place of a
|
65
|
+
# +WillPaginate::Collection+ to render pagination details.
|
66
|
+
# @return [Fixnum, nil] the previous page number or +nil+ if on first page.
|
34
67
|
def previous_page
|
35
68
|
if current_page > 1
|
36
69
|
current_page - 1
|
37
70
|
end
|
38
71
|
end
|
39
72
|
|
73
|
+
# @note This method is used by +will_paginate+. By implementing this
|
74
|
+
# interface, you can use a {PaginatedCollection} in place of a
|
75
|
+
# +WillPaginate::Collection+ to render pagination details.
|
76
|
+
# @return [Boolean] if the current page is out of bounds, e.g. less than 1
|
77
|
+
# or higher than {#total_pages}.
|
40
78
|
def out_of_bounds?
|
41
79
|
current_page < 1 || current_page > total_pages
|
42
80
|
end
|
43
81
|
|
44
|
-
# will_paginate
|
82
|
+
# @note This method is used by +will_paginate+. By implementing this
|
83
|
+
# interface, you can use a {PaginatedCollection} in place of a
|
84
|
+
# +WillPaginate::Collection+ to render pagination details.
|
85
|
+
#
|
86
|
+
# @note will_paginate < 3.0 has this method, but it's no longer present in
|
87
|
+
# newer will_paginate.
|
88
|
+
#
|
89
|
+
# Returns the offset of the current page.
|
90
|
+
#
|
91
|
+
# @example First page offset
|
92
|
+
# collection.per_page # => 20
|
93
|
+
# collection.current_page # => 1
|
94
|
+
# collection.offset #=> 0
|
95
|
+
# @example Later offset
|
96
|
+
# collection.per_page # => 20
|
97
|
+
# collection.current_page # => 3
|
98
|
+
# collection.offset #=> 40
|
99
|
+
#
|
45
100
|
def offset
|
46
101
|
if current_page > 0
|
47
102
|
(current_page - 1) * per_page
|
@@ -49,5 +104,7 @@ module WordpressClient
|
|
49
104
|
0
|
50
105
|
end
|
51
106
|
end
|
107
|
+
|
108
|
+
# @!endgroup
|
52
109
|
end
|
53
110
|
end
|
@@ -1,18 +1,68 @@
|
|
1
1
|
require "time"
|
2
2
|
|
3
3
|
module WordpressClient
|
4
|
+
# Represents a post in Wordpress.
|
5
|
+
#
|
6
|
+
# @see http://v2.wp-api.org/reference/posts/ API documentation for Post
|
4
7
|
class Post
|
5
8
|
attr_accessor(
|
6
9
|
:id, :slug, :url, :guid, :status,
|
7
10
|
:title_html, :excerpt_html, :content_html,
|
8
11
|
:updated_at, :date,
|
9
|
-
:categories, :tags, :meta, :
|
12
|
+
:categories, :tags, :meta, :featured_media,
|
13
|
+
:tag_ids, :category_ids, :featured_media_id
|
10
14
|
)
|
11
15
|
|
16
|
+
# @!attribute [rw] title_html
|
17
|
+
# @return [String] the title of the media, HTML escaped
|
18
|
+
# @example
|
19
|
+
# post.title_html #=> "Fire & diamonds!"
|
20
|
+
|
21
|
+
# @!attribute [rw] date
|
22
|
+
# @return [Time, nil] the date of the post, in UTC if available
|
23
|
+
|
24
|
+
# @!attribute [rw] updated_at
|
25
|
+
# @return [Time, nil] the modification date of the post, in UTC if available
|
26
|
+
|
27
|
+
# @!attribute [rw] guid
|
28
|
+
# @return [String] the permalink/GUID of the post for internal addressing
|
29
|
+
# @see #url
|
30
|
+
|
31
|
+
# @!attribute [rw] url
|
32
|
+
# @return [String] the URL (link) to the post
|
33
|
+
|
34
|
+
# @!attribute [rw] status
|
35
|
+
# @return ["publish", "future", "draft", "pending", "private", nil] the
|
36
|
+
# current status of the post, or +nil+ if undetermined
|
37
|
+
|
38
|
+
# @!attribute [rw] categories
|
39
|
+
# @return [Array[Category]] the {Category Categories} the post belongs to.
|
40
|
+
# @see Category
|
41
|
+
|
42
|
+
# @!attribute [rw] tags
|
43
|
+
# @return [Array[Tag]] the {Tag Tags} the post belongs to.
|
44
|
+
# @see Tag
|
45
|
+
|
46
|
+
# @!attribute [rw] featured_media
|
47
|
+
# @return [Media, nil] the featured image, as an instance of {Media}
|
48
|
+
# @see Media
|
49
|
+
|
50
|
+
# @!attribute [rw] meta
|
51
|
+
# Returns the Post meta, as a +Hash+ of +String => String+.
|
52
|
+
#
|
53
|
+
# @example
|
54
|
+
# post.meta # => {"Mood" => "Happy", "reviewed_by" => "user:45"}
|
55
|
+
#
|
56
|
+
# @return [Hash<String,String>] the post meta, as a Hash.
|
57
|
+
# @see Category
|
58
|
+
# @see Client#update_post
|
59
|
+
|
60
|
+
# @api private
|
12
61
|
def self.parse(data)
|
13
62
|
PostParser.parse(data)
|
14
63
|
end
|
15
64
|
|
65
|
+
# Construct a new instance with the given attributes.
|
16
66
|
def initialize(
|
17
67
|
id: nil,
|
18
68
|
slug: nil,
|
@@ -26,9 +76,10 @@ module WordpressClient
|
|
26
76
|
date: nil,
|
27
77
|
categories: [],
|
28
78
|
tags: [],
|
29
|
-
|
30
|
-
|
31
|
-
|
79
|
+
category_ids: [],
|
80
|
+
tag_ids: [],
|
81
|
+
featured_media: nil,
|
82
|
+
meta: {}
|
32
83
|
)
|
33
84
|
@id = id
|
34
85
|
@slug = slug
|
@@ -42,21 +93,17 @@ module WordpressClient
|
|
42
93
|
@date = date
|
43
94
|
@categories = categories
|
44
95
|
@tags = tags
|
45
|
-
@
|
96
|
+
@category_ids = category_ids
|
97
|
+
@tag_ids = tag_ids
|
98
|
+
@featured_media = featured_media
|
46
99
|
@meta = meta
|
47
|
-
@meta_ids = meta_ids
|
48
|
-
end
|
49
|
-
|
50
|
-
def category_ids() categories.map(&:id) end
|
51
|
-
|
52
|
-
def tag_ids() tags.map(&:id) end
|
53
|
-
|
54
|
-
def featured_image_id
|
55
|
-
featured_image && featured_image.id
|
56
100
|
end
|
57
101
|
|
58
|
-
|
59
|
-
|
102
|
+
# Returns the featured media, if the featured media is an image.
|
103
|
+
def featured_image
|
104
|
+
if featured_media
|
105
|
+
featured_media.as_image
|
106
|
+
end
|
60
107
|
end
|
61
108
|
end
|
62
109
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
module WordpressClient
|
2
|
+
# @private
|
2
3
|
class PostParser
|
3
4
|
include RestParser
|
4
5
|
|
@@ -12,16 +13,13 @@ module WordpressClient
|
|
12
13
|
end
|
13
14
|
|
14
15
|
def to_post
|
15
|
-
|
16
|
-
post = Post.new(meta: meta, meta_ids: meta_ids)
|
17
|
-
|
16
|
+
post = Post.new
|
18
17
|
assign_basic(post)
|
19
18
|
assign_dates(post)
|
20
19
|
assign_rendered(post)
|
21
20
|
assign_categories(post)
|
22
21
|
assign_tags(post)
|
23
|
-
|
24
|
-
|
22
|
+
assign_featured_media(post)
|
25
23
|
post
|
26
24
|
end
|
27
25
|
|
@@ -33,6 +31,10 @@ module WordpressClient
|
|
33
31
|
post.slug = data["slug"]
|
34
32
|
post.url = data["link"]
|
35
33
|
post.status = data["status"]
|
34
|
+
post.meta = data["meta"]
|
35
|
+
post.category_ids = data["categories"]
|
36
|
+
post.tag_ids = data["tags"]
|
37
|
+
post.featured_media_id = data["featured_media"]
|
36
38
|
end
|
37
39
|
|
38
40
|
def assign_dates(post)
|
@@ -59,34 +61,19 @@ module WordpressClient
|
|
59
61
|
end
|
60
62
|
end
|
61
63
|
|
62
|
-
def
|
63
|
-
featured_id = data["
|
64
|
+
def assign_featured_media(post)
|
65
|
+
featured_id = data["featured_media"]
|
64
66
|
if featured_id
|
65
|
-
features = (embedded["
|
67
|
+
features = (embedded["wp:featuredmedia"] || []).flatten
|
66
68
|
media = features.detect { |feature| feature["id"] == featured_id }
|
67
69
|
if media
|
68
|
-
post.
|
70
|
+
post.featured_media = Media.parse(media)
|
69
71
|
end
|
70
72
|
end
|
71
73
|
end
|
72
74
|
|
73
|
-
def parse_metadata
|
74
|
-
embedded_metadata = (embedded["https://api.w.org/meta"] || []).flatten
|
75
|
-
validate_embedded_metadata(embedded_metadata)
|
76
|
-
|
77
|
-
meta = {}
|
78
|
-
meta_ids = {}
|
79
|
-
|
80
|
-
embedded_metadata.each do |entry|
|
81
|
-
meta[entry.fetch("key")] = entry.fetch("value")
|
82
|
-
meta_ids[entry.fetch("key")] = entry.fetch("id")
|
83
|
-
end
|
84
|
-
|
85
|
-
[meta, meta_ids]
|
86
|
-
end
|
87
|
-
|
88
75
|
def embedded_terms(type)
|
89
|
-
term_collections = embedded["https://api.w.org/term"] || []
|
76
|
+
term_collections = embedded["wp:term"] || embedded["https://api.w.org/term"] || []
|
90
77
|
|
91
78
|
# term_collections is an array of arrays with terms in them. We can see
|
92
79
|
# the type of the "collection" by inspecting the first child's taxonomy.
|
@@ -95,19 +82,5 @@ module WordpressClient
|
|
95
82
|
} || []
|
96
83
|
end
|
97
84
|
|
98
|
-
def validate_embedded_metadata(embedded_metadata)
|
99
|
-
if embedded_metadata.size == 1 && embedded_metadata.first["code"]
|
100
|
-
error = embedded_metadata.first
|
101
|
-
case error["code"]
|
102
|
-
when "rest_forbidden"
|
103
|
-
raise UnauthorizedError, error.fetch(
|
104
|
-
"message", "You are not authorized to see meta for this post."
|
105
|
-
)
|
106
|
-
else
|
107
|
-
raise Error, "Could not retreive meta for this post: " \
|
108
|
-
"#{error["code"]} – #{error["message"]}"
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
112
85
|
end
|
113
86
|
end
|
data/lib/wordpress_client/tag.rb
CHANGED
@@ -1,7 +1,27 @@
|
|
1
1
|
module WordpressClient
|
2
|
+
# @abstract Implement a subclass for the resource type.
|
3
|
+
#
|
4
|
+
# Implementation for the abstract "term" in Wordpress.
|
5
|
+
#
|
6
|
+
# @see Category
|
7
|
+
# @see Tag
|
2
8
|
class Term
|
3
9
|
attr_reader :id, :name_html, :slug
|
4
10
|
|
11
|
+
# @!attribute [r] id
|
12
|
+
# @return [Fixnum] The ID of the resource in Wordpress.
|
13
|
+
|
14
|
+
# @!attribute [r] name_html
|
15
|
+
# @return [String] The name of the resource, HTML encoded.
|
16
|
+
# @example
|
17
|
+
# term.name_html #=> "Father & Daughter stuff"
|
18
|
+
|
19
|
+
# @!attribute [r] slug
|
20
|
+
# @return [String] The slug of the resource in Wordpress.
|
21
|
+
|
22
|
+
# @api private
|
23
|
+
#
|
24
|
+
# Parses a data structure from a WP API response body into this term type.
|
5
25
|
def self.parse(data)
|
6
26
|
new(
|
7
27
|
id: data.fetch("id"),
|
@@ -16,6 +36,15 @@ module WordpressClient
|
|
16
36
|
@slug = slug
|
17
37
|
end
|
18
38
|
|
39
|
+
# @api private
|
40
|
+
# Compares another instance. All attributes in this list must be equal for
|
41
|
+
# the instances to be equal:
|
42
|
+
#
|
43
|
+
# * +id+
|
44
|
+
# * +name_html+
|
45
|
+
# * +slug+
|
46
|
+
#
|
47
|
+
# One must also not be a subclass of the other; they must be the exact same class.
|
19
48
|
def ==(other)
|
20
49
|
if other.is_a? Term
|
21
50
|
other.class == self.class &&
|
@@ -27,6 +56,7 @@ module WordpressClient
|
|
27
56
|
end
|
28
57
|
end
|
29
58
|
|
59
|
+
# Shows a nice representation of the term type.
|
30
60
|
def inspect
|
31
61
|
"#<#{self.class} ##{id} #{name_html.inspect} (#{slug})>"
|
32
62
|
end
|
data/lib/wordpress_client.rb
CHANGED
@@ -15,11 +15,27 @@ require "wordpress_client/post_parser"
|
|
15
15
|
require "wordpress_client/media"
|
16
16
|
require "wordpress_client/media_parser"
|
17
17
|
|
18
|
-
require "wordpress_client/replace_terms"
|
19
|
-
require "wordpress_client/replace_metadata"
|
20
|
-
|
21
18
|
module WordpressClient
|
22
|
-
|
23
|
-
|
19
|
+
# Initialize a new client using the provided connection details.
|
20
|
+
# You need to provide authentication details, and the user must have +edit+
|
21
|
+
# permissions on the blog if you want to read Post Meta, or to modify
|
22
|
+
# anything.
|
23
|
+
#
|
24
|
+
# @example
|
25
|
+
# client = WordpressClient.new(
|
26
|
+
# url: "https://blog.example.com/wp-json",
|
27
|
+
# username: "bot",
|
28
|
+
# password: ENV.fetch("WORDPRESS_PASSWORD"),
|
29
|
+
# )
|
30
|
+
#
|
31
|
+
# @see Client Client, for the methods available after creating the connection.
|
32
|
+
#
|
33
|
+
# @param url [String] The base URL to the wordpress install, including
|
34
|
+
# +/wp-json+.
|
35
|
+
# @param username [String] A valid username on the wordpress installation.
|
36
|
+
# @param password [String] The password for the provided user.
|
37
|
+
# @return {Client}
|
38
|
+
def self.new(url:, username:, password:)
|
39
|
+
Client.new(Connection.new(url: url, username: username, password: password))
|
24
40
|
end
|
25
41
|
end
|