docgen-adapter 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +8 -0
- data/lib/docgen_adapter.rb +67 -11
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: afe6bdfcb9c5d9773d369ba750d43c797614ff24f9e9bd4c10eeb645b12e122e
|
4
|
+
data.tar.gz: cfdb37ee53d4d4ead59f99a7f5e1a767211c848c8109ed1f2b71ff84ae8e47d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0c9a445451d9637e8c601d9ea4f86fb2748144f4cafb82a9d2ebc08c4092c0b88fec3e0d0b37aaf909ac95ac5fa472d2448a0c8c9c0cb900b95157b0aa949825
|
7
|
+
data.tar.gz: eb0baf8397ce28db7ed2755931458a00168d1ea909b003af73b1de32197d5b95aed75df267050bbc4232eaa4ff3c828916d2f67dee33cfebe796bdbc7475293c
|
data/README.md
CHANGED
@@ -65,6 +65,14 @@ def json(params = {})
|
|
65
65
|
end
|
66
66
|
```
|
67
67
|
|
68
|
+
Добавьте метод `files` для обработки и передачи дополнительных файлов в задание генерации. В ответе метода `files` должен отдаваться массив ссылок (URL) на файлы либо массив локальный путей файлов.
|
69
|
+
|
70
|
+
```ruby
|
71
|
+
def files(params)
|
72
|
+
[]
|
73
|
+
end
|
74
|
+
```
|
75
|
+
|
68
76
|
Задайте название генерируемого файла в `metadata`. Например:
|
69
77
|
|
70
78
|
```ruby
|
data/lib/docgen_adapter.rb
CHANGED
@@ -4,20 +4,22 @@ require 'docgen_subject'
|
|
4
4
|
|
5
5
|
class DocgenAdapter
|
6
6
|
|
7
|
-
def initialize(type:, doc_id:, debug: false)
|
7
|
+
def initialize(type:, doc_id:, debug: false, open: false)
|
8
8
|
# аргументы сервиса
|
9
9
|
@type = type
|
10
10
|
@doc_id = doc_id
|
11
11
|
@debug = Rails.env.development? && debug
|
12
|
+
@open = Rails.env.development? && open
|
12
13
|
@task_id = SecureRandom.uuid
|
13
14
|
end
|
14
15
|
|
15
16
|
# выполнение генерации документа
|
16
17
|
def generate(params = {})
|
17
|
-
@
|
18
|
+
@files = handle_files(params)
|
19
|
+
@task_params = build_task_params(params)
|
18
20
|
|
19
21
|
# отображение параметров для проверки
|
20
|
-
puts JSON.pretty_generate(JSON.parse(@
|
22
|
+
puts JSON.pretty_generate(JSON.parse(@task_params)) if @debug
|
21
23
|
|
22
24
|
# подписка ка канал и ожидание сообщений в другом потоке
|
23
25
|
Thread.new { subscribe_and_listen }
|
@@ -26,7 +28,14 @@ class DocgenAdapter
|
|
26
28
|
sleep(0.5)
|
27
29
|
|
28
30
|
# отправка сообщения с заданием
|
29
|
-
redis.publish('TASKS', @
|
31
|
+
redis.publish('TASKS', @task_params)
|
32
|
+
|
33
|
+
sleep(0.5)
|
34
|
+
|
35
|
+
# отправка файлов при наличии
|
36
|
+
@files.each do |file|
|
37
|
+
redis.publish("files-#{@task_id}", file[:content])
|
38
|
+
end
|
30
39
|
|
31
40
|
# путь до сгенерированного файла в ответе
|
32
41
|
filename
|
@@ -44,6 +53,10 @@ class DocgenAdapter
|
|
44
53
|
end
|
45
54
|
end
|
46
55
|
|
56
|
+
def document_instance
|
57
|
+
@document_instance ||= document_class.new
|
58
|
+
end
|
59
|
+
|
47
60
|
# формирование названия генерируемого файла
|
48
61
|
def filename
|
49
62
|
@filename ||= "#{Dir.mktmpdir}/#{document_class.metadata_opts[:filename]}.#{@type}"
|
@@ -76,15 +89,55 @@ class DocgenAdapter
|
|
76
89
|
end
|
77
90
|
end
|
78
91
|
|
79
|
-
#
|
80
|
-
def
|
81
|
-
|
92
|
+
# обработка доп. файлов для документа
|
93
|
+
def handle_files(params)
|
94
|
+
return [] unless document_class.method_defined?(:files)
|
95
|
+
|
96
|
+
document_instance.files(params).map do |file|
|
97
|
+
# обработка ссылки или локального пути для получения содержимого файла и расширения
|
98
|
+
if file =~ URI::regexp
|
99
|
+
opened = URI.open(file)
|
100
|
+
content = opened.read
|
101
|
+
extension = url_file_extname(opened.meta['content-type'])
|
102
|
+
else
|
103
|
+
content = File.read(file)
|
104
|
+
extension = File.extname(file).gsub('.', '')
|
105
|
+
end
|
106
|
+
|
107
|
+
# MD5 содержимого файла
|
108
|
+
md5 = Digest::MD5.base64digest(content)
|
109
|
+
|
110
|
+
{ content:, extension:, md5: }
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def url_file_extname(content_type)
|
115
|
+
case content_type
|
116
|
+
when 'image/png'
|
117
|
+
'png'
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
# формирование объекта с параметрами задания
|
122
|
+
def build_task_params(params)
|
123
|
+
# базовый объект параметров
|
124
|
+
object = {
|
82
125
|
ИдентификаторЗадачи: @task_id,
|
83
126
|
ИдентификаторДокумента: @doc_id,
|
84
127
|
ТипДокумента: @type,
|
85
|
-
|
86
|
-
|
87
|
-
|
128
|
+
ПараметрыДокумента: document_instance.json(params)
|
129
|
+
}
|
130
|
+
|
131
|
+
# параметры доп. файлов
|
132
|
+
object[:ДополнительныеФайлы] =
|
133
|
+
@files.map do |file|
|
134
|
+
{
|
135
|
+
Md5: file[:md5],
|
136
|
+
Формат: file[:extension]
|
137
|
+
}
|
138
|
+
end
|
139
|
+
|
140
|
+
object.to_json
|
88
141
|
end
|
89
142
|
|
90
143
|
# обработка сообщения пришедшего в канал Redis
|
@@ -122,6 +175,9 @@ class DocgenAdapter
|
|
122
175
|
|
123
176
|
# сообщение с файлом приходит последним - отписка от канала Redis
|
124
177
|
redis.unsubscribe
|
178
|
+
|
179
|
+
# открывать файл для проверки
|
180
|
+
%x(open '#{filename}') if @open
|
125
181
|
end
|
126
182
|
|
127
183
|
def handle_exception(object)
|
@@ -130,7 +186,7 @@ class DocgenAdapter
|
|
130
186
|
if Rails.env.development?
|
131
187
|
puts text
|
132
188
|
else
|
133
|
-
Rollbar.error(text, params: @
|
189
|
+
Rollbar.error(text, params: @task_params)
|
134
190
|
end
|
135
191
|
end
|
136
192
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: docgen-adapter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Павел Бабин
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-11-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|