moysklad 0.1.3 → 0.1.4
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/CHANGELOG.md +4 -0
- data/README.md +182 -65
- data/lib/moysklad/entities/attribute.rb +12 -1
- data/lib/moysklad/entities/attribute_metadata.rb +11 -0
- data/lib/moysklad/entities/custom_entity_metadata.rb +2 -1
- data/lib/moysklad/entities/feature.rb +5 -0
- data/lib/moysklad/resources/base.rb +5 -3
- data/lib/moysklad/resources/indexed.rb +2 -2
- data/lib/moysklad/resources/where_filter.rb +11 -0
- data/lib/moysklad/universe.rb +17 -7
- data/lib/moysklad/version.rb +1 -1
- data/spec/lib/moysklad/universe_spec.rb +16 -0
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7ce9d5b8b1a5f1edb130458f589bc42a2a528785
|
|
4
|
+
data.tar.gz: 6e3d6bcccc02fe6d70b35fa1fb53776860130580
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 011d7e2405fdd727a6546f52618ab3be16d06858c6f581f2f7ebef1ec0a51a9621c9ab88f338c7ffc137f471ffa392a06fdbe58f743a21dc9e5ae916fe17653c
|
|
7
|
+
data.tar.gz: bd7eebe8792ae0c4ddd0b5af4515ccbc792157d03a1c405e4477c70bdbd80c707435a36db1a2dffc53a5925c753a6318f5976b40c2e0196997c9028c99e54afc
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
|
@@ -1,17 +1,22 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Ruby-клиент для REST XML API Moysklad
|
|
2
2
|
|
|
3
3
|
[](https://travis-ci.org/BrandyMint/moysklad)
|
|
4
|
+
[](https://www.versioneye.com/user/projects/548225818674a4b5b90004dd)
|
|
5
|
+
[](https://codeclimate.com/github/BrandyMint/moysklad)
|
|
4
6
|
|
|
5
|
-
|
|
7
|
+
* http://www.rubydoc.info/gems/moysklad
|
|
6
8
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
## Возможности
|
|
9
|
+
## Особенности
|
|
10
10
|
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
11
|
+
* Модуль разработан согласно принципам SOLID. Легко расширяем.
|
|
12
|
+
* Все используемые сущности описаны и структурированы. Например [Good](lib/moysklad/entities/good.rb)
|
|
13
|
+
* Любые действия с ресурсами (Create, Read, Update, Delete, List).
|
|
14
|
+
* Виртуальные действия с ресурсами (`where`, `findWhere`)
|
|
15
|
+
* _Кеширование и предзагрузка_ ресурса со всеми записями (используем ресурс как локальную базу)
|
|
16
|
+
* Работа с нескольмими аккаунтами на склада одновременно (отсуствие глобальных переменных).
|
|
17
|
+
* Удобная работа с подресурсами (например справочником свойств товара)
|
|
18
|
+
* _Ассоциации_ между сущностями автоматически получают данные по API (`good.features`).
|
|
19
|
+
* [Client](lib/moysklad/client.rb) для прямого обращения к API в случае крайней необходимости.
|
|
15
20
|
|
|
16
21
|
## Установка
|
|
17
22
|
|
|
@@ -19,39 +24,48 @@
|
|
|
19
24
|
|
|
20
25
|
gem 'moysklad'
|
|
21
26
|
|
|
22
|
-
|
|
23
27
|
## Использование
|
|
24
28
|
|
|
25
29
|
Создаем благоприятное окружение для работы с API:
|
|
26
30
|
|
|
27
|
-
|
|
28
|
-
|
|
31
|
+
```ruby
|
|
32
|
+
universe = Moysklad::Universe.build login:'ВАШ ЛОГИН', password:'ВАШ ПАРОЛЬ'
|
|
33
|
+
```
|
|
29
34
|
|
|
30
35
|
### Список элементов.
|
|
31
36
|
|
|
32
|
-
Например список
|
|
37
|
+
Например список товаров (`Good`).
|
|
33
38
|
|
|
34
|
-
|
|
35
|
-
|
|
39
|
+
```ruby
|
|
40
|
+
universe.goods.list
|
|
41
|
+
# => [Moysklad::Entities::Good, Moysklad::Entities::Good, ..]
|
|
42
|
+
```
|
|
36
43
|
|
|
37
44
|
Обратите внимание, что список возвращается "как есть" и для работы с ним есть более удобные методы.
|
|
38
45
|
|
|
46
|
+
Параметры списка.
|
|
47
|
+
|
|
48
|
+
```ruby
|
|
49
|
+
universe.stock.list slotUuid: uuid
|
|
50
|
+
```
|
|
51
|
+
|
|
39
52
|
Страница товаров:
|
|
40
53
|
|
|
41
|
-
|
|
42
|
-
|
|
54
|
+
```ruby
|
|
55
|
+
page = universe.goods.page
|
|
56
|
+
# => Moysklad::Entities::Page
|
|
43
57
|
|
|
44
|
-
|
|
45
|
-
|
|
58
|
+
page.total
|
|
59
|
+
# => 1280
|
|
46
60
|
|
|
47
|
-
|
|
48
|
-
|
|
61
|
+
page.count
|
|
62
|
+
# => 1000
|
|
49
63
|
|
|
50
|
-
|
|
51
|
-
|
|
64
|
+
page.start
|
|
65
|
+
# => 0
|
|
52
66
|
|
|
53
|
-
|
|
54
|
-
|
|
67
|
+
# page.items
|
|
68
|
+
# =>[Moysklad::Entities::Good, ..]
|
|
55
69
|
|
|
56
70
|
Есть очень удобная возможность автоматически загрузать ВСЕ товары с учетом пейджирования:
|
|
57
71
|
|
|
@@ -61,99 +75,198 @@
|
|
|
61
75
|
|
|
62
76
|
> goods
|
|
63
77
|
> => [Moysklad::Entities::Page]
|
|
64
|
-
|
|
78
|
+
```
|
|
65
79
|
|
|
66
80
|
### Получить конкретный элемент
|
|
67
81
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
82
|
+
```ruby
|
|
83
|
+
universe.goods.get $uuid
|
|
84
|
+
# => [Moysklad::Entities::Good]
|
|
85
|
+
```
|
|
71
86
|
|
|
72
87
|
### Создаем элемент
|
|
73
88
|
|
|
74
89
|
Например загрузка заказа покупателя:
|
|
75
90
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
91
|
+
```
|
|
92
|
+
co = Moysklad::Entities::CustomerOrder.new
|
|
93
|
+
co.vatIncluded = true
|
|
94
|
+
co.applicable = true
|
|
95
|
+
[...]
|
|
96
|
+
co.customerOrderPosition = [Moysklad::Entities::CustomerOrderPosition.new]
|
|
97
|
+
|
|
98
|
+
created_order = universe.customer_orders.create co
|
|
99
|
+
# => [Moysklad::Entities::Good]
|
|
100
|
+
|
|
101
|
+
created_order.uuid
|
|
102
|
+
# => uuid нового заказа
|
|
103
|
+
```
|
|
85
104
|
|
|
86
105
|
### Удаляем элемент
|
|
87
106
|
|
|
88
|
-
|
|
107
|
+
```ruby
|
|
108
|
+
universe.goods.delete $uuid
|
|
109
|
+
```
|
|
89
110
|
|
|
90
|
-
### Кеширование
|
|
111
|
+
### Кеширование и предзагрузка
|
|
91
112
|
|
|
92
113
|
Одной из главных возможностей данного модуля является возможность работать с API как с базой данных,
|
|
93
114
|
не выполняя запрос по получению каждого товара по-отдельности, и выдавать данные их кеша.
|
|
94
115
|
|
|
95
116
|
Класический способ получить данные по товару делает GET запрос каждый раз:
|
|
96
117
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
118
|
+
```ruby
|
|
119
|
+
universe.goods.get $uuid
|
|
120
|
+
# => Client: GET exchange/rest/ms/xml/Good/f24937e7-7ba1-11e4-90a2-8ecb000abf12 {}
|
|
121
|
+
# => [Moysklad::Entities::Good]
|
|
122
|
+
```
|
|
100
123
|
|
|
101
124
|
Продвинутый способ вытаскивает все данные сразу и в дальнейшем берет обьекты из кеша:
|
|
102
125
|
|
|
103
|
-
|
|
104
|
-
>
|
|
105
|
-
|
|
106
|
-
|
|
126
|
+
```ruby
|
|
127
|
+
> universe.goods.find $uuid
|
|
128
|
+
# => Client: GET exchange/rest/ms/xml/Good/list {:start=>0}
|
|
129
|
+
# => Client: GET exchange/rest/ms/xml/Good/list {:start=>1000}
|
|
130
|
+
# => [Moysklad::Entities::Good]
|
|
131
|
+
```
|
|
107
132
|
|
|
108
133
|
И в следующий раз API уже не дергается:
|
|
109
134
|
|
|
110
|
-
|
|
111
|
-
|
|
135
|
+
```ruby
|
|
136
|
+
universe.goods.find $another_uuid
|
|
137
|
+
# => [Moysklad::Entities::Good]
|
|
138
|
+
```
|
|
112
139
|
|
|
113
140
|
Это позволяет экономить на прямых запросах к API и избавляет нас от блокирования моимскладом по ограничению количества запросов за еденицу времени.
|
|
114
141
|
|
|
115
142
|
|
|
116
|
-
|
|
143
|
+
## Поиск по фильтру
|
|
144
|
+
|
|
145
|
+
Возвращает список элементов отображенных по фильтру:
|
|
146
|
+
|
|
147
|
+
```ruby
|
|
148
|
+
universe.features.where goodUuid: uuid
|
|
149
|
+
# => [Moysklad::Enities::Feature, Moysklad::Enities::Feature]
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Тоже самое, только возвращается первый элемент или nil:
|
|
153
|
+
|
|
154
|
+
```ruby
|
|
155
|
+
universe.features.findWhere goodUuid: uuid
|
|
156
|
+
# => [Moysklad::Enities::Feature]
|
|
157
|
+
```
|
|
117
158
|
|
|
118
|
-
|
|
119
|
-
|
|
159
|
+
### Список доступных ресурсов:
|
|
160
|
+
|
|
161
|
+
```ruby
|
|
162
|
+
universe.resources_list
|
|
163
|
+
# => [:stock, :metadata, :custom_entity_metadata, :goods, :good_folders, :uoms, :countries,
|
|
120
164
|
:features, :custom_entities, :customer_orders, :warehouses, :companies,
|
|
121
165
|
:consignments, :my_companies]
|
|
166
|
+
```
|
|
122
167
|
|
|
168
|
+
## Справочники и подресурсы
|
|
123
169
|
|
|
124
|
-
|
|
170
|
+
Доступ к Мойсклад устроен так, что некоторые справочники запрятаны в одной коллекции.
|
|
171
|
+
Например если вы хотите получить все виды свойств товаров, то это можно сделать следующим образом.
|
|
172
|
+
|
|
173
|
+
```ruby
|
|
174
|
+
universe.metadata.subresource_by_name(:GoodFolder).all
|
|
175
|
+
# => [Moysklad::Entities::AttributeMetadata, Moysklad::Entities::AttributeMetadata]
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Или получить конкретное свойство:
|
|
125
179
|
|
|
126
|
-
|
|
180
|
+
```ruby
|
|
181
|
+
universe.metadata.subresource_by_name(:GoodFolder).find uuid
|
|
182
|
+
# => Moysklad::Entities::AttributeMetadata
|
|
183
|
+
```
|
|
127
184
|
|
|
128
|
-
|
|
185
|
+
## Автоматическая обработка ассоциаций (отношения)
|
|
129
186
|
|
|
130
|
-
|
|
187
|
+
Нравятся `belongs_to` и `has_many` в рельсах? Тут есть почти тоже самое.
|
|
131
188
|
|
|
189
|
+
```ruby
|
|
190
|
+
feature = universe.features.find uuid
|
|
191
|
+
feature.good
|
|
192
|
+
# Client: GET exchange/rest/ms/xml/Good/f24937e7-7ba1-11e4-90a2-8ecb000abf12 {}
|
|
193
|
+
# => [Moysklad::Entities::Good]
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Пример как получить все данные по товару, включая модификации, свойства и их характеристики:
|
|
197
|
+
|
|
198
|
+
```ruby
|
|
199
|
+
good = universe.goods.find uuid
|
|
200
|
+
# Client: GET exchange/rest/ms/xml/Good/f24937e7-7ba1-11e4-90a2-8ecb000abf12 {}
|
|
201
|
+
|
|
202
|
+
good.features universe
|
|
203
|
+
# Client: GET exchange/rest/ms/xml/Feature/list {}
|
|
204
|
+
# => [Moysklad::Entities::Feature, ..]
|
|
205
|
+
|
|
206
|
+
attribute = good.attributes.first
|
|
207
|
+
# => [Moysklad::Entities::Attribute, ..]
|
|
208
|
+
|
|
209
|
+
attribute.is_dictionary?
|
|
210
|
+
# => true
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
Получаем вид свойства:
|
|
214
|
+
|
|
215
|
+
```ruby
|
|
216
|
+
attribute.metadata universe
|
|
217
|
+
# Client: GET exchange/rest/ms/xml/Metadata/list {}
|
|
218
|
+
# => [Moysklad::Entities::AttributeMetadata]
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Получаем описание пользовательского справочника к которому принадлежит свойства
|
|
222
|
+
|
|
223
|
+
```ruby
|
|
224
|
+
dictionary = attribute.metadata(universe).dictionatyMetadata(universe)
|
|
225
|
+
# Client: GET exchange/rest/ms/xml/CustomEntityMetadata/uuid {}
|
|
226
|
+
# => [Moysklad::Entities::CustomEntityMetadata]
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Значения всех элементов пользовательского справочника:
|
|
230
|
+
|
|
231
|
+
```ruby
|
|
232
|
+
dictionary.entities(universe)
|
|
233
|
+
# => [Moysklad::Entities::CustomEntity, ...]
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
Подробнее смотри в исходниках сущностей.
|
|
237
|
+
|
|
238
|
+
## Pull Requests
|
|
239
|
+
|
|
240
|
+
### Добавление новых моделей и ресурсов.
|
|
241
|
+
|
|
242
|
+
На данный момен в библиотеку добавлено 60% справочников используемых в моемскладе. Я добавляю новые справочники по мере необходимости. Но вы можете это сделать и сами следующим образом.
|
|
243
|
+
|
|
244
|
+
Например добавляем `Country`.
|
|
132
245
|
|
|
133
246
|
1. Добавляем в фикстуры пример выгрузки из API для тестирования и отладки:
|
|
134
247
|
|
|
135
|
-
|
|
248
|
+
MS_LOGON=логин MS_PASSWORD=пароль ./script/rest.sh Country list > ./spec/fixtures/Country_list.raw
|
|
136
249
|
|
|
137
250
|
2. Создаем сущность на основе уже существующей, например good.rb
|
|
138
251
|
|
|
139
|
-
|
|
252
|
+
cp ./lib/moysklad/entities/good.rb ./lib/moysklad/entities/country.rb
|
|
140
253
|
|
|
141
254
|
3. Описываем свойства новой сущности Country.rb в терминах [nokogiri-happymapper](https://github.com/dam5s/happymapper)-а
|
|
142
255
|
|
|
143
|
-
|
|
256
|
+
vi ./lib/moysklad/entities/country.rb
|
|
144
257
|
|
|
145
258
|
4. Добавляем сущность в requirements
|
|
146
259
|
|
|
147
|
-
|
|
260
|
+
vi ./lib/moysklad/entities.rb
|
|
148
261
|
|
|
149
262
|
5. Содаем автоматический ресурс (имя ресурса во множественном числе)
|
|
150
263
|
|
|
151
|
-
|
|
264
|
+
vi ./lib/moysklad/resources.rb
|
|
152
265
|
|
|
153
266
|
6. Делаем spec для сущности и для ресурса.
|
|
154
267
|
|
|
155
|
-
> vi ./spec/lib/moysklad/resources/countries_spec.rb
|
|
156
|
-
> vi ./spec/lib/moysklad/entities/country_spec.rb
|
|
268
|
+
> vi ./spec/lib/moysklad/resources/countries_spec.rb
|
|
269
|
+
> vi ./spec/lib/moysklad/entities/country_spec.rb
|
|
157
270
|
|
|
158
271
|
7. Проверяем что тесты проходят.
|
|
159
272
|
|
|
@@ -161,13 +274,13 @@
|
|
|
161
274
|
|
|
162
275
|
## Тестирование
|
|
163
276
|
|
|
164
|
-
> bundle exec guard
|
|
277
|
+
> bundle exec guard
|
|
165
278
|
|
|
166
279
|
## Полезняшки
|
|
167
280
|
|
|
168
281
|
Скрипт для быстрого доступа к сервисам моего склада
|
|
169
282
|
|
|
170
|
-
> MS_LOGON=логин MS_PASSWORD=пароль ./script/rest.sh Country list > ./spec/fixtures/Country_list.raw
|
|
283
|
+
> MS_LOGON=логин MS_PASSWORD=пароль ./script/rest.sh Country list > ./spec/fixtures/Country_list.raw
|
|
171
284
|
|
|
172
285
|
## Ссылочки
|
|
173
286
|
|
|
@@ -175,3 +288,7 @@
|
|
|
175
288
|
* Документация для разработчииков https://support.moysklad.ru/hc/ru/sections/200561443-Разработчикам
|
|
176
289
|
|
|
177
290
|
## Присылайте пул-реквесты )
|
|
291
|
+
|
|
292
|
+
## Авторство
|
|
293
|
+
|
|
294
|
+
* Данил Письменный (brandymint.ru)
|
|
@@ -11,14 +11,24 @@ module Moysklad::Entities
|
|
|
11
11
|
attribute :entityValueUuid, String
|
|
12
12
|
|
|
13
13
|
# Объект описывающий тип атритуба
|
|
14
|
+
#
|
|
15
|
+
# @return Moysklad::Entities::AttributeMetadata
|
|
16
|
+
#
|
|
14
17
|
def metadata universe
|
|
15
|
-
universe.metadata.subresource_by_name(:GoodFolder).find
|
|
18
|
+
universe.metadata.subresource_by_name(:GoodFolder).find metadataUuid
|
|
16
19
|
end
|
|
17
20
|
|
|
21
|
+
# Название свойства, полученное из AttributeMetadata
|
|
22
|
+
#
|
|
23
|
+
# @return String
|
|
24
|
+
#
|
|
18
25
|
def attributeName universe
|
|
19
26
|
metadata(universe).name
|
|
20
27
|
end
|
|
21
28
|
|
|
29
|
+
# Значение свойства согласно его типу
|
|
30
|
+
#
|
|
31
|
+
# @return [String | Moysklad::Entities::CustomEntity | Integer | Decimal ]
|
|
22
32
|
def get_value universe
|
|
23
33
|
md = metadata universe
|
|
24
34
|
case md.attrType
|
|
@@ -28,6 +38,7 @@ module Moysklad::Entities
|
|
|
28
38
|
valueText
|
|
29
39
|
when 'STRING'
|
|
30
40
|
valueString
|
|
41
|
+
# TODO Другие типы
|
|
31
42
|
else
|
|
32
43
|
raise "Не известный тип мета-аттрибута #{md.uuid}: #{md.attrType}"
|
|
33
44
|
end
|
|
@@ -15,10 +15,21 @@ module Moysklad::Entities
|
|
|
15
15
|
attribute :required, Boolean
|
|
16
16
|
attribute :dictionaryMetadataUuid, String
|
|
17
17
|
|
|
18
|
+
def is_dictionary?
|
|
19
|
+
attrType == 'ID_CUSTOM'
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Если это свойство типа ID_CUSTOM, то возвращается пользовательский справочник
|
|
23
|
+
#
|
|
24
|
+
# @return Moysklad::Entities::CustomEntityMetadata
|
|
18
25
|
def dictionatyMetadata universe
|
|
26
|
+
raise "Это свойства не типа справочник" unless dictionaryMetadataUuid
|
|
19
27
|
universe.custom_entity_metadata.find dictionaryMetadataUuid
|
|
20
28
|
end
|
|
21
29
|
|
|
30
|
+
# Справочник к которому принадлежит это ссвойство
|
|
31
|
+
#
|
|
32
|
+
# @return Moysklad::Entities::EmbeddedEntityMetadata
|
|
22
33
|
def entityMetadata universe
|
|
23
34
|
universe.metadata.find entityMetadataUuid
|
|
24
35
|
end
|
|
@@ -21,7 +21,7 @@ class Moysklad::Resources::Base
|
|
|
21
21
|
|
|
22
22
|
# Возвращает список элементов как есть
|
|
23
23
|
#
|
|
24
|
-
# @return Array
|
|
24
|
+
# @return [Array of Moysklad::Entities::Base]
|
|
25
25
|
def list params={}
|
|
26
26
|
parse client.get list_path, params
|
|
27
27
|
end
|
|
@@ -51,9 +51,11 @@ class Moysklad::Resources::Base
|
|
|
51
51
|
#
|
|
52
52
|
# @param [Moysklad::Entities::Base]
|
|
53
53
|
#
|
|
54
|
-
#
|
|
54
|
+
# Возвращается созданная на сервере сущность
|
|
55
|
+
#
|
|
56
|
+
# @return [Moysklad::Entities::Base]
|
|
55
57
|
def create model
|
|
56
|
-
raise "Должна быть модель типа Moysklad::Entities::Base" unless model.is_a? Moysklad::Entities::
|
|
58
|
+
raise "Должна быть модель типа Moysklad::Entities::Base" unless model.is_a? Moysklad::Entities::Base
|
|
57
59
|
parse client.put create_path, prepare_resource(model)
|
|
58
60
|
end
|
|
59
61
|
|
|
@@ -11,7 +11,7 @@ module Moysklad::Resources
|
|
|
11
11
|
|
|
12
12
|
# Автоматически подгружает постранично данныез из API и возвращает их все сразу.
|
|
13
13
|
#
|
|
14
|
-
# @return Array
|
|
14
|
+
# @return [Array of Moysklad::Entities::Base]
|
|
15
15
|
def all
|
|
16
16
|
@cached_list || pull_list
|
|
17
17
|
end
|
|
@@ -26,7 +26,7 @@ module Moysklad::Resources
|
|
|
26
26
|
|
|
27
27
|
# Перечень uuid-ов всех элементов в ресуресе
|
|
28
28
|
#
|
|
29
|
-
# @return Array
|
|
29
|
+
# @return [Array of uuids]
|
|
30
30
|
def uuids
|
|
31
31
|
index.keys
|
|
32
32
|
end
|
|
@@ -1,8 +1,19 @@
|
|
|
1
1
|
module Moysklad::Resources::WhereFilter
|
|
2
|
+
|
|
3
|
+
# Возвращает список элементов по переданному фильтру.
|
|
4
|
+
# Например:
|
|
5
|
+
# > universe.features.where goodUuid: uuid
|
|
6
|
+
#
|
|
7
|
+
# @return [Array of Moysklad::Entities::Base]
|
|
8
|
+
#
|
|
2
9
|
def where filter
|
|
3
10
|
values.select { |v| filtered? v, filter }
|
|
4
11
|
end
|
|
5
12
|
|
|
13
|
+
# Возвращает первый найденный по фильтру элемент или
|
|
14
|
+
# nil
|
|
15
|
+
#
|
|
16
|
+
# @return Moysklad::Entities::Base || nil
|
|
6
17
|
def findWhere filter
|
|
7
18
|
where(filter).first
|
|
8
19
|
end
|
data/lib/moysklad/universe.rb
CHANGED
|
@@ -1,17 +1,27 @@
|
|
|
1
1
|
module Moysklad
|
|
2
2
|
class Universe
|
|
3
3
|
cattr_reader :resources_list
|
|
4
|
+
attr_reader :client
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
"Moysklad::Resources::#{resource.to_s.singularize.capitalize}".constantize
|
|
7
|
-
end
|
|
8
|
-
|
|
6
|
+
# @param client[Moysklad::Client]
|
|
9
7
|
def initialize client: nil
|
|
10
8
|
raise "Должен быть client[Moysklad::Client]" unless client.is_a? Moysklad::Client
|
|
11
9
|
@client = client
|
|
12
10
|
@resources={}
|
|
13
11
|
end
|
|
14
12
|
|
|
13
|
+
def self.client_class
|
|
14
|
+
Client
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Ленивое создание universe
|
|
18
|
+
#
|
|
19
|
+
# @param login
|
|
20
|
+
# @param password
|
|
21
|
+
def self.build login: nil, password: nil
|
|
22
|
+
new client: client_class.new(login: login, password: password)
|
|
23
|
+
end
|
|
24
|
+
|
|
15
25
|
@@resources_list = []
|
|
16
26
|
Moysklad::Resources.resources.each do |resource_klass|
|
|
17
27
|
@@resources_list << resource_klass.pluralized_type.to_sym
|
|
@@ -20,10 +30,10 @@ module Moysklad
|
|
|
20
30
|
end
|
|
21
31
|
end
|
|
22
32
|
|
|
23
|
-
|
|
33
|
+
def class_by_resource resource
|
|
34
|
+
"Moysklad::Resources::#{resource.to_s.singularize.capitalize}".constantize
|
|
35
|
+
end
|
|
24
36
|
|
|
25
|
-
attr_reader :client
|
|
26
|
-
|
|
27
37
|
end
|
|
28
38
|
|
|
29
39
|
end
|
data/lib/moysklad/version.rb
CHANGED
|
@@ -25,4 +25,20 @@ describe Moysklad::Universe do
|
|
|
25
25
|
expect(subject.resources_list).to include(:features)
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
+
describe '.build' do
|
|
29
|
+
let(:login) { 'alala' }
|
|
30
|
+
let(:password) { 'ulala' }
|
|
31
|
+
|
|
32
|
+
subject { described_class.build login: login, password: password }
|
|
33
|
+
|
|
34
|
+
it do
|
|
35
|
+
expect(subject).to be_a Moysklad::Universe
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it do
|
|
39
|
+
expect(subject.client).to be_a Moysklad::Client
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
|
43
|
+
|
|
28
44
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: moysklad
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Danil Pismenny
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2014-12-
|
|
11
|
+
date: 2014-12-05 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|