sitedog_parser 0.1.1 → 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 +4 -4
- data/README.md +1 -1
- data/bin/analyze_dictionary +1 -1
- data/lib/service.rb +7 -2
- data/lib/service_factory.rb +84 -9
- data/lib/sitedog_parser/version.rb +1 -1
- data/lib/sitedog_parser.rb +18 -4
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bc2c49e2954f32248580ffe84be2ca0429e8ed789dfe9a5633efb3265b68df63
|
4
|
+
data.tar.gz: 48ca3723090e666381b0fb73f4ba28289080716b92b12fadaafaabae6471e0a8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '09f672c98c9e504c25b340e11a174b3eb7ca16c9366e5d0b6c746f7a7d24fbf7c72822242a47452b507d432a671ba4054c0ded9b245128c5cf9f8f0a8d9cdc86'
|
7
|
+
data.tar.gz: 4a378dde7d127218003fbe641b8d505dcd30c038f18533bd673ee8f9e3221eed3d7aa087d7516ce5707d66fc4d21e61978d15796062de89f7db2e52b40b34305
|
data/README.md
CHANGED
@@ -61,7 +61,7 @@ You can specify which fields should be treated as simple string values, not as s
|
|
61
61
|
|
62
62
|
```ruby
|
63
63
|
# Define which fields should remain as simple strings (not wrapped in Service objects)
|
64
|
-
simple_fields = [:project, :role, :environment, :registry
|
64
|
+
simple_fields = [:project, :role, :environment, :registry]
|
65
65
|
|
66
66
|
# Parse with simple fields
|
67
67
|
parsed_data = SitedogParser::Parser.parse(yaml_data, simple_fields: simple_fields)
|
data/bin/analyze_dictionary
CHANGED
@@ -42,7 +42,7 @@ begin
|
|
42
42
|
end
|
43
43
|
|
44
44
|
# Определяем простые поля, которые не должны рассматриваться как сервисы
|
45
|
-
simple_fields = [:project, :role, :environment, :registry
|
45
|
+
simple_fields = [:project, :role, :environment, :registry]
|
46
46
|
|
47
47
|
# Анализируем данные через наш интерфейс Parser
|
48
48
|
data = SitedogParser::Parser.parse(sites_data, simple_fields: simple_fields, dictionary_path: dictionary_path)
|
data/lib/service.rb
CHANGED
@@ -1,11 +1,16 @@
|
|
1
|
-
class Service < Data.define(:service, :url, :children)
|
2
|
-
def initialize(service:, url: nil, children: [])
|
1
|
+
class Service < Data.define(:service, :url, :children, :image_url)
|
2
|
+
def initialize(service:, url: nil, children: [], image_url: nil)
|
3
3
|
raise ArgumentError, "Service cannot be empty" if service.nil? || service.empty?
|
4
4
|
|
5
5
|
service => String
|
6
6
|
url => String if url
|
7
7
|
children => Array if children
|
8
|
+
image_url => String if image_url
|
8
9
|
|
9
10
|
super
|
10
11
|
end
|
12
|
+
|
13
|
+
def has_children?
|
14
|
+
!children.empty?
|
15
|
+
end
|
11
16
|
end
|
data/lib/service_factory.rb
CHANGED
@@ -18,11 +18,13 @@ class ServiceFactory
|
|
18
18
|
slug = nil
|
19
19
|
url = nil
|
20
20
|
dictionary = Dictionary.new(dictionary_path)
|
21
|
+
dict_entry = nil
|
21
22
|
|
22
23
|
case data
|
23
24
|
in String if UrlChecker.url_like?(data) # url
|
24
25
|
url = UrlChecker.normalize_url(data)
|
25
|
-
|
26
|
+
dict_entry = dictionary.match(url)
|
27
|
+
slug = dict_entry&.dig('name')
|
26
28
|
|
27
29
|
# If not found in dictionary and service_type exists, use it
|
28
30
|
if slug.nil? && service_type
|
@@ -35,11 +37,20 @@ class ServiceFactory
|
|
35
37
|
puts "url: #{slug} <- #{url}"
|
36
38
|
in String if !UrlChecker.url_like?(data) # slug
|
37
39
|
slug = data
|
38
|
-
|
40
|
+
dict_entry = dictionary.lookup(slug)
|
41
|
+
|
42
|
+
# Если нашли запись в словаре, используем её имя
|
43
|
+
if dict_entry && dict_entry['name']
|
44
|
+
slug = dict_entry['name']
|
45
|
+
end
|
46
|
+
|
47
|
+
url = dict_entry&.dig('url')
|
39
48
|
puts "slug: #{slug} -> #{url}"
|
40
49
|
in { service: String => service_slug, url: String => service_url }
|
41
50
|
slug = service_slug.to_s.capitalize
|
42
51
|
url = service_url
|
52
|
+
# Поиск в словаре после получения slug
|
53
|
+
dict_entry = dictionary.lookup(slug)
|
43
54
|
puts "hash: #{slug} + #{url}"
|
44
55
|
in Hash
|
45
56
|
puts "hash: #{data}"
|
@@ -57,7 +68,30 @@ class ServiceFactory
|
|
57
68
|
children = []
|
58
69
|
data.each do |key, url_value|
|
59
70
|
service_name = key.to_s
|
60
|
-
|
71
|
+
# Первый приоритет - поиск в словаре по URL
|
72
|
+
child_dict_entry = dictionary.match(url_value)
|
73
|
+
|
74
|
+
if child_dict_entry && child_dict_entry['name']
|
75
|
+
# Если нашли запись в словаре по URL, используем её имя вместо ключа
|
76
|
+
service_name = child_dict_entry['name']
|
77
|
+
else
|
78
|
+
# Если записи в словаре нет по URL, ищем по имени
|
79
|
+
key_dict_entry = dictionary.lookup(service_name)
|
80
|
+
if key_dict_entry && key_dict_entry['name']
|
81
|
+
service_name = key_dict_entry['name']
|
82
|
+
else
|
83
|
+
# Если не нашли в словаре ни по URL, ни по имени, капитализируем исходное имя
|
84
|
+
service_name = service_name.capitalize
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
child_image_url = child_dict_entry&.dig('image_url')
|
89
|
+
|
90
|
+
child_service = Service.new(
|
91
|
+
service: service_name,
|
92
|
+
url: url_value,
|
93
|
+
image_url: child_image_url
|
94
|
+
)
|
61
95
|
children << child_service
|
62
96
|
end
|
63
97
|
|
@@ -79,7 +113,15 @@ class ServiceFactory
|
|
79
113
|
url_key = data.key?(:url) ? :url : "url"
|
80
114
|
url_value = data[url_key]
|
81
115
|
|
82
|
-
|
116
|
+
# Ищем в словаре
|
117
|
+
service_dict_entry = dictionary.lookup(service_name) || dictionary.match(url_value)
|
118
|
+
service_image_url = service_dict_entry&.dig('image_url')
|
119
|
+
|
120
|
+
return Service.new(
|
121
|
+
service: service_name.capitalize,
|
122
|
+
url: url_value,
|
123
|
+
image_url: service_image_url
|
124
|
+
)
|
83
125
|
end
|
84
126
|
|
85
127
|
# 3. Process nested hashes
|
@@ -98,13 +140,28 @@ class ServiceFactory
|
|
98
140
|
url_key = value.key?(:url) ? :url : "url"
|
99
141
|
url_value = value[url_key]
|
100
142
|
|
101
|
-
|
143
|
+
# Ищем в словаре
|
144
|
+
nested_dict_entry = dictionary.lookup(service_name) || dictionary.match(url_value)
|
145
|
+
nested_image_url = nested_dict_entry&.dig('image_url')
|
146
|
+
|
147
|
+
child = Service.new(
|
148
|
+
service: service_name.capitalize,
|
149
|
+
url: url_value,
|
150
|
+
image_url: nested_image_url
|
151
|
+
)
|
102
152
|
# 3.2 If value has hash with only URL-like values
|
103
153
|
elsif value.values.all? { |v| v.is_a?(String) && UrlChecker.url_like?(v) }
|
104
154
|
child_children = []
|
105
155
|
|
106
156
|
value.each do |sub_key, url_value|
|
107
|
-
|
157
|
+
sub_dict_entry = dictionary.lookup(sub_key.to_s) || dictionary.match(url_value)
|
158
|
+
sub_image_url = sub_dict_entry&.dig('image_url')
|
159
|
+
|
160
|
+
child_children << Service.new(
|
161
|
+
service: sub_key.to_s.capitalize,
|
162
|
+
url: url_value,
|
163
|
+
image_url: sub_image_url
|
164
|
+
)
|
108
165
|
end
|
109
166
|
|
110
167
|
child = Service.new(service: key.to_s, children: child_children)
|
@@ -120,7 +177,14 @@ class ServiceFactory
|
|
120
177
|
value.each do |sub_key, sub_value|
|
121
178
|
if sub_value.is_a?(String) && UrlChecker.url_like?(sub_value)
|
122
179
|
has_urls = true
|
123
|
-
|
180
|
+
sub_dict_entry = dictionary.lookup(sub_key.to_s) || dictionary.match(sub_value)
|
181
|
+
sub_image_url = sub_dict_entry&.dig('image_url')
|
182
|
+
|
183
|
+
child_children << Service.new(
|
184
|
+
service: sub_key.to_s.capitalize,
|
185
|
+
url: sub_value,
|
186
|
+
image_url: sub_image_url
|
187
|
+
)
|
124
188
|
end
|
125
189
|
end
|
126
190
|
|
@@ -129,7 +193,14 @@ class ServiceFactory
|
|
129
193
|
end
|
130
194
|
# 3.4 If the value is a URL string
|
131
195
|
elsif value.is_a?(String) && UrlChecker.url_like?(value)
|
132
|
-
|
196
|
+
url_dict_entry = dictionary.match(value)
|
197
|
+
url_image_url = url_dict_entry&.dig('image_url')
|
198
|
+
|
199
|
+
child = Service.new(
|
200
|
+
service: key.to_s.capitalize,
|
201
|
+
url: value,
|
202
|
+
image_url: url_image_url
|
203
|
+
)
|
133
204
|
end
|
134
205
|
|
135
206
|
children << child if child
|
@@ -169,7 +240,11 @@ class ServiceFactory
|
|
169
240
|
|
170
241
|
# Create service with collected data
|
171
242
|
if slug
|
172
|
-
|
243
|
+
# Получаем URL изображения из записи словаря, если она есть
|
244
|
+
image_url = dict_entry&.dig('image_url')
|
245
|
+
|
246
|
+
# Создаем сервис со всеми данными сразу
|
247
|
+
Service.new(service: slug, url: url, image_url: image_url)
|
173
248
|
else
|
174
249
|
nil
|
175
250
|
end
|
data/lib/sitedog_parser.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require "sitedog_parser/version"
|
2
2
|
require 'yaml'
|
3
|
+
require 'date'
|
3
4
|
|
4
5
|
require_relative "service"
|
5
6
|
require_relative "dictionary"
|
@@ -40,10 +41,23 @@ module SitedogParser
|
|
40
41
|
|
41
42
|
# Process each service type and its data
|
42
43
|
items.each do |service_type, data|
|
43
|
-
# Проверяем, является ли это поле "простым"
|
44
|
-
if simple_fields.include?(service_type)
|
45
|
-
#
|
46
|
-
|
44
|
+
# Проверяем, является ли это поле "простым", имеет суффикс _at, или данные - экземпляр DateTime
|
45
|
+
if simple_fields.include?(service_type) || service_type.to_s.end_with?('_at') || data.is_a?(DateTime)
|
46
|
+
# Если данные уже DateTime, сохраняем как есть
|
47
|
+
if data.is_a?(DateTime)
|
48
|
+
services[service_type] = data
|
49
|
+
# Для полей _at пробуем преобразовать строку в DateTime
|
50
|
+
elsif service_type.to_s.end_with?('_at') && data.is_a?(String)
|
51
|
+
begin
|
52
|
+
services[service_type] = DateTime.parse(data)
|
53
|
+
rescue Date::Error
|
54
|
+
# Если не удалось преобразовать, оставляем как строку
|
55
|
+
services[service_type] = data
|
56
|
+
end
|
57
|
+
else
|
58
|
+
# Для обычных простых полей просто сохраняем значение
|
59
|
+
services[service_type] = data
|
60
|
+
end
|
47
61
|
else
|
48
62
|
# Для обычных полей создаем сервис
|
49
63
|
service = ServiceFactory.create(data, service_type, dictionary_path)
|