hatenablog_publisher 0.1.0 → 0.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9da819e22994f68f8d47fb2af66cb776ab74866d09d0c6cc3970fbf8cb447ac6
4
- data.tar.gz: 7fe584284a46990d727add2316a6c72920787ec4b48d6ccffa7ab8330e2a888f
3
+ metadata.gz: ae5520e6363ca01a3e404687252372c0d3e3cca100ddbc3fcd6adc1ea940a70a
4
+ data.tar.gz: b4489a0d2245d0efb130a589d6f1eefe2430af44469fe0b6112987b357e1c31f
5
5
  SHA512:
6
- metadata.gz: fc1c23cb700e7e4c2612dd185ec387266ed5736a590221afe0ecfd8ae91010dade2ebc0131f109b7401b083bebafd796419ad53d484b7e521b9d43ca4e94e1ca
7
- data.tar.gz: '008ba7e176554d139f89a481b7ee2d8e4a9a175935b59284ec7d71c14d29d4ef27928594b562829166c7d5d8b7cdfa46833a0225722bc43f64be930a6e4c12f8'
6
+ metadata.gz: e6fdb7227d35882af116414d1a858bcb5821e16bdaa96feb98db03c994e88db51af52e6b9302b97a067340a60d43b0707e1c72c33a6f7631dd5887c5c7a5455a
7
+ data.tar.gz: 5e071ae5bf18dba02a26840a0b822f804237005178e510a7a4843e2001a6612a03e94d644923a687945388c552dcacd1003143a1aaaec300453a49d3e4f2c06b
@@ -0,0 +1,9 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "github-actions"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "daily"
7
+ labels:
8
+ - dependabot
9
+ open-pull-requests-limit: 10
@@ -12,7 +12,7 @@ jobs:
12
12
  - uses: ruby/setup-ruby@v1
13
13
  with:
14
14
  ruby-version: 2.6
15
- - uses: actions/cache@v1
15
+ - uses: actions/cache@v2.1.3
16
16
  with:
17
17
  path: vendor/bundle
18
18
  key: ${{ runner.os }}-gems-${{ hashFiles('./Gemfile.lock') }}
@@ -28,6 +28,8 @@ jobs:
28
28
  HATENABLOG_CONSUMER_SECRET: dummy
29
29
  HATENABLOG_ACCESS_TOKEN_SECRET: dummy
30
30
  HATENABLOG_ACCESS_TOKEN: dummy
31
+ CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
32
+ CI: true
31
33
  run: |
32
34
  bundle exec rspec
33
35
 
@@ -52,3 +54,14 @@ jobs:
52
54
  # with:
53
55
  # github_token: ${{ secrets.GITHUB_TOKEN }}
54
56
  # reporter: github-pr-check
57
+
58
+ slack-notify:
59
+ if: always()
60
+ needs: [test, rubocop]
61
+ name: post slack
62
+ runs-on: ubuntu-latest
63
+ steps:
64
+ - uses: Gamesight/slack-workflow-status@master
65
+ with:
66
+ repo_token: ${{ secrets.GITHUB_TOKEN }}
67
+ slack_webhook_url: ${{ secrets.SLACK_WEBHOOK_URL }}
data/Gemfile CHANGED
@@ -10,8 +10,9 @@ gem 'mime-types'
10
10
  gem 'oauth'
11
11
  gem 'oga'
12
12
  gem 'pry-byebug'
13
- gem 'rake', '~> 12.0'
13
+ gem 'rake', '~> 13.0'
14
14
  gem 'rspec', '~> 3.0'
15
15
  gem 'rubocop'
16
16
  gem 'sanitize'
17
17
  gem 'xml-simple'
18
+ gem 'codecov', :require => false, :group => :test
@@ -1,12 +1,19 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- hatenablog_publisher (0.1.0)
4
+ hatenablog_publisher (0.2.0)
5
+ activesupport
6
+ front_matter_parser
7
+ mime-types
8
+ oauth
9
+ oga
10
+ sanitize
11
+ xml-simple
5
12
 
6
13
  GEM
7
14
  remote: https://rubygems.org/
8
15
  specs:
9
- activesupport (6.0.3)
16
+ activesupport (6.0.3.1)
10
17
  concurrent-ruby (~> 1.0, >= 1.0.2)
11
18
  i18n (>= 0.7, < 2)
12
19
  minitest (~> 5.1)
@@ -16,20 +23,25 @@ GEM
16
23
  ast (2.4.0)
17
24
  awesome_print (1.8.0)
18
25
  byebug (11.1.3)
26
+ codecov (0.2.11)
27
+ json
28
+ simplecov
19
29
  coderay (1.1.2)
20
30
  concurrent-ruby (1.1.6)
21
31
  crass (1.0.6)
22
32
  diff-lcs (1.3)
33
+ docile (1.3.2)
23
34
  front_matter_parser (0.2.1)
24
35
  i18n (1.8.2)
25
36
  concurrent-ruby (~> 1.0)
26
37
  jaro_winkler (1.5.4)
38
+ json (2.3.1)
27
39
  method_source (1.0.0)
28
40
  mime-types (3.3.1)
29
41
  mime-types-data (~> 3.2015)
30
42
  mime-types-data (3.2020.0425)
31
43
  mini_portile2 (2.4.0)
32
- minitest (5.14.0)
44
+ minitest (5.14.1)
33
45
  nokogiri (1.10.9)
34
46
  mini_portile2 (~> 2.4.0)
35
47
  nokogumbo (2.0.2)
@@ -48,7 +60,7 @@ GEM
48
60
  byebug (~> 11.0)
49
61
  pry (~> 0.13.0)
50
62
  rainbow (3.0.0)
51
- rake (12.3.3)
63
+ rake (13.0.1)
52
64
  rexml (3.2.4)
53
65
  rspec (3.9.0)
54
66
  rspec-core (~> 3.9.0)
@@ -75,10 +87,14 @@ GEM
75
87
  ansi
76
88
  ast
77
89
  ruby-progressbar (1.10.1)
78
- sanitize (5.1.0)
90
+ sanitize (5.2.1)
79
91
  crass (~> 1.0.2)
80
92
  nokogiri (>= 1.8.0)
81
93
  nokogumbo (~> 2.0)
94
+ simplecov (0.19.0)
95
+ docile (~> 1.1)
96
+ simplecov-html (~> 0.11)
97
+ simplecov-html (0.12.3)
82
98
  thread_safe (0.3.6)
83
99
  tzinfo (1.2.7)
84
100
  thread_safe (~> 0.1)
@@ -92,13 +108,15 @@ PLATFORMS
92
108
  DEPENDENCIES
93
109
  activesupport
94
110
  awesome_print
111
+ bundler
112
+ codecov
95
113
  front_matter_parser
96
114
  hatenablog_publisher!
97
115
  mime-types
98
116
  oauth
99
117
  oga
100
118
  pry-byebug
101
- rake (~> 12.0)
119
+ rake (~> 13.0)
102
120
  rspec (~> 3.0)
103
121
  rubocop
104
122
  sanitize
data/README.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # HatenablogPublisher
2
2
 
3
+ ![ci](https://github.com/swfz/hatenablog_publisher/workflows/ci/badge.svg)
4
+
5
+ [![codecov](https://codecov.io/gh/swfz/hatenablog_publisher/branch/master/graph/badge.svg)](https://codecov.io/gh/swfz/hatenablog_publisher)
6
+
3
7
  Module to manage local markdown and images using Hatena Blog API and PhotoLife API.
4
8
 
5
9
  ## Installation
@@ -23,4 +23,16 @@ Gem::Specification.new do |spec|
23
23
  spec.bindir = "exe"
24
24
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
25
25
  spec.require_paths = ["lib"]
26
+ spec.add_development_dependency 'bundler'
27
+ spec.add_development_dependency 'rake'
28
+ spec.add_development_dependency 'rspec'
29
+ spec.add_development_dependency 'awesome_print'
30
+ spec.add_development_dependency 'pry-byebug'
31
+ spec.add_dependency 'activesupport'
32
+ spec.add_dependency 'front_matter_parser'
33
+ spec.add_dependency 'oauth'
34
+ spec.add_dependency 'mime-types'
35
+ spec.add_dependency 'oga'
36
+ spec.add_dependency 'sanitize'
37
+ spec.add_dependency 'xml-simple'
26
38
  end
@@ -15,7 +15,6 @@ module HatenablogPublisher
15
15
  end
16
16
 
17
17
  def publish
18
- image_tags = @context.text.scan(IMAGE_PATTERN).flatten
19
18
  photolife = HatenablogPublisher::Photolife.new
20
19
  dirname = File.dirname(@options.filename)
21
20
 
@@ -36,6 +35,10 @@ module HatenablogPublisher
36
35
  @context.reload_context
37
36
  end
38
37
 
38
+ def image_tags
39
+ @context.text.scan(IMAGE_PATTERN).flatten.reject { |tag| tag.match('^http') }
40
+ end
41
+
39
42
  def generate_body
40
43
  generator = HatenablogPublisher::Generator::Body.new(@context, @options)
41
44
  body = generator.generate
@@ -1,10 +1,11 @@
1
1
  require 'yaml'
2
+ require 'time'
2
3
  require 'front_matter_parser'
3
4
  require 'active_support/core_ext/hash'
4
5
 
5
6
  module HatenablogPublisher
6
7
  class Context
7
- attr_reader :title, :categories, :text, :hatena
8
+ attr_reader :title, :categories, :updated, :text, :hatena
8
9
 
9
10
  def initialize(io)
10
11
  @io = io
@@ -18,7 +19,8 @@ module HatenablogPublisher
18
19
  end
19
20
 
20
21
  def add_image_context(image, tag)
21
- syntax = "[#{image['syntax'].first}]"
22
+ # APIのレスポンスをそのまま使用すると記事上でフォトライフへのリンクになってしまうため、管理画面から画像投稿した結果と合わせた(image -> plain)
23
+ syntax = "[#{image['syntax'].first}]".gsub(/:image\]/,':plain]')
22
24
 
23
25
  @hatena ||= {}
24
26
  @hatena[:image] ||= {}
@@ -40,19 +42,36 @@ module HatenablogPublisher
40
42
  def add_entry_context(entry)
41
43
  @hatena ||= {}
42
44
  @hatena[:id] = entry['id'].first.split('-').last
45
+ @updated = time_to_s(entry['updated'].first)
46
+ end
47
+
48
+ def time_to_s(str)
49
+ Time.parse(str).strftime('%Y-%m-%dT%H:%M:%S')
50
+ end
51
+
52
+ def metadata
53
+ {
54
+ title: @title,
55
+ category: @categories,
56
+ updated: @updated,
57
+ hatena: @hatena
58
+ }
43
59
  end
44
60
 
45
61
  private
46
62
 
47
63
  def write_context
48
- @io.write(title: @title, category: @categories, hatena: @hatena, text: @text)
64
+ @io.write(metadata, @text)
49
65
  end
50
66
 
51
67
  def read_context
52
68
  data, text = @io.read
53
69
 
70
+ updated = data[:updated].to_s.empty? ? '' : time_to_s(data[:updated])
71
+
54
72
  @text = text
55
73
  @categories = data[:category]
74
+ @updated = updated
56
75
  @title = data[:title]
57
76
  @hatena = data[:hatena] || {}
58
77
  end
@@ -31,7 +31,6 @@ module HatenablogPublisher
31
31
 
32
32
  def api_url
33
33
  id = @context.hatena.dig(:id) ? '/' + @context.hatena[:id] : ''
34
- ap @options
35
34
  "#{ENDPOINT}/#{@options.user}/#{@options.site}/atom/entry#{id}"
36
35
  end
37
36
 
@@ -56,7 +55,7 @@ module HatenablogPublisher
56
55
  <content type="text/plain">
57
56
  #{body}
58
57
  </content>
59
- <updated>#{Time.now.strftime('%Y-%m-%dT%H:%M%S')}</updated>
58
+ <updated>#{@context.updated}</updated>
60
59
  #{categories}
61
60
  <app:control>
62
61
  <app:draft>#{draft}</app:draft>
@@ -13,14 +13,24 @@ module HatenablogPublisher
13
13
  def generate
14
14
  markdown = @context.text.dup
15
15
 
16
- replaced_markdown = replace_image(markdown)
16
+ replaced_markdown = remove_textlint_comment(replace_image(markdown))
17
17
 
18
18
  CGI.escapeHTML(replaced_markdown)
19
19
  end
20
20
 
21
+ def remove_textlint_comment(markdown)
22
+ markdown.gsub(/^<!--\s+textlint-(enable|disable).*-->\n/, '')
23
+ end
24
+
21
25
  def replace_image(markdown)
22
- markdown.gsub(IMAGE_PATTERN) do
23
- "\n\n" + @context.image_syntax(Regexp.last_match(1))
26
+ markdown.gsub(IMAGE_PATTERN) do |s|
27
+ image_name = Regexp.last_match(1)
28
+
29
+ if image_name.match('^http')
30
+ s
31
+ else
32
+ "\n\n" + @context.image_syntax(image_name)
33
+ end
24
34
  end
25
35
  end
26
36
  end
@@ -12,36 +12,32 @@ module HatenablogPublisher
12
12
  @options.data_file
13
13
  end
14
14
 
15
- def write(title:, category:, hatena:, text:)
15
+ def yaml_loader
16
+ FrontMatterParser::Loader::Yaml.new(whitelist_classes: [Time])
17
+ end
18
+
19
+ def write(metadata, text)
16
20
  if data_file?
17
- write_data_file(title: title, category: category, hatena: hatena)
21
+ write_data_file(metadata)
18
22
  else
19
- write_file(title: title, category: category, hatena: hatena, text: text)
23
+ write_file(metadata, text)
20
24
  end
21
25
  end
22
26
 
23
- def write_data_file(title:, category:, hatena:)
27
+ def write_data_file(metadata)
24
28
  data = JSON.parse(File.read(@options.data_file))
25
29
  data.each do |l|
26
30
  next unless l['filepath'] == @options.filename
27
31
 
28
- l.merge!(
29
- title: title,
30
- category: category,
31
- hatena: hatena
32
- )
32
+ l.deep_symbolize_keys!.merge!(metadata)
33
33
  end
34
34
  File.write(data_file, JSON.pretty_generate(data, indent: ' ', space_before: ' '))
35
35
  end
36
36
 
37
- def write_file(title:, category:, hatena:, text:)
37
+ def write_file(metadata, text)
38
38
  filename = @options.filename
39
- parsed = FrontMatterParser::Parser.parse_file(filename)
40
- front_matter = parsed.front_matter.deep_symbolize_keys.merge(
41
- title: title,
42
- category: category,
43
- hatena: hatena
44
- )
39
+ parsed = FrontMatterParser::Parser.parse_file(filename, loader: yaml_loader)
40
+ front_matter = parsed.front_matter.deep_symbolize_keys.merge(metadata)
45
41
  body = YAML.dump(front_matter.deep_stringify_keys) + "\n---\n\n" + text
46
42
  File.write(filename, body)
47
43
  end
@@ -64,7 +60,7 @@ module HatenablogPublisher
64
60
  end
65
61
 
66
62
  def read_from_file(filename)
67
- parsed = FrontMatterParser::Parser.parse_file(filename)
63
+ parsed = FrontMatterParser::Parser.parse_file(filename, loader: yaml_loader)
68
64
 
69
65
  [parsed.front_matter.deep_symbolize_keys, parsed.content]
70
66
  end
@@ -1,3 +1,3 @@
1
1
  module HatenablogPublisher
2
- VERSION = '0.1.0'.freeze
2
+ VERSION = '0.2.0'.freeze
3
3
  end
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": [
3
+ "config:base"
4
+ ],
5
+ "minor": {
6
+ "groupName": "all dependencies"
7
+ }
8
+ }
metadata CHANGED
@@ -1,15 +1,183 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hatenablog_publisher
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - swfz
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-05-21 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2020-12-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: awesome_print
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry-byebug
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: activesupport
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: front_matter_parser
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: oauth
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: mime-types
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: oga
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: sanitize
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: xml-simple
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
13
181
  description:
14
182
  email:
15
183
  - sawafuji.09@gmail.com
@@ -18,6 +186,7 @@ executables:
18
186
  extensions: []
19
187
  extra_rdoc_files: []
20
188
  files:
189
+ - ".github/dependabot.yml"
21
190
  - ".github/workflows/ci.yml"
22
191
  - ".gitignore"
23
192
  - ".rspec"
@@ -46,6 +215,7 @@ files:
46
215
  - lib/hatenablog_publisher/photolife.rb
47
216
  - lib/hatenablog_publisher/request_logger.rb
48
217
  - lib/hatenablog_publisher/version.rb
218
+ - renovate.json
49
219
  homepage: https://github.com/swfz/hatenablog_publisher
50
220
  licenses:
51
221
  - MIT