moysklad 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Build Status](https://travis-ci.org/BrandyMint/moysklad.svg)](https://travis-ci.org/BrandyMint/moysklad)
|
4
|
+
[![Dependency Status](https://www.versioneye.com/user/projects/548225818674a4b5b90004dd/badge.svg?style=flat)](https://www.versioneye.com/user/projects/548225818674a4b5b90004dd)
|
5
|
+
[![Code Climate](https://codeclimate.com/github/BrandyMint/moysklad/badges/gpa.svg)](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
|