ascii_press 0.3.0 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 37d6a2018a0f90579ba668606675a3c56476e234
4
- data.tar.gz: ecb49c8631633d9486776fa24fa0740b95503e64
3
+ metadata.gz: e8f78af8f04afac24ade0bd60bc336fc12d22408
4
+ data.tar.gz: 967d7ec8a7a89913f0b18abd59272089c6beea94
5
5
  SHA512:
6
- metadata.gz: 0de878a7dabb9d416bad0672f746f2e53f622c2367c0ec85dd379b2981b64ea5e38e6c25bb70896f9edbe393ab5d2ccdbb1d779e6d0b395f5df816c3b14835de
7
- data.tar.gz: fe030d7a0600125fa28adb2ba4529eb971026c4a58ee685354542b9f8dcdaf0e9feaefc85c55d03380569ed9ddaa556a3db4ed2e6334b21fc8aa640a7be4e924
6
+ metadata.gz: 76597f4f7881a111821d526f0a84cc08106ac1824d13852b12098445f7f0856f2175bfcd1d2dad02fe91b4aa71ec87ddba82e6810d356ca6ab1bfa865111708e
7
+ data.tar.gz: c9218ef67f48ce921db46d839f631bccceb55002ab302125bb085e6bcbac1dbead9c6eeb4bbf259e6e33fcb26337cafab27633bd63097d2d3f08c592336d591c
data/README.md CHANGED
@@ -28,36 +28,21 @@ WP_USERNAME = 'fake'
28
28
  WP_PASSWORD = 'pass'
29
29
  WP_POST_TYPE = 'faq'
30
30
 
31
- # Available keys for options are:
32
- # `:asciidoc_options`: Passed directly to the `Asciidoctor.load` method
33
- # `:before_convertion`: Proc which is given the asciidoctor text. Whatever is returned is passed to `Asciidoctor.load`
34
- # `:after_conversion`: Proc which is given the html text after the Asciidoctor conversion. Whatever is returned will be uploaded to WordPress
35
- # `:extra_tags_proc`: Proc which is given the `AsciiPress::Renderer::Rendering` object (see below). Whatever is returned will be used as the WordPress Post's tags
36
- renderer = AsciiPress::Renderer.new(extra_tags_proc: -> (rendering) { ['tag-for-all'] }, asciidoc_options: {attributes: 'allow-uri-read'})
37
-
38
- wp_syncer = AsciiPress::WordPressSyncer.new(WP_HOSTNAME, WP_USERNAME, WP_PASSWORD, renderer, WP_POST_TYPE
31
+ renderer = AsciiPress::Renderer.new(tags_proc: -> (rendering) { rendering.tags + ['tag-for-all'] },
32
+ asciidoc_options: {attributes: 'allow-uri-read'})
33
+
34
+ syncer = AsciiPress::WordPressSyncer.new(WP_HOSTNAME, WP_USERNAME, WP_PASSWORD, renderer, WP_POST_TYPE
39
35
  post_type: ENV['BLOG_POST_TYPE'],
40
36
  logger: LOGGER,
41
37
  delete_not_found: delete_not_found,
42
38
  generate_tags: true,
43
39
  filter_proc: filter_proc)
44
- ```
45
-
46
- ### `AsciiPress::Renderer::Rendering`
47
-
48
- Provides the following methods:
49
40
 
50
- * `html` The HTML resulting from the asciidoc
51
- * `doc` The `Asciidoctor::Document` object from the `asciidoctor` gem
52
- * `data` The adoc file's attributes standardized with symbol keys and string values
53
- * `tags` The tags which will be set in `WordPress`
54
-
55
-
56
- ## Development
57
-
58
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
41
+ adoc_file_paths = `find . -name "*.adoc"`.split(/[\n\r]+/)
42
+ syncer.sync(adoc_file_paths)
43
+ ```
59
44
 
60
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
45
+ See the [API documentation](http://www.rubydoc.info/github/cheerfulstoic/ascii_press/master) for more details on arguments and options
61
46
 
62
47
  ## Contributing
63
48
 
@@ -9,29 +9,47 @@ require 'json'
9
9
  require 'active_support/core_ext/enumerable'
10
10
 
11
11
  module AsciiPress
12
+ # For setting the default logger
12
13
  def self.logger=(new_logger)
13
14
  @logger = new_logger
14
15
  end
15
16
 
17
+ # A default STDOUT logger
16
18
  def self.logger
17
19
  @logger || Logger.new(STDOUT)
18
20
  end
19
21
 
20
22
  class Renderer
21
23
  class Rendering
22
- attr_reader :html, :doc, :data
24
+ # @return [String] The HTML resulting from the asciidoc
25
+ attr_reader :html
26
+
27
+ # @return [Asciidoctor::Document] The document from the +asciidoctor+ gem
28
+ attr_reader :doc
29
+
30
+ # @return [Hash] The adoc file's attributes standardized with symbol keys and string values
31
+ attr_reader :data
32
+
33
+ # @return [Array <String>] The tags which will be set in +WordPress+
23
34
  attr_accessor :tags
24
35
 
36
+ # @return [String] The title that will be used
37
+ attr_accessor :title
38
+
39
+ # Create a new {Rendering} object (intended to be used by Syncers like {WordPressSyncer})
25
40
  def initialize(html, doc, data)
26
41
  @html = html
27
42
  @doc = doc
28
43
  @data = data
44
+ @title = doc.doctitle
29
45
  end
30
46
 
47
+ # @!visibility private
31
48
  def attribute_value(name, default = nil)
32
49
  doc.attributes[name.to_s] || default
33
50
  end
34
51
 
52
+ # @!visibility private
35
53
  def list_attribute_value(name, default = [])
36
54
  value = attribute_value(name, :VALUE_DOES_NOT_EXIST)
37
55
  if value == :VALUE_DOES_NOT_EXIST
@@ -41,15 +59,23 @@ module AsciiPress
41
59
  end
42
60
  end
43
61
 
62
+ # @!visibility private
44
63
  def attribute_exists?(name)
45
64
  doc.attributes.key?(name.to_s)
46
65
  end
47
66
  end
48
67
 
49
- def initialize(options = {})
68
+ # @param options [Hash]
69
+ # @option options [Hash] :asciidoc_options Passed directly to the +Asciidoctor.load+ method. See the {http://asciidoctor.org/rdoc/Asciidoctor.html AsciiDoctor documentation}
70
+ # @option options [Proc] :before_convertion Proc which is given the asciidoctor text. Whatever is returned is passed to +Asciidoctor.load+. See the {http://asciidoctor.org/rdoc/Asciidoctor.html AsciiDoctor documentation}
71
+ # @option options [Proc] :after_conversion Proc which is given the html text after the Asciidoctor conversion. Whatever is returned will be uploaded to WordPress
72
+ # @option options [Proc] :rendering_proc Proc which is given the {Rendering} object (see below). Changes made be made to the rendering in-place
73
+ #
74
+ def initialize(options = {asciidoc_options: {}})
50
75
  @options = options
51
76
  end
52
77
 
78
+ # @!visibility private
53
79
  def render(adoc_file_path)
54
80
  doc = nil
55
81
  errors = capture_stderr do
@@ -79,12 +105,13 @@ module AsciiPress
79
105
  rendering.tags << 'public' if rendering.attribute_exists?(:public)
80
106
  rendering.tags << 'private' if rendering.attribute_exists?(:private)
81
107
 
82
- if @options[:extra_tags_proc]
83
- rendering.tags.concat @options[:extra_tags_proc].call(rendering)
108
+ if @options[:rendering_proc]
109
+ rendering.tags = @options[:rendering_proc].call(rendering)
84
110
  end
85
111
  end
86
112
  end
87
113
 
114
+ private
88
115
  def capture_stderr
89
116
  real_stderr, $stderr = $stderr, StringIO.new
90
117
  yield
@@ -95,9 +122,21 @@ module AsciiPress
95
122
  end
96
123
 
97
124
  class WordPressSyncer
98
- def initialize(blog_id, username, password, post_type, renderer, options = {})
99
- @blog_id = blog_id
100
- @wp_client = Rubypress::Client.new(host: @blog_id, username: username, password: password)
125
+ # Creates a synchronizer object which can be used to synchronize a set of asciidoc files to WordPress posts
126
+ # @param hostname [String] Hostname for WordPress blog
127
+ # @param username [String] Wordpress username
128
+ # @param password [String] Wordpress password
129
+ # @param post_type [String] Wordpress post type to synchronize posts with
130
+ # @param renderer [Renderer] Renderer object which will be used to process asciidoctor files
131
+ # @param options [Hash]
132
+ # @option options [Logger] :logger Logger to be used for informational output. Defaults to {AsciiPress.logger}
133
+ # @option options [Proc] :filter_proc Proc which is given an +AsciiDoctor::Document+ object and returns +true+ or +false+ to decide if a document should be synchronized
134
+ # @option options [Boolean] :delete_not_found Should posts on the WordPress server which don't match any documents locally get deleted?
135
+ # @option options [Boolean] :generate_tags Should asciidoctor tags be synchronized to WordPress? (defaults to +false+)
136
+ # @option options [String] :post_status The status to assign to posts when they are synchronized. Defaults to +'draft'+. See the {https://github.com/zachfeldman/rubypress rubypress} documentation
137
+ def initialize(hostname, username, password, post_type, renderer, options = {})
138
+ @hostname = hostname
139
+ @wp_client = Rubypress::Client.new(host: @hostname, username: username, password: password)
101
140
  @post_type = post_type
102
141
  @logger = options[:logger] || AsciiPress.logger
103
142
  @renderer = renderer || Renderer.new
@@ -111,6 +150,8 @@ module AsciiPress
111
150
  log :info, "Got #{@all_pages_by_post_name.size} pages from the database"
112
151
  end
113
152
 
153
+ # @param adoc_file_path [Array <String>] Paths of the asciidoctor files to synchronize
154
+ # @param custom_fields [Hash] Custom fields for WordPress.
114
155
  def sync(adoc_file_paths, custom_fields = {})
115
156
  synced_post_names = []
116
157
 
@@ -124,12 +165,14 @@ module AsciiPress
124
165
 
125
166
  log :info, "Deleting missing post_name: #{post_name_to_delete} (post ##{post_id})"
126
167
 
127
- send_message(:deletePost, blog_id: @blog_id, post_id: post_id)
168
+ send_message(:deletePost, blog_id: @hostname, post_id: post_id)
128
169
  end
129
170
 
130
171
  end
131
172
  end
132
173
 
174
+ private
175
+
133
176
  def sync_file_path(adoc_file_path, custom_fields = {})
134
177
  rendering = @renderer.render(adoc_file_path)
135
178
 
@@ -140,7 +183,7 @@ module AsciiPress
140
183
  return
141
184
  end
142
185
 
143
- title = rendering.doc.doctitle
186
+ title = rendering.title
144
187
  html = rendering.html
145
188
 
146
189
  log :info, "Syncing to WordPress: #{title} (slug: #{slug})"
@@ -150,7 +193,7 @@ module AsciiPress
150
193
  custom_fields_array = custom_fields.merge('adoc_attributes' => rendering.doc.attributes.to_json).map {|k, v| {key: k, value: v} }
151
194
  content = {
152
195
  post_type: @post_type,
153
- post_date: Time.now - 60*60*24*30,
196
+ post_date: Time.now - 60*60*24,
154
197
  post_content: html,
155
198
  post_title: title,
156
199
  post_name: slug,
@@ -170,21 +213,18 @@ module AsciiPress
170
213
 
171
214
  post_id = page['post_id'].to_i
172
215
 
173
- log :info, "Editing Post ##{post_id} on _#{@blog_id}_ custom-field #{content[:custom_fields].inspect}"
216
+ log :info, "Editing Post ##{post_id} on _#{@hostname}_ custom-field #{content[:custom_fields].inspect}"
174
217
 
175
- send_message(:editPost, blog_id: @blog_id, post_id: post_id, content: content)
218
+ send_message(:editPost, blog_id: @hostname, post_id: post_id, content: content)
176
219
  else
177
- log :info, "Making a new post for '#{title}' on _#{@blog_id}_"
220
+ log :info, "Making a new post for '#{title}' on _#{@hostname}_"
178
221
 
179
- send_message(:newPost, blog_id: @blog_id, content: content)
222
+ send_message(:newPost, blog_id: @hostname, content: content)
180
223
  end
181
224
 
182
225
  slug
183
226
  end
184
227
 
185
-
186
- private
187
-
188
228
  def new_content_same_as_page?(content, page)
189
229
  main_keys_different = %i(post_content post_title post_name post_status).any? do |key|
190
230
  content[key] != page[key.to_s]
@@ -1,3 +1,3 @@
1
1
  module AsciiPress
2
- VERSION = "0.3.0"
2
+ VERSION = "0.5.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ascii_press
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Underwood
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-05-17 00:00:00.000000000 Z
11
+ date: 2016-06-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubypress