sutty-migration 0.2.0 → 0.2.1

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
  SHA256:
3
- metadata.gz: 046cf945de1c0736e329224151a4b331c87e44cab6e6c2bc1e69f22b7639fe68
4
- data.tar.gz: 58effbee202ab51c7ff1ed4e8e98498cd5a65f618c6ae6fc4f924fe6aed2e0e1
3
+ metadata.gz: bbc62b40240f7bdea15ea0994e1af5db0e7590a500459ca82e4727f86bb791a5
4
+ data.tar.gz: '087218a58be167e9348d4314922a8985a56339b9c6dd340edbfa21be1aabc9ed'
5
5
  SHA512:
6
- metadata.gz: a21cb549bddd9bc55218c0633932300811e547d2d4cfde2525fbcdcaf8a2ff3bb89f0542813b46fdb9b90c9d739166ce37e303fb4de76b918b52bee9402fcb6d
7
- data.tar.gz: 544f18359b4e9996c07f6828643bb8d4856d55457b4a6134b2ef2cedf01d4471d294effc6024598ef66f9b1d2258345f44ac370e1678166a2b9d19b5c4a55e74
6
+ metadata.gz: 5a6933d3c03a86aa0b469f75afa42c969bc22301672054cba60eb5256b87a4381c325e7d49fd9af1259cef0d44094c5fe78df2aec51f859446b34625b24921a5
7
+ data.tar.gz: 3ce853bddcf43a8c993ef8c8f1e9601fb4da59bdf7eb58a96611baef8e6934375b4bd20e1cb67a008025e03b0c94d62772ab18f4d23550d063d6d381a1190bdd
@@ -38,15 +38,19 @@ module SuttyMigration
38
38
  #
39
39
  # @return [Hash] { "ID" => SuttyMigration::Wordpress }
40
40
  def blogs
41
- @blogs ||= wp["select blog_id as id, domain, path from #{prefix}blogs"].to_a.map do |blog|
41
+ @blogs ||= wp["select * from #{prefix}blogs"].to_a.map do |blog|
42
42
  url = "https://#{blog[:domain]}#{blog[:path]}"
43
- pfx = "#{prefix}#{blog[:id]}_" if blog[:id] > 1
43
+ pfx = "#{prefix}#{blog[:blog_id]}_" if blog[:blog_id] > 1
44
44
  pfx ||= prefix
45
45
 
46
- [ blog[:id], self.class.new(site: site, url: url, prefix: pfx, database: database, limit: limit, multisite: self) ]
46
+ [ blog[:blog_id], blog.merge(db: self.class.new(site: site, url: url, prefix: pfx, database: database, limit: limit, multisite: self)) ]
47
47
  end.to_h
48
48
  end
49
49
 
50
+ def options
51
+ @options ||= wp["select option_name, option_value from #{prefix}options"].to_a.map(&:values).to_h.transform_keys(&:to_sym)
52
+ end
53
+
50
54
  # Open the database.
51
55
  #
52
56
  # @return [Sequel::SQLite::Database]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sutty-migration
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - f
@@ -138,7 +138,6 @@ files:
138
138
  - lib/sutty_migration/data.rb
139
139
  - lib/sutty_migration/jekyll/document_creator.rb
140
140
  - lib/sutty_migration/wordpress.rb
141
- - lib/wordpress.rb
142
141
  homepage: https://0xacab.org/sutty/jekyll/sutty-migration
143
142
  licenses:
144
143
  - GPL-3.0
data/lib/wordpress.rb DELETED
@@ -1,192 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Generar UUIDs
4
- require 'securerandom'
5
- # Traer resultados de la base de datos
6
- require 'sequel'
7
- require 'sqlite3'
8
- require 'json'
9
- # Descargar archivos
10
- require 'faraday'
11
- require 'progressbar'
12
-
13
- class Wordpress
14
- attr_reader :site, :prefix, :limit, :url
15
-
16
- def initialize(site:, url:, prefix: 'wp_', limit: 10)
17
- @site = site
18
- @prefix = prefix.freeze
19
- @limit = limit.freeze
20
- @url = url.freeze
21
-
22
- # Conectarse a la base de datos
23
- @wp = Sequel.sqlite(File.join(site.source, '_data', 'wordpress', 'post.sqlite3'))
24
- # Las funciones de JSON usan mucha CPU, vamos a traer de a pocos
25
- # registros.
26
- @wp.extension :pagination
27
- end
28
-
29
- def download(file)
30
- dest = "wp-content/uploads/#{file}"
31
- full = File.join(site.source, dest)
32
-
33
- return dest if File.exist? full
34
-
35
- Jekyll.logger.info "Downloading #{dest}"
36
-
37
- FileUtils.mkdir_p File.dirname(full)
38
-
39
- File.open(full, 'w') do |f|
40
- url = "#{url}/#{dest}"
41
- head = Faraday.head(url)
42
- content_length = head.headers['content-length']
43
- progress_bar = ProgressBar.new
44
-
45
- Faraday.get(url) do |req|
46
- req.options.on_data = Proc.new do |chunk, downloaded_bytes|
47
- f.write chunk
48
- end
49
- end
50
- end
51
-
52
- dest
53
- end
54
-
55
- # Obtiene todos los tipos de artículos disponibles
56
- #
57
- # @return [Array]
58
- def layouts
59
- @layouts ||= @wp["select distinct post_type from #{prefix}posts"].to_a.map(&:values).flatten
60
- end
61
-
62
- # Obtiene todos los posts opcionalmente filtrando por tipo de post.
63
- # No es la forma oficial de Sequel pero no tenemos tiempo de
64
- # aprenderla específicamente y además tenemos las opciones en formato
65
- # JSON que no estarían soportadas.
66
- #
67
- # @param :layout [String] Layout name, one of #layouts
68
- # @param :with_meta [Boolean]
69
- # @return [Enumerator]
70
- def posts(**options)
71
- if options[:layout] && !layouts.include?(options[:layout])
72
- raise ArgumentError, "#{layout} must be one of #{layouts.join(', ')}"
73
- end
74
-
75
- @posts ||= {}
76
- @posts[options[:layout] || 'all'] ||= @wp[post_query(**options)].each_page(limit).to_a.map(&:to_a).flatten.tap do |p|
77
- next unless options[:with_meta]
78
-
79
- p.map do |post|
80
- post[:front_matter] = JSON.parse(post[:front_matter]) unless post[:front_matter].nil?
81
- post[:terms] = JSON.parse(post[:terms]) unless post[:terms].nil?
82
- end
83
- end
84
- end
85
-
86
- private
87
-
88
- # Consulta para los posts, incluyendo metadatos en JSON. Los
89
- # metadatos vienen en dos partes porque tienen dos
90
- #
91
- # @return [String]
92
- def post_query(layout: nil, with_meta: true)
93
- @post_query ||= <<~EOQ
94
- select
95
- p.ID as id,
96
- p.post_title as title,
97
- p.post_name as slug,
98
- p.post_type as layout,
99
- p.strftime('%Y-%m-%d', post_date) as date,
100
- p.post_status as status,
101
- p.post_content as content
102
- #{", json_group_object(f.meta_key, f.meta_value) as front_matter" if with_meta}
103
- #{", t.meta as meta" if with_meta}
104
- from #{prefix}posts as p
105
- left join #{prefix}postmeta as f on p.ID = f.post_id
106
- #{"left join (#{meta_query(layout: layout)}) as as t on t.id = p.ID" if with_meta}
107
- #{"where p.post_type = :layout" if layout}
108
- group by p.ID
109
- EOQ
110
- end
111
-
112
- #
113
- def meta_query(layout: nil)
114
- @meta_query ||= <<~EOQ
115
- select
116
- p.ID as id,
117
- json_group_object(tt.taxonomy, t.name) as meta
118
- from #{prefix}posts as p
119
- left join #{prefix}term_relationships as r on r.object_id = p.ID
120
- left join #{prefix}term_taxonomy as tt on tt.term_taxonomy_id = r.term_taxonomy_id
121
- left join #{prefix}terms as t on t.term_id = tt.term_id
122
- #{"where p.post_type = :layout" if layout}
123
- group by p.ID
124
- EOQ
125
- end
126
- end
127
-
128
- # Antes de generar el sitio vamos a leer todos los artículos desde la
129
- # base de datos y generarlos localmente.
130
- Jekyll::Hooks.register :site, :post_read do |site|
131
- wp = Wordpress.new(site: site,
132
- url: site.config.dig('wordpress', 'url'),
133
- prefix: site.config.dig('wordpress', 'prefix'))
134
-
135
- collection = site.collections['posts']
136
- ascii_re = Regexp.new("\P{ASCII}").freeze
137
- sanitizer = Rails::Html::SafeListSanitizer.new
138
-
139
- # Traer todas las imágenes cargadas y descargarlas
140
- attachments = wp.posts(layout: 'attachment').map do |page|
141
- page.map do |attachment|
142
- attachment[:data] = JSON.parse(attachment[:data]) unless attachment[:data].nil?
143
- file = attachment.dig(:data, '_wp_attached_file')
144
-
145
- next unless file
146
-
147
- dest = wp.download(file)
148
-
149
- # Tener un mapa de IDs y archivos destino
150
- [ attachment[:id], dest ]
151
- end
152
- end.compact.flatten(1).to_h
153
-
154
- %w[post page].each do |type|
155
- wp.posts(layout: type).each do |page|
156
- page.each do |post|
157
- # Convertir los datos extra en un Hash
158
- post[:data] = JSON.parse(post[:data]) unless post[:data].nil?
159
- post[:slug] = Jekyll::Utils.slugify(post[:title], mode: 'latin') if post[:slug].empty?
160
- post[:meta] = wp.meta id: post[:id]
161
-
162
- path = File.join(site.source, '_posts', post.slice(:date, :slug).values.join('-') + '.markdown')
163
-
164
- if File.exist? path
165
- Jekyll.logger.info "#{path} ya fue migrado, actualizando"
166
-
167
- doc = site.documents.find do |d|
168
- d['id'] == post[:id]
169
- end
170
- else
171
- # Crear un post nuevo y agregarlo a la colección
172
- collection.docs << doc = Jekyll::Document.new(path, site: site, collection: collection)
173
- doc.data['uuid'] = SecureRandom.uuid
174
- end
175
-
176
- thumbnail = post.dig(:data, '_thumbnail_id')&.to_i
177
-
178
- doc.data['layout'] = type
179
- doc.data['title'] = post[:title]
180
- doc.data['draft'] = post[:status] != 'publish'
181
- doc.data['id'] = post[:id]
182
- doc.data['date'] = Jekyll::Utils.parse_date(post[:date])
183
- doc.data['tags'] = post[:meta].select { |k| k[:type] == 'post_tag' }.map { |k| k[:name] }
184
- doc.data['categories'] = post[:meta].select { |k| k[:type] == 'category' }.map { |k| k[:name] }
185
- doc.data['image'] = attachments[thumbnail] if thumbnail
186
-
187
- doc.content = ReverseMarkdown.convert(sanitizer.sanitize(post[:content]))
188
- doc.save
189
- end
190
- end
191
- end
192
- end