sitedog_parser 0.4.0 → 0.4.1
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/bin/sitedog_cli +185 -0
- data/lib/sitedog_parser/version.rb +1 -1
- 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: d0eb9da31315637d91c4b4b312cc6382a88f9c1daf094c3296b59a47ecb23169
|
4
|
+
data.tar.gz: ea11849351936255636f6c62786d24ee00a9d3a0dbff3dfbf2bb96b517ea4f26
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a368008e5bf05584aafcc201a3b36ded643743fc14f6ac4fe32376add4fbdae61e2d475e86a918df3447162526fbeaee2c1b2c68e939ace8f4f11a82a7a119ed
|
7
|
+
data.tar.gz: f1421b7c40284499abb0008559f23eb1d3e914387a3f053c1f014a603b96e33503b4459bc9b7f31364bda6bfc4100bc61065d9d78482b04f20194005aa3109fa
|
data/bin/sitedog_cli
CHANGED
@@ -5,7 +5,185 @@ require 'sitedog_parser'
|
|
5
5
|
require 'optparse'
|
6
6
|
require 'logger'
|
7
7
|
require 'yaml'
|
8
|
+
require 'json'
|
9
|
+
require 'net/http'
|
10
|
+
require 'uri'
|
11
|
+
require 'fileutils'
|
12
|
+
|
13
|
+
# Класс клиента для взаимодействия с SiteDog Cloud API
|
14
|
+
class SiteDogClient
|
15
|
+
API_URL = 'http://localhost:3005/api/v1'
|
16
|
+
CONFIG_DIR = File.join(Dir.home, '.sitedog')
|
17
|
+
CONFIG_FILE = File.join(CONFIG_DIR, 'config.json')
|
18
|
+
|
19
|
+
attr_accessor :test_mode
|
20
|
+
|
21
|
+
def initialize(test_mode = false)
|
22
|
+
@config = load_config
|
23
|
+
@test_mode = test_mode
|
24
|
+
end
|
25
|
+
|
26
|
+
def login(email, password)
|
27
|
+
uri = URI.parse("#{API_URL}/login")
|
28
|
+
params = { email: email, password: password }
|
29
|
+
|
30
|
+
response = Net::HTTP.post(uri, params.to_json, 'Content-Type' => 'application/json')
|
31
|
+
|
32
|
+
if response.code == '200'
|
33
|
+
result = JSON.parse(response.body)
|
34
|
+
if result['status'] == 'success'
|
35
|
+
@config['api_key'] = result['api_key']
|
36
|
+
save_config
|
37
|
+
puts "Авторизация успешна! API-ключ сохранен."
|
38
|
+
return true
|
39
|
+
else
|
40
|
+
puts "Ошибка: #{result['message']}"
|
41
|
+
end
|
42
|
+
else
|
43
|
+
puts "Ошибка: #{response.code} - #{response.message}"
|
44
|
+
end
|
45
|
+
|
46
|
+
false
|
47
|
+
end
|
48
|
+
|
49
|
+
def push_card(file_path, title = nil)
|
50
|
+
unless authenticated?
|
51
|
+
puts "Ошибка: Сначала выполните вход (sitedog_cli login <email> <password>)"
|
52
|
+
return false
|
53
|
+
end
|
54
|
+
|
55
|
+
# Используем имя файла как заголовок, если заголовок не указан
|
56
|
+
title = File.basename(file_path) if title.nil? || title.empty?
|
57
|
+
|
58
|
+
unless File.exist?(file_path)
|
59
|
+
puts "Ошибка: Файл не найден: #{file_path}"
|
60
|
+
return false
|
61
|
+
end
|
62
|
+
|
63
|
+
content = File.read(file_path)
|
64
|
+
|
65
|
+
# Проверяем, что содержимое является валидным YAML
|
66
|
+
begin
|
67
|
+
yaml_content = YAML.load(content)
|
68
|
+
rescue => e
|
69
|
+
puts "Ошибка: Недопустимый YAML-файл: #{e.message}"
|
70
|
+
return false
|
71
|
+
end
|
72
|
+
|
73
|
+
# В тестовом режиме просто показываем информацию
|
74
|
+
if @test_mode
|
75
|
+
puts "=== ТЕСТОВЫЙ РЕЖИМ ==="
|
76
|
+
puts "Отправка данных на API..."
|
77
|
+
puts "Заголовок: #{title}"
|
78
|
+
puts "Файл: #{file_path}"
|
79
|
+
puts "Содержимое (сокращено):"
|
80
|
+
puts " #{yaml_content.keys.join(", ")}"
|
81
|
+
puts "=== УСПЕШНО ==="
|
82
|
+
return true
|
83
|
+
end
|
84
|
+
|
85
|
+
uri = URI.parse("#{API_URL}/cards")
|
86
|
+
params = { card: { title: title, content: content } }
|
87
|
+
|
88
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
89
|
+
request = Net::HTTP::Post.new(uri.request_uri)
|
90
|
+
request['Content-Type'] = 'application/json'
|
91
|
+
request['Authorization'] = "Bearer #{@config['api_key']}"
|
92
|
+
request.body = params.to_json
|
93
|
+
|
94
|
+
response = http.request(request)
|
95
|
+
|
96
|
+
if response.code == '201'
|
97
|
+
result = JSON.parse(response.body)
|
98
|
+
puts "Карточка успешно отправлена!"
|
99
|
+
puts "ID: #{result['data']['id']}"
|
100
|
+
puts "Заголовок: #{result['data']['title']}"
|
101
|
+
return true
|
102
|
+
else
|
103
|
+
puts "Ошибка: #{response.code} - #{response.message}"
|
104
|
+
puts response.body if response.body
|
105
|
+
return false
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
private
|
110
|
+
|
111
|
+
def authenticated?
|
112
|
+
# В тестовом режиме всегда считаем, что аутентификация пройдена
|
113
|
+
return true if @test_mode
|
114
|
+
|
115
|
+
# Проверяем наличие API-ключа
|
116
|
+
@config && @config['api_key']
|
117
|
+
end
|
118
|
+
|
119
|
+
def load_config
|
120
|
+
return {} unless File.exist?(CONFIG_FILE)
|
121
|
+
|
122
|
+
begin
|
123
|
+
JSON.parse(File.read(CONFIG_FILE))
|
124
|
+
rescue
|
125
|
+
{}
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def save_config
|
130
|
+
FileUtils.mkdir_p(CONFIG_DIR) unless Dir.exist?(CONFIG_DIR)
|
131
|
+
File.write(CONFIG_FILE, @config.to_json)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
# Проверка, если первый аргумент - команда для API
|
136
|
+
if ARGV.size > 0 && ['login', 'push'].include?(ARGV[0])
|
137
|
+
command = ARGV.shift
|
138
|
+
|
139
|
+
# Создаем клиент только для login, для push будет создан позже с test_mode
|
140
|
+
if command == 'login'
|
141
|
+
client = SiteDogClient.new
|
142
|
+
|
143
|
+
if ARGV.size < 2
|
144
|
+
puts "Ошибка: Требуется email и пароль"
|
145
|
+
puts "Использование: sitedog_cli login <email> <password>"
|
146
|
+
exit 1
|
147
|
+
end
|
148
|
+
|
149
|
+
email = ARGV[0]
|
150
|
+
password = ARGV[1]
|
151
|
+
exit(client.login(email, password) ? 0 : 1)
|
152
|
+
elsif command == 'push'
|
153
|
+
# По умолчанию ищем .sitedog в текущей директории
|
154
|
+
default_file = '.sitedog'
|
155
|
+
|
156
|
+
# Проверяем опции для тестового режима
|
157
|
+
test_mode = false
|
158
|
+
if ARGV.include?('--test')
|
159
|
+
test_mode = true
|
160
|
+
ARGV.delete('--test')
|
161
|
+
end
|
162
|
+
|
163
|
+
if ARGV.empty?
|
164
|
+
# Если аргументы отсутствуют, используем файл по умолчанию
|
165
|
+
if File.exist?(default_file)
|
166
|
+
file_path = default_file
|
167
|
+
title = File.basename(Dir.pwd) # Используем имя текущей директории как заголовок
|
168
|
+
else
|
169
|
+
puts "Ошибка: Файл #{default_file} не найден в текущей директории."
|
170
|
+
puts "Использование: sitedog_cli push [file_path] [--test]"
|
171
|
+
exit 1
|
172
|
+
end
|
173
|
+
else
|
174
|
+
# Первый аргумент - путь к файлу
|
175
|
+
file_path = ARGV[0]
|
176
|
+
title = File.basename(file_path) # Используем имя файла как заголовок по умолчанию
|
177
|
+
end
|
178
|
+
|
179
|
+
client = SiteDogClient.new(test_mode)
|
180
|
+
exit(client.push_card(file_path, title) ? 0 : 1)
|
181
|
+
end
|
182
|
+
|
183
|
+
exit 0
|
184
|
+
end
|
8
185
|
|
186
|
+
# Для стандартной функциональности парсинга YAML -> JSON
|
9
187
|
# Set default options
|
10
188
|
options = {
|
11
189
|
debug: false,
|
@@ -24,6 +202,13 @@ end
|
|
24
202
|
# Command line options parser
|
25
203
|
option_parser = OptionParser.new do |opts|
|
26
204
|
opts.banner = "Usage: sitedog_cli [options] <path_to_yaml_file> [output_file]"
|
205
|
+
opts.separator ""
|
206
|
+
opts.separator "Commands:"
|
207
|
+
opts.separator " login <email> <password> - войти в систему и получить API-ключ"
|
208
|
+
opts.separator " push [file_path] - отправить YAML-файл как карточку (по умолчанию использует .sitedog)"
|
209
|
+
opts.separator " --test - запустить в тестовом режиме без отправки данных на сервер"
|
210
|
+
opts.separator ""
|
211
|
+
opts.separator "Options:"
|
27
212
|
|
28
213
|
opts.on("-d", "--debug", "Enable debug output") do
|
29
214
|
options[:debug] = true
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sitedog_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ivan Nemytchenko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-05-
|
11
|
+
date: 2025-05-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|