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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 49947334cc7ee3ec9a5fae7622586f0ad834c515af3470beee348637742ab532
4
- data.tar.gz: 352cfe07e7b0451ce0e06a5b816d8a4ff0b72e1c623fef8cce313860e3609db4
3
+ metadata.gz: bc2c49e2954f32248580ffe84be2ca0429e8ed789dfe9a5633efb3265b68df63
4
+ data.tar.gz: 48ca3723090e666381b0fb73f4ba28289080716b92b12fadaafaabae6471e0a8
5
5
  SHA512:
6
- metadata.gz: 2a9b6e77751102b746f4332f9b4d253800b37951512abb2b7df1db1df53662890d94cb41e4c2d4626e5bd563c14bd2349111fe6069db1f273e5ceea9d4d76be7
7
- data.tar.gz: 97a48e91c2878bcce840907b92cbfc3986df3cf71a3d5b2e4541a083effb884ecac10f9b4c56334d0b5696a47f4db059006fb4d05fa4cccb33643ea6cb521c65
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, :bought_at]
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)
@@ -42,7 +42,7 @@ begin
42
42
  end
43
43
 
44
44
  # Определяем простые поля, которые не должны рассматриваться как сервисы
45
- simple_fields = [:project, :role, :environment, :registry, :bought_at]
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
@@ -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
- slug = dictionary.match(url)&.dig('name')
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
- url = dictionary.lookup(slug)&.dig('url')
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
- child_service = Service.new(service: service_name.capitalize, url: url_value)
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
- return Service.new(service: service_name.capitalize, url: url_value)
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
- child = Service.new(service: service_name.capitalize, url: url_value)
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
- child_children << Service.new(service: sub_key.to_s.capitalize, url: url_value)
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
- child_children << Service.new(service: sub_key.to_s.capitalize, url: sub_value)
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
- child = Service.new(service: key.to_s.capitalize, url: value)
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
- Service.new(service: slug, url: url)
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
@@ -1,3 +1,3 @@
1
1
  module SitedogParser
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -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
- services[service_type] = data
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)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sitedog_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ivan Nemytchenko