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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +8 -0
  3. data/lib/docgen_adapter.rb +67 -11
  4. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 436def6a7f3f7cf576ee57d20432b0f81598d4e8cf203bd399a55016bbebfdb9
4
- data.tar.gz: 2d306870e9a52bda078216596d734b0bb1b8736d647fcf739c8792b06054ba15
3
+ metadata.gz: afe6bdfcb9c5d9773d369ba750d43c797614ff24f9e9bd4c10eeb645b12e122e
4
+ data.tar.gz: cfdb37ee53d4d4ead59f99a7f5e1a767211c848c8109ed1f2b71ff84ae8e47d1
5
5
  SHA512:
6
- metadata.gz: a1d79bff9ac3c1d4c846d042a9fb061ea9128a93061346f50a69e4155d4270152830ea77aea7197bd460089e2eb69f99290c11964d2879ab908a037ff5cbd88d
7
- data.tar.gz: eeaf82f5f161738451e49cb11c2e5c7c6d0009a12ac3b9f3f282cd7237e1633afa865eb97cc03fec16168f7184a770c021d894bdbc58805479c5afda6f9600cf
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
@@ -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
- @service_params = build_params(params)
18
+ @files = handle_files(params)
19
+ @task_params = build_task_params(params)
18
20
 
19
21
  # отображение параметров для проверки
20
- puts JSON.pretty_generate(JSON.parse(@service_params)) if @debug
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', @service_params)
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 build_params(params)
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
- Md5ДополнительныхФайлов: [],
86
- ПараметрыДокумента: document_class.new.json(params)
87
- }.to_json
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: @service_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.1.0
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-10-23 00:00:00.000000000 Z
11
+ date: 2024-11-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis