docgen-adapter 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +64 -0
- data/lib/docgen-adapter.rb +1 -0
- data/lib/docgen_adapter/configuration.rb +17 -0
- data/lib/docgen_adapter.rb +125 -0
- metadata +67 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 5843bd2a380e11e802a39d91839e5daa56ed848ebf3f9c1ec8d4c02a5fe96331
|
4
|
+
data.tar.gz: a1d2955903f75f3b1a5d64cc03cd16b879c7346aab5e5259bdd6a7c376557609
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 62f713cb8e3a6047295e8dabf3a2f11d20498e53448dcb2ffa75d5fe1e1b02fd4295b6871aa0a3a28d5910930c5d2202725df36bf3eba77da8d4ab740819e148
|
7
|
+
data.tar.gz: 23d0dd3ac4e4686756df2f0237997b45db796a4c80e0e665d20a6ad1d019156370da7e207c8b0f5f5bca7c7dd7e9e1f837e37342628197e955aa9967539f49ab
|
data/README.md
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
# DocGen Adapter
|
2
|
+
[![Gem Version](https://badge.fury.io/rb/docgen-adapter.svg)](https://badge.fury.io/rb/docgen-adapter)
|
3
|
+
|
4
|
+
Гем для адаптации собственного сервиса генерации документов и упрощения работы с ним.
|
5
|
+
|
6
|
+
## Установка
|
7
|
+
|
8
|
+
Добавить в Gemfile
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
gem 'docgen-adapter'
|
12
|
+
```
|
13
|
+
|
14
|
+
И выполнить:
|
15
|
+
|
16
|
+
```bash
|
17
|
+
bundle
|
18
|
+
```
|
19
|
+
|
20
|
+
## Конфигурация
|
21
|
+
|
22
|
+
Добавьте файл конфигурации `config/initializers/docgen_adapter.rb` и задайте необходимые настройки:
|
23
|
+
|
24
|
+
```ruby
|
25
|
+
DocgenAdapter.configure do |config|
|
26
|
+
|
27
|
+
config.redis_host = ''
|
28
|
+
config.redis_port = ''
|
29
|
+
config.redis_password = ''
|
30
|
+
|
31
|
+
end
|
32
|
+
```
|
33
|
+
|
34
|
+
## Использование
|
35
|
+
|
36
|
+
Использование с помощью вызова метода `generate` класса `DocgenAdapter`. Например:
|
37
|
+
|
38
|
+
```ruby
|
39
|
+
params = {
|
40
|
+
DocumentNumber: 12345678,
|
41
|
+
Houses: [
|
42
|
+
{
|
43
|
+
HouseAddress: 'г. Калуга',
|
44
|
+
PersonFIO: 'Иванов ИИ',
|
45
|
+
PersonState: 'электромонтер',
|
46
|
+
PersonPhone: '89171234567',
|
47
|
+
OrganizationName: 'Россети',
|
48
|
+
OrganizationAddress: 'г. Обнинск',
|
49
|
+
OrganizationPhone: '1234567',
|
50
|
+
OrganizationCite: 'https://www.rosseti.ru'
|
51
|
+
}
|
52
|
+
]
|
53
|
+
}
|
54
|
+
|
55
|
+
DocgenAdapter.new(type: 'docx', doc_id: 1, debug: true).generate(params)
|
56
|
+
```
|
57
|
+
|
58
|
+
Опции:
|
59
|
+
|
60
|
+
- `type` - тип документа, возможные значения: `docx`, `xlsx`
|
61
|
+
|
62
|
+
- `doc_id` - ID документа
|
63
|
+
|
64
|
+
- `debug` - необязательная опция для дебага, при передаче `debug: true` при вызове отображаются формируемые параметры
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'docgen_adapter'
|
@@ -0,0 +1,125 @@
|
|
1
|
+
require 'docgen_adapter/configuration'
|
2
|
+
require 'redis'
|
3
|
+
|
4
|
+
class DocgenAdapter
|
5
|
+
|
6
|
+
def initialize(type:, doc_id:, debug: false)
|
7
|
+
# аргументы сервиса
|
8
|
+
@type = type
|
9
|
+
@doc_id = doc_id
|
10
|
+
@debug = Rails.env.development? && debug
|
11
|
+
@task_id = SecureRandom.uuid
|
12
|
+
|
13
|
+
# формирование названия генерируемого файла
|
14
|
+
dir = Dir.mktmpdir
|
15
|
+
@filename = "#{dir}/#{@task_id}_#{@doc_id}.#{@type}"
|
16
|
+
end
|
17
|
+
|
18
|
+
# выполнение генерации документа
|
19
|
+
def generate(params = {})
|
20
|
+
@service_params = build_params(params)
|
21
|
+
|
22
|
+
# отображение параметров для проверки
|
23
|
+
puts JSON.pretty_generate(JSON.parse(@service_params)) if @debug
|
24
|
+
|
25
|
+
# подписка ка канал и ожидание сообщений в другом потоке
|
26
|
+
Thread.new { subscribe_and_listen }
|
27
|
+
|
28
|
+
# ожидание
|
29
|
+
sleep(0.5)
|
30
|
+
|
31
|
+
# отправка сообщения с заданием
|
32
|
+
redis.publish('TASKS', @service_params)
|
33
|
+
|
34
|
+
# путь до сгенерированного файла в ответе
|
35
|
+
@filename
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
# соединение с микросервисом через Redis
|
41
|
+
def redis
|
42
|
+
@redis ||= Redis.new(
|
43
|
+
host: DocgenAdapter.config.redis_host,
|
44
|
+
port: DocgenAdapter.config.redis_port,
|
45
|
+
password: DocgenAdapter.config.redis_password
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
49
|
+
# подписаться на канал задания и ожидать сообщения
|
50
|
+
def subscribe_and_listen
|
51
|
+
redis.subscribe(@task_id) do |on|
|
52
|
+
on.subscribe do |channel|
|
53
|
+
puts "Подписка на канал задания #{channel}"
|
54
|
+
end
|
55
|
+
|
56
|
+
# обработка сообщений
|
57
|
+
on.message do |_channel, message|
|
58
|
+
handle_redis_message(message)
|
59
|
+
end
|
60
|
+
|
61
|
+
on.unsubscribe do |channel|
|
62
|
+
puts "Отписка от канала задания #{channel}"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# формирование объекта с параметрами
|
68
|
+
def build_params(params)
|
69
|
+
{
|
70
|
+
ИдентификаторЗадачи: @task_id,
|
71
|
+
ИдентификаторДокумента: @doc_id,
|
72
|
+
ТипДокумента: @type,
|
73
|
+
Md5ДополнительныхФайлов: [],
|
74
|
+
ПараметрыДокумента: params
|
75
|
+
}.to_json
|
76
|
+
end
|
77
|
+
|
78
|
+
# обработка сообщения пришедшего в канал Redis
|
79
|
+
def handle_redis_message(message)
|
80
|
+
# игнорируем сообщение с ID задания
|
81
|
+
return if message == @task_id
|
82
|
+
|
83
|
+
case message.encoding.to_s
|
84
|
+
when 'UTF-8'
|
85
|
+
handle_doc_info(message)
|
86
|
+
when 'ASCII-8BIT'
|
87
|
+
handle_doc_file(message)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# обработка JSON с информацией о документе
|
92
|
+
def handle_doc_info(message)
|
93
|
+
object = JSON.parse(message)
|
94
|
+
|
95
|
+
case object['Результат']
|
96
|
+
when 0
|
97
|
+
# успех
|
98
|
+
# TODO: добавить обработку
|
99
|
+
when 1
|
100
|
+
# ошибка
|
101
|
+
exception_msg = handle_exception(object)
|
102
|
+
raise StandardError.new(exception_msg)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
# обработка бинарных данных файла документа
|
107
|
+
def handle_doc_file(message)
|
108
|
+
# запись бинарных данных в файл
|
109
|
+
File.write @filename, message.force_encoding('utf-8')
|
110
|
+
|
111
|
+
# сообщение с файлом приходит последним - отписка от канала Redis
|
112
|
+
redis.unsubscribe
|
113
|
+
end
|
114
|
+
|
115
|
+
def handle_exception(object)
|
116
|
+
text = "Генерация документа #{@doc_type}: #{object['ИдентификаторЗадачи']}\n" + object['ОписаниеОшибки']['Сообщение'] + object['ОписаниеОшибки']['СтекВызовов']
|
117
|
+
|
118
|
+
if Rails.env.development?
|
119
|
+
puts text
|
120
|
+
else
|
121
|
+
Rollbar.error(text, params: @service_params)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
metadata
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: docgen-adapter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Павел Бабин
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2024-10-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: redis
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '5.3'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 5.3.0
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '5.3'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 5.3.0
|
33
|
+
description: Адаптер собственного сервиса генерации документов
|
34
|
+
email: babin359@gmail.com
|
35
|
+
executables: []
|
36
|
+
extensions: []
|
37
|
+
extra_rdoc_files: []
|
38
|
+
files:
|
39
|
+
- README.md
|
40
|
+
- lib/docgen-adapter.rb
|
41
|
+
- lib/docgen_adapter.rb
|
42
|
+
- lib/docgen_adapter/configuration.rb
|
43
|
+
homepage:
|
44
|
+
licenses:
|
45
|
+
- MIT
|
46
|
+
metadata:
|
47
|
+
rubygems_mfa_required: 'true'
|
48
|
+
post_install_message:
|
49
|
+
rdoc_options: []
|
50
|
+
require_paths:
|
51
|
+
- lib
|
52
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: 3.1.0
|
57
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
requirements: []
|
63
|
+
rubygems_version: 3.4.10
|
64
|
+
signing_key:
|
65
|
+
specification_version: 4
|
66
|
+
summary: Адаптер собственного сервиса генерации документов
|
67
|
+
test_files: []
|