cdek 0.3.9
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 +7 -0
- data/CHANGELOG.md +123 -0
- data/LICENSE +21 -0
- data/README.md +138 -0
- data/app/assets/javascripts/cdek/widget.umd.js +2 -0
- data/app/controllers/cdek/widget_service_controller.rb +78 -0
- data/app/helpers/cdek/widget_helper.rb +133 -0
- data/cdek.gemspec +38 -0
- data/config/routes.rb +11 -0
- data/lib/cdek/client.rb +41 -0
- data/lib/cdek/configuration.rb +56 -0
- data/lib/cdek/connection.rb +228 -0
- data/lib/cdek/engine.rb +46 -0
- data/lib/cdek/error.rb +31 -0
- data/lib/cdek/railtie.rb +11 -0
- data/lib/cdek/resources/base.rb +17 -0
- data/lib/cdek/resources/deliverypoints.rb +50 -0
- data/lib/cdek/resources/locations.rb +47 -0
- data/lib/cdek/version.rb +5 -0
- data/lib/cdek.rb +69 -0
- data/lib/generators/cdek/install/install_generator.rb +56 -0
- data/lib/generators/cdek/install/templates/cdek.rb +32 -0
- data/lib/generators/cdek/install/templates/cdek_widget_controller.js +184 -0
- metadata +78 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 6c7afff0a9b23550c0fd818553814200a2550c8088c775b9dc43344a6ce82b2f
|
|
4
|
+
data.tar.gz: f427ad01eb5f7616d30a957bb3b2ac7dd9e6e089dd2e0ff2c9c8c5abd17a630f
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 740f1d591c45ab97ae6e571671cced18c139dcd955977a2776ef19ed8db871746ca403f6dfe4f9c9c034edcabd254634225618e5ded052f0d0c17321275416dd
|
|
7
|
+
data.tar.gz: cc8d3e212823258212ad61d44343d09d5847f99f00219dadfb842ca23e295ba8e9a3caf27ac5232aa09ff7a1bebd8ec86d8a5ee12200406fefd5d90d6527374e
|
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.3.9
|
|
4
|
+
|
|
5
|
+
* В `cdek.gemspec` добавлена development-зависимость `rake`, потому что
|
|
6
|
+
`Rakefile` использует `bundler/gem_tasks`, а `bundle exec rake build`
|
|
7
|
+
падал, если `rake` не был явно включён в bundle.
|
|
8
|
+
|
|
9
|
+
## 0.3.8
|
|
10
|
+
|
|
11
|
+
* `cdek_widget_tag` больше не подставляет статичный DEFAULT_GOODS, если
|
|
12
|
+
хост-приложение не передало `goods:`. Это убирает расчёт доставки по
|
|
13
|
+
выдуманному коробу: реальные габариты и вес должны приходить из корзины
|
|
14
|
+
хост-приложения.
|
|
15
|
+
* Шаблон `cdek_widget_controller.js` больше не фильтрует тарифы жёстким
|
|
16
|
+
списком `office: [136, 234]`. Виджет получает полный ответ CDEK и сам
|
|
17
|
+
выбирает доступные тарифы, поэтому новые/региональные тарифы не
|
|
18
|
+
отбрасываются на фронте.
|
|
19
|
+
* Шаблон `cdek_widget_controller.js` пишет выбранный ПВЗ из полей
|
|
20
|
+
`office.address` и `office.city_code`, а не из `office.location`, где
|
|
21
|
+
виджет передаёт координаты.
|
|
22
|
+
* Логи HTTP-клиента маскируют OAuth body и `access_token`, чтобы
|
|
23
|
+
`client_secret` и токен не попадали в Rails logs.
|
|
24
|
+
|
|
25
|
+
## 0.3.7
|
|
26
|
+
|
|
27
|
+
* `cdek_widget_tag`: добавлен параметр `goods:` — массив хэшей
|
|
28
|
+
`{ width:, height:, length:, weight: }`, описывающих габариты и вес
|
|
29
|
+
отправления для расчёта тарифа. По умолчанию — один «средний коробок»
|
|
30
|
+
30×10×30 см / 1 кг (как было захардкожено в шаблоне Stimulus в 0.3.6).
|
|
31
|
+
Хост-приложения с реальными корзинами могут собрать массив из cart-items
|
|
32
|
+
(например, в presenter'е/decorator'е) и передать в хелпер, чтобы CDEK
|
|
33
|
+
считал тариф по фактическим габаритам.
|
|
34
|
+
* Шаблон `cdek_widget_controller.js`: новое значение `goods` (JSON-строка),
|
|
35
|
+
парсится с fallback на дефолт при пустом значении или невалидном JSON.
|
|
36
|
+
Хост-приложениям, уже сгенерировавшим контроллер на 0.3.6, надо
|
|
37
|
+
перегенерировать его (`bin/rails generate cdek:install`) или обновить
|
|
38
|
+
вручную, если хочется использовать `goods:` из помощника.
|
|
39
|
+
* `Cdek::WidgetServiceController`: `protect_from_forgery with: :null_session`
|
|
40
|
+
заменён на `skip_forgery_protection`. CSRF и так не проверялся (виджет
|
|
41
|
+
не знает о Rails-токенах), но `:null_session` оставлял в логах
|
|
42
|
+
предупреждение `Can't verify CSRF token authenticity` на каждый POST
|
|
43
|
+
виджета. С `skip_forgery_protection` поведение идентичное, но без шума
|
|
44
|
+
в логах и без создания пустой null-сессии.
|
|
45
|
+
|
|
46
|
+
## 0.3.6
|
|
47
|
+
|
|
48
|
+
* `Cdek::WidgetServiceController`: явно отключён `wrap_parameters` и
|
|
49
|
+
добавлена фильтрация ключа-обёртки `widget_service` из параметров,
|
|
50
|
+
уходящих в CDEK API. Раньше Rails при JSON-POST дублировал все поля
|
|
51
|
+
body под ключом контроллера (`widget_service: {...}`), и эта обёртка
|
|
52
|
+
утекала в `/calculator/tarifflist` как лишний ключ. CDEK игнорировал
|
|
53
|
+
его (200 OK), но логи и сетевой трафик засорялись копией всего тела.
|
|
54
|
+
* `cdek_widget_tag`: добавлен параметр `sender_city_code:` (Integer,
|
|
55
|
+
опционально) — CDEK-код города отправителя. Без него виджет передавал
|
|
56
|
+
в `from` только `{ address: ... }`, и CDEK возвращал только тарифы
|
|
57
|
+
`дверь-*` — виджет не мог выбрать тариф для опции «доставка в офис»
|
|
58
|
+
и показывал «Выберите тариф». С `sender_city_code:` в `from` уходит
|
|
59
|
+
`{ code: <N> }`, и CDEK возвращает полный набор тарифов включая
|
|
60
|
+
склад-склад (136, 234). Параметр опционален: без него поведение
|
|
61
|
+
прежнее (fallback на address) — обратная совместимость сохранена.
|
|
62
|
+
* Шаблон `cdek_widget_controller.js`: добавлено значение
|
|
63
|
+
`senderCityCode` и выбор формы `from` по нему. Хост-приложениям,
|
|
64
|
+
которые уже сгенерировали контроллер на 0.3.5 и хотят склад-склад
|
|
65
|
+
тарифы, нужно либо перегенерировать его (`bin/rails generate
|
|
66
|
+
cdek:install`), либо обновить копию вручную из этого шаблона.
|
|
67
|
+
|
|
68
|
+
## 0.3.5
|
|
69
|
+
|
|
70
|
+
* Хелпер `cdek_widget_tag` теперь добавляет `position: relative` к
|
|
71
|
+
inline-стилям внешнего контейнера `.cdek-widget` и root-элемента
|
|
72
|
+
`.cdek-widget__root`. Это требование самого виджета: внутри он рисует
|
|
73
|
+
overlay'и карты, тултипы и поповеры через `position: absolute`, и без
|
|
74
|
+
позиционированного предка они привязываются к ближайшему
|
|
75
|
+
позиционированному элементу (часто — корню документа) и визуально
|
|
76
|
+
«уезжают» за пределы виджета. Хост-приложениям больше не нужно
|
|
77
|
+
прописывать `position: relative` у себя в CSS.
|
|
78
|
+
|
|
79
|
+
## 0.3.4
|
|
80
|
+
|
|
81
|
+
* **Критический фикс шаблона Stimulus-контроллера** в
|
|
82
|
+
`lib/generators/cdek/install/templates/cdek_widget_controller.js`.
|
|
83
|
+
Виджет `@cdek-it/widget@3` ожидает параметр `root` как строковый id,
|
|
84
|
+
не как HTMLElement. Шаблон теперь ставит уникальный id на root-таргет
|
|
85
|
+
и передаёт виджету именно строку. До этого виджет работал «в
|
|
86
|
+
стороне» — запросы офисов проходили 200 OK, но UI не отрисовывался
|
|
87
|
+
в хост-приложении.
|
|
88
|
+
|
|
89
|
+
## 0.3.3
|
|
90
|
+
|
|
91
|
+
* Откат flex-лейаута контейнера, введённого в 0.3.2. Box-model
|
|
92
|
+
с явной высотой работает надёжнее.
|
|
93
|
+
|
|
94
|
+
## 0.3.2
|
|
95
|
+
|
|
96
|
+
* Попытка перевести контейнер виджета на flex-column. Откачена в 0.3.3.
|
|
97
|
+
|
|
98
|
+
## 0.3.1
|
|
99
|
+
|
|
100
|
+
* Дефолтный шаблон `config/initializers/cdek.rb`: production-режим по
|
|
101
|
+
умолчанию; песочница — через `ENV["CDEK_SANDBOX"]`.
|
|
102
|
+
|
|
103
|
+
## 0.3.0
|
|
104
|
+
|
|
105
|
+
* Гем превращён в монтируемый Rails Engine (`Cdek::Engine`).
|
|
106
|
+
* Серверный прокси `Cdek::WidgetServiceController` для JS-виджета ПВЗ.
|
|
107
|
+
* Вендорный UMD-бандл `@cdek-it/widget@3.11.1` через asset pipeline.
|
|
108
|
+
* View-хелпер `cdek_widget_tag`.
|
|
109
|
+
* Генератор `cdek:install` ставит initializer + Stimulus-контроллер.
|
|
110
|
+
|
|
111
|
+
### Breaking changes
|
|
112
|
+
|
|
113
|
+
* `Cdek::Railtie` удалён, заменён на `Cdek::Engine`.
|
|
114
|
+
|
|
115
|
+
## 0.2.0
|
|
116
|
+
|
|
117
|
+
* High-level ресурсы `Cdek::Resources::Locations` и
|
|
118
|
+
`Cdek::Resources::Deliverypoints`.
|
|
119
|
+
|
|
120
|
+
## 0.1.0
|
|
121
|
+
|
|
122
|
+
* Первый релиз: тонкий клиент CDEK API v2, OAuth2, иерархия ошибок,
|
|
123
|
+
Railtie, генератор `cdek:install`.
|
data/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Sergey
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# cdek
|
|
2
|
+
|
|
3
|
+
Минималистичный Ruby/Rails-клиент для CDEK API v2 + монтируемый Rails Engine
|
|
4
|
+
с виджетом ПВЗ «в коробке». Никаких внешних рантайм-зависимостей.
|
|
5
|
+
|
|
6
|
+
* OAuth2 client_credentials c потокобезопасным кэшем токена.
|
|
7
|
+
* Конфигурация через ENV или Rails-инициализатор.
|
|
8
|
+
* High-level ресурсы для частых задач: `Cdek.locations`, `Cdek.deliverypoints`.
|
|
9
|
+
* **Rails Engine** с прокси-эндпоинтом для официального JS-виджета ПВЗ
|
|
10
|
+
(cdek-it/widget@3).
|
|
11
|
+
* Вендорный UMD-бандл виджета — раздаётся через asset pipeline (без CDN).
|
|
12
|
+
* View-хелпер `cdek_widget_tag` — вставка виджета одной строкой.
|
|
13
|
+
|
|
14
|
+
## Установка
|
|
15
|
+
|
|
16
|
+
```ruby
|
|
17
|
+
# Gemfile
|
|
18
|
+
gem "cdek"
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
bundle install
|
|
23
|
+
bin/rails generate cdek:install
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Генератор создаёт:
|
|
27
|
+
|
|
28
|
+
* `config/initializers/cdek.rb` — заготовку настройки;
|
|
29
|
+
* `app/javascript/controllers/cdek_widget_controller.js` — Stimulus-контроллер
|
|
30
|
+
виджета.
|
|
31
|
+
|
|
32
|
+
Маршрут смонтируйте сами:
|
|
33
|
+
|
|
34
|
+
```ruby
|
|
35
|
+
# config/routes.rb
|
|
36
|
+
Rails.application.routes.draw do
|
|
37
|
+
mount Cdek::Engine, at: "/cdek"
|
|
38
|
+
# ...
|
|
39
|
+
end
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Переменные окружения:
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
CDEK_ACCOUNT=...
|
|
46
|
+
CDEK_SECURE_PASSWORD=...
|
|
47
|
+
YANDEX_MAPS_API_KEY=... # ключ Yandex Maps JS API для карты виджета
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Использование клиента
|
|
51
|
+
|
|
52
|
+
```ruby
|
|
53
|
+
Cdek.configure do |config|
|
|
54
|
+
config.account = ENV["CDEK_ACCOUNT"]
|
|
55
|
+
config.secure_password = ENV["CDEK_SECURE_PASSWORD"]
|
|
56
|
+
config.production_mode! # или config.test_mode! для песочницы
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Низкоуровневый вызов:
|
|
60
|
+
Cdek.client.get("/deliverypoints", params: { city_code: 44, type: "PVZ" })
|
|
61
|
+
|
|
62
|
+
# High-level:
|
|
63
|
+
moscow = Cdek.locations.find_city("Москва")
|
|
64
|
+
points = Cdek.deliverypoints.pvz_for_city(moscow.fetch("code"))
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Виджет ПВЗ
|
|
68
|
+
|
|
69
|
+
В любой view:
|
|
70
|
+
|
|
71
|
+
```erb
|
|
72
|
+
<%= cdek_widget_tag api_key: ENV["YANDEX_MAPS_API_KEY"],
|
|
73
|
+
default_city: "Москва",
|
|
74
|
+
goods: current_cart.cdek_goods,
|
|
75
|
+
modal_id: "cdek-points-modal" %>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
или в HAML:
|
|
79
|
+
|
|
80
|
+
```haml
|
|
81
|
+
= cdek_widget_tag api_key: ENV["YANDEX_MAPS_API_KEY"],
|
|
82
|
+
default_city: "Москва",
|
|
83
|
+
goods: current_cart.cdek_goods,
|
|
84
|
+
modal_id: "cdek-points-modal"
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
`goods:` должен приходить из хост-приложения. Гем не подставляет
|
|
89
|
+
статичный «средний короб», чтобы CDEK не считал доставку по выдуманным
|
|
90
|
+
габаритам. Формат одного элемента массива: `width`, `height`, `length`
|
|
91
|
+
в сантиметрах, `weight` в граммах. Если в приложении размеры хранятся в
|
|
92
|
+
миллиметрах, перед передачей в виджет их нужно перевести в сантиметры;
|
|
93
|
+
если вес хранится в килограммах — перевести в граммы.
|
|
94
|
+
|
|
95
|
+
Что делает хелпер:
|
|
96
|
+
|
|
97
|
+
1. Рендерит `<div class="cdek-widget">` со всеми data-* для Stimulus.
|
|
98
|
+
2. JS-контроллер `cdek-widget` (поставлен генератором) подгружает
|
|
99
|
+
`/assets/cdek/widget.umd.js` (вшитый в гем UMD-бандл) и инициализирует
|
|
100
|
+
`window.CDEKWidget` в root-таргете.
|
|
101
|
+
3. Виджет шлёт запросы на `/cdek/widget_service` (Engine route).
|
|
102
|
+
4. На `onChoose` контроллер пишет данные выбранного пункта в скрытые поля
|
|
103
|
+
формы — по умолчанию:
|
|
104
|
+
|
|
105
|
+
* `#order_cdek_point_code`
|
|
106
|
+
* `#order_cdek_point_name`
|
|
107
|
+
* `#order_cdek_point_address`
|
|
108
|
+
* `#order_cdek_city_code`
|
|
109
|
+
|
|
110
|
+
DOM-id переопределяются именованными аргументами `field_code`,
|
|
111
|
+
`field_name`, `field_address`, `field_city_code` хелпера.
|
|
112
|
+
|
|
113
|
+
5. Также диспатчится событие `cdek-widget:chosen` с `detail.office` —
|
|
114
|
+
можно слушать в собственных Stimulus-контроллерах.
|
|
115
|
+
|
|
116
|
+
### Закрытие модалки
|
|
117
|
+
|
|
118
|
+
Если виджет встроен в модалку, передайте её `id` в `modal_id:` — после
|
|
119
|
+
выбора пункта будет отправлено `document.dispatchEvent(new CustomEvent(
|
|
120
|
+
"modal:close", { detail: { id: <modal_id> } }))`. Реализация закрытия —
|
|
121
|
+
на стороне хост-приложения (его modal-контроллер слушает это событие).
|
|
122
|
+
|
|
123
|
+
## Обновление с 0.2.0 → 0.3.0
|
|
124
|
+
|
|
125
|
+
1. `bundle update cdek`
|
|
126
|
+
2. В `config/routes.rb` добавить:
|
|
127
|
+
|
|
128
|
+
```ruby
|
|
129
|
+
mount Cdek::Engine, at: "/cdek"
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
3. `bin/rails generate cdek:install` — поставит Stimulus-контроллер.
|
|
133
|
+
4. Внешний API (`Cdek.configure`, `Cdek.client`, `Cdek.locations`,
|
|
134
|
+
`Cdek.deliverypoints`) — без изменений.
|
|
135
|
+
|
|
136
|
+
## Лицензия
|
|
137
|
+
|
|
138
|
+
MIT.
|