sk-api 1.0.6 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +208 -11
- data/VERSION +1 -1
- data/lib/{activeresource_patches → patches}/README +0 -0
- data/lib/{activeresource_patches → patches/ar2}/base.rb +1 -12
- data/lib/{activeresource_patches → patches/ar2}/validations.rb +2 -2
- data/lib/patches/ar3/base.rb +23 -0
- data/lib/patches/ar3/validations.rb +13 -0
- data/lib/resources/address.rb +1 -1
- data/lib/resources/client.rb +2 -2
- data/lib/resources/invoice.rb +20 -1
- data/lib/resources/product.rb +0 -1
- data/lib/sk_api.rb +20 -21
- data/lib/utils/serializer.rb +4 -4
- data/sk-api.gemspec +9 -7
- data/spec/resources/client_spec.rb +5 -3
- data/spec/resources/credit_note_spec.rb +6 -6
- data/spec/resources/invoice_spec.rb +20 -54
- data/spec/resources/product_spec.rb +6 -8
- data/spec/spec_helper.rb +1 -0
- data/spec/utils/field_map_spec.rb +1 -1
- data/vendor/jsonschema-1.0.0/lib/jsonschema.rb +198 -340
- data/vendor/jsonschema-1.0.0/test/jsonschema_test.rb +204 -8
- metadata +16 -7
data/README.rdoc
CHANGED
@@ -1,11 +1,9 @@
|
|
1
1
|
= SalesKing Api
|
2
2
|
|
3
|
-
This
|
4
|
-
|
5
|
-
https://www.SalesKing, http://texprovider.de and http://planio.de
|
3
|
+
This gem provides an api client using ActiveResource and also provides the API's JSON-Schema
|
4
|
+
In the near future this will be decoupled and you will find links to the new gems here.
|
6
5
|
|
7
|
-
The SalesKing API client uses ActiveResource, with some fixes due to json parsing.
|
8
|
-
For now it only supports JSON, XML comes later.
|
6
|
+
The SalesKing API client uses JSON and ActiveResource, with some fixes due to json parsing.
|
9
7
|
|
10
8
|
To be able to use the API you must have an SalesKing account and API access.
|
11
9
|
Than you can start writing your own middelware-stack.
|
@@ -17,13 +15,209 @@ and support.
|
|
17
15
|
|
18
16
|
gem install sk-api
|
19
17
|
|
20
|
-
|
18
|
+
Use with bundler
|
21
19
|
|
22
|
-
|
23
|
-
|
24
|
-
|
20
|
+
gem "sk-api", :require => 'sk_api'
|
21
|
+
|
22
|
+
== Usage
|
23
|
+
|
24
|
+
SalesKing's api interface is RESTful(mostly) and returns & accepts JSON data.
|
25
|
+
All resources such as clients, invoices, products can be accessed via URL's
|
26
|
+
through standard HTTP methods GET, POST, PUT and DELETE.
|
27
|
+
|
28
|
+
To give it quick shot, point your browser to my-account.salesking.eu/api/clients.json
|
29
|
+
(while beeing logged in) and you will see the JSON in the response.
|
30
|
+
This is an example of a GET-request issued by your browser.
|
31
|
+
|
32
|
+
<b>Request Method overview:</b>
|
33
|
+
GET => read
|
34
|
+
POST => create new data
|
35
|
+
PUT => update data
|
36
|
+
DELETE => delete data
|
37
|
+
|
38
|
+
Want to know more about REST style webservices?
|
39
|
+
* http://en.wikipedia.org/wiki/Representational_State_Transfer
|
40
|
+
* http://www.google.com/search?q=REST+site%3Awww.infoq.com
|
41
|
+
|
42
|
+
=== Authentification & Safety
|
43
|
+
|
44
|
+
Authentification is done with HTTP basic using your SalesKing login email and password.
|
45
|
+
For a production environment it is advisable to create a user, per api
|
46
|
+
client-software, and restrict his rights with our build in role-system.
|
47
|
+
|
48
|
+
=== Toolz
|
49
|
+
|
50
|
+
Since browsers do not support PUT/DELETE methods you can use CURL, a linux
|
51
|
+
command-line http client, for testing. And of course any http library supporting
|
52
|
+
http-basic-auth can be used.
|
53
|
+
|
54
|
+
* JSONView FF-Plugin - view json in firefox https://addons.mozilla.org/de/firefox/addon/10869/
|
55
|
+
* JSONovich FF-Plugin - https://addons.mozilla.org/de/firefox/addon/10122/
|
56
|
+
* A java GUI REST client http://code.google.com/p/rest-client/
|
57
|
+
|
58
|
+
=== GET / Show data
|
59
|
+
|
60
|
+
Get a list of resources:
|
61
|
+
GET xy.salesking.eu/api/invoices
|
62
|
+
|
63
|
+
Get a single resource
|
64
|
+
GET xy.salesking.eu/invoices/:id
|
65
|
+
|
66
|
+
Using CURL
|
67
|
+
|
68
|
+
curl -u your@login-mail.com:password \
|
69
|
+
https://demo.salesking.eu/clients.json
|
70
|
+
|
71
|
+
Returned JSON data for a listings, abbreviated:
|
72
|
+
{
|
73
|
+
"clients": [ # array of resources => clients
|
74
|
+
{ "client": { # a single resource
|
75
|
+
"number": "0800013", ..
|
76
|
+
"links":{} #links to actions for the resource (comming soon)
|
77
|
+
}, ...
|
78
|
+
],
|
79
|
+
collection": { # information about the collection
|
80
|
+
"total_pages": 1,
|
81
|
+
"total_entries": 3,
|
82
|
+
"current_page": 1,
|
83
|
+
"per_page": 30
|
84
|
+
},
|
85
|
+
"links": { # links for the collection
|
86
|
+
"prev": "/api/clients?page=0",
|
87
|
+
"next": "/api/clients?page=2",
|
88
|
+
"self": "/api/clients?page=1"
|
89
|
+
},
|
90
|
+
}
|
91
|
+
|
92
|
+
==== Filtering
|
93
|
+
|
94
|
+
Filtering data can be achived by adding a filter parameter to the url.
|
95
|
+
|
96
|
+
All objects which can be tagged(clients, documents, products) can be filter by a tag param, taking one or multiple tags:
|
97
|
+
GET xy.salesking.eu/api/invoices?filter[tags]=Agentur
|
98
|
+
GET xy.salesking.eu/api/invoices?filter[tags]=Agentur Grafik
|
99
|
+
# find all objects without tags
|
100
|
+
GET xy.salesking.eu/api/invoices?filter[not_tagged]=1
|
101
|
+
|
102
|
+
All objects have a q-search available. The fields to be searched in can be seen inside SalesKing, behind the search field above list.
|
103
|
+
GET xy.salesking.eu/api/invoices?q=0800013
|
104
|
+
GET xy.salesking.eu/api/invoices?filter[q]=0800013
|
105
|
+
|
106
|
+
Document specific filters
|
107
|
+
# find all documents for a client
|
108
|
+
GET xy.salesking.eu/api/invoices?filter[client]=:client_id
|
109
|
+
|
110
|
+
Client filter:
|
111
|
+
# find clients organisation or lastname starting with A
|
112
|
+
GET xy.salesking.eu/api/clients?filter[letter]=A
|
113
|
+
|
114
|
+
=== POST / Create data
|
115
|
+
|
116
|
+
To create a resource you can use the gem with its methods or make a POST request containing the json for a single resource.
|
117
|
+
The JSON format can be seen in each of the resources: http://github.com/salesking/sk-api/tree/master/lib/resources/
|
118
|
+
|
119
|
+
POST https://my-sub.salesking.eu/invoices.json content-type application/json
|
120
|
+
|
121
|
+
This a minimal json to create a draft invoice:
|
122
|
+
|
123
|
+
{"invoice": {
|
124
|
+
"due_days": 14,
|
125
|
+
"line_items": [
|
126
|
+
{
|
127
|
+
"quantity_unit": "Stuck",
|
128
|
+
"tax": 19,
|
129
|
+
"price_single": 0,
|
130
|
+
"position": 1,
|
131
|
+
"quantity": 21,
|
132
|
+
"description": "dep38usabq4Boxen kostenlos"
|
133
|
+
},
|
134
|
+
{
|
135
|
+
"quantity_unit": "Stuck",
|
136
|
+
"tax": 19,
|
137
|
+
"price_single": 0.042022,
|
138
|
+
"position": 2,
|
139
|
+
"quantity": 21,
|
140
|
+
"description": "dep38usabq4 Boxen"
|
141
|
+
}
|
142
|
+
],
|
143
|
+
"title": "Dabei",
|
144
|
+
"client_id": "c5d5xIwZGr3R56abxfpGMl",
|
145
|
+
"address_field": "Wurst Bolle\nHalve-Hahn Alle 4711\n50733 Köln-Nippes"
|
146
|
+
}}
|
147
|
+
|
148
|
+
Some quick hints on document creation:
|
149
|
+
|
150
|
+
* The line items array does not need prefixes .. (sry little inconsistency here)
|
151
|
+
* Dates are formatted like <tt>yyyy-mm-dd 2010-09-08</tt>
|
152
|
+
* <tt>"price_total": 0.88, "price_tax": 0.167</tt> can be ommited are calculated by sk => read only
|
153
|
+
* <tt>due_date</tt> if left out will be auto calculated from due days. If date and due date are given due_days are not taken into consideration.
|
154
|
+
* <tt>status: draft</tt> is default, so can be omitted
|
155
|
+
* <tt>client_id</tt> must be given as uuid of the client object
|
156
|
+
* line items with quantity of 0 are kicked
|
157
|
+
* If you create the doc as draft you can leave out any dates. When “opened” in salesking the date will be set and due date is calculated from due_days
|
158
|
+
* If you create the invoice as "open" you must set a number(and date), by now there is no api method to get the next number.
|
159
|
+
* The proposed workflow is to create the document as draft and continue (open/send/close) in SalesKing.
|
160
|
+
|
161
|
+
|
162
|
+
For more information on how to use take a look into the tests/specs:
|
163
|
+
|
164
|
+
http://github.com/salesking/sk-api/tree/master/spec/resources/
|
165
|
+
|
166
|
+
=== PUT / Update data
|
167
|
+
|
168
|
+
To Update a client:
|
169
|
+
|
170
|
+
PUT ( application/json ) to ../api/clients/:id
|
171
|
+
{
|
172
|
+
'client':
|
173
|
+
{
|
174
|
+
'gender':'male',
|
175
|
+
'first_name': "Andrew"
|
176
|
+
}
|
177
|
+
}
|
178
|
+
|
179
|
+
=== DELETE / kill data
|
180
|
+
|
181
|
+
To delete a record simply issue a DELETE request to a resource url:
|
182
|
+
|
183
|
+
DELETE https://demo.salesking.eu/clients/:id
|
184
|
+
|
185
|
+
== Ruby Example
|
186
|
+
|
187
|
+
Since the sk-api gem provides a wrapper around the whole url/request stuff its
|
188
|
+
pretty straight forward to use:
|
189
|
+
|
190
|
+
class SomeMiddleware
|
191
|
+
include SKApi::Resources
|
192
|
+
|
193
|
+
def initialize()
|
194
|
+
# init api connection => just an example depending on your code structure do it wherever you want
|
195
|
+
set_api_connection
|
196
|
+
end
|
197
|
+
|
198
|
+
def create_client(last_name)
|
199
|
+
# create a new client object
|
200
|
+
client = SKApi::Resources::Client.new(:last_name=> last_name)
|
201
|
+
# set more data
|
202
|
+
client.first_name = "Meister"
|
203
|
+
# save it, which also does the remote saving action
|
204
|
+
client.save
|
205
|
+
end
|
206
|
+
|
207
|
+
def set_api_connection
|
208
|
+
SKApi::Resources::Base.set_connection({
|
209
|
+
:site => 'my_sub.salesking.eu',
|
210
|
+
:user => 'demo@salesking.eu',
|
211
|
+
:password => 'password',
|
212
|
+
:format => :json # symbol expected
|
213
|
+
})
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
##### use it
|
218
|
+
a = SomeMiddleware.new
|
219
|
+
a.create_client('eder')
|
25
220
|
|
26
|
-
For more information on how to use take a look into the specs.
|
27
221
|
|
28
222
|
== Salesking API Resources
|
29
223
|
|
@@ -34,7 +228,10 @@ Right now the following resources are available:
|
|
34
228
|
* products
|
35
229
|
* credit_notes
|
36
230
|
|
37
|
-
|
231
|
+
See classes here:
|
232
|
+
http://github.com/salesking/sk-api/tree/master/lib/resources/
|
233
|
+
|
234
|
+
== Tests / Specs
|
38
235
|
|
39
236
|
To run the test you must insert some credentials into the spec helper.
|
40
237
|
We will gladly provide you with a test account on one of our development
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0
|
1
|
+
1.1.0
|
File without changes
|
@@ -27,7 +27,7 @@ module ActiveResource
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
#
|
30
|
+
# Overridden to grab the data(= clients-collection) from json:
|
31
31
|
# { 'collection'=> will_paginate infos,
|
32
32
|
# 'links' => prev/next links
|
33
33
|
# 'clients'=> [data], << what we need
|
@@ -37,15 +37,4 @@ module ActiveResource
|
|
37
37
|
collection.collect! { |record| instantiate_record(record, prefix_options) }
|
38
38
|
end
|
39
39
|
end
|
40
|
-
end
|
41
|
-
|
42
|
-
# Force json decoding using Rufus
|
43
|
-
module ActiveResource
|
44
|
-
module Formats
|
45
|
-
module JsonFormat
|
46
|
-
def decode(json)
|
47
|
-
Rufus::Json.decode(json)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
40
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module ActiveResource
|
2
|
-
|
2
|
+
|
3
3
|
module Validations
|
4
4
|
# Validate a resource and save (POST) it to the remote web service.
|
5
5
|
def save_with_validation
|
@@ -13,7 +13,7 @@ module ActiveResource
|
|
13
13
|
errors.from_json(error.response.body)
|
14
14
|
end
|
15
15
|
false
|
16
|
-
end
|
16
|
+
end
|
17
17
|
end
|
18
18
|
|
19
19
|
class Errors
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module ActiveResource
|
2
|
+
# Overridden methods to suit SalesKing.
|
3
|
+
# Some changes might be kicked when AR 3.0 is out
|
4
|
+
class Base
|
5
|
+
|
6
|
+
# override ARes method to parse only the client part
|
7
|
+
def load_attributes_from_response(response)
|
8
|
+
if response['Content-Length'] != "0" && response.body.strip.size > 0
|
9
|
+
load( self.class.format.decode(response.body)[self.class.element_name] )
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
# Overridden to grab the data(= clients-collection) from json:
|
14
|
+
# { 'collection'=> will_paginate infos,
|
15
|
+
# 'links' => prev/next links
|
16
|
+
# 'clients'=> [data], << what we need
|
17
|
+
# }
|
18
|
+
def self.instantiate_collection(collection, prefix_options = {})
|
19
|
+
collection = collection[ self.element_name.pluralize ] if collection.is_a?(Hash)
|
20
|
+
collection.collect! { |record| instantiate_record(record, prefix_options) }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module ActiveResource
|
2
|
+
class Errors < ActiveModel::Errors
|
3
|
+
# Patched cause we dont need no attribute name magic .. and its just simpler
|
4
|
+
# orig version is looking up the humanized name of the attribute in the error
|
5
|
+
# message, which we dont supply => only field name is used in returned error msg
|
6
|
+
def from_array(messages, save_cache=false)
|
7
|
+
clear unless save_cache
|
8
|
+
messages.each do |msg|
|
9
|
+
add msg[0], msg[1]
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end #Errors
|
13
|
+
end
|
data/lib/resources/address.rb
CHANGED
@@ -16,7 +16,7 @@ module SKApi
|
|
16
16
|
"id" => {"type" => "string", "identity" => true, "readonly" => true},
|
17
17
|
"address1" => {"type" => "string", "optional" => true},
|
18
18
|
"address2" => {"type" => "string", "optional" => true},
|
19
|
-
"city" => {"type" => "string"
|
19
|
+
"city" => {"type" => "string"},
|
20
20
|
"country" => {"type" => "string", "optional" => true},
|
21
21
|
"state" => {"type" => "string", "optional" => true},
|
22
22
|
"zip" => {"type" => "string", "optional" => true},
|
data/lib/resources/client.rb
CHANGED
@@ -13,7 +13,7 @@ module SKApi
|
|
13
13
|
|
14
14
|
def self.schema_props
|
15
15
|
{
|
16
|
-
"id" => {"type" => "string", "identity" => true , "readonly" => true},
|
16
|
+
"id" => {"type" => "string", "identity" => true, "optional" => true, "readonly" => true},
|
17
17
|
"number" => {"type" => "string", "optional" => true},
|
18
18
|
"organisation" => {"type" => "string"},
|
19
19
|
"first_name" => {"type" => "string", "optional" => true},
|
@@ -45,7 +45,7 @@ module SKApi
|
|
45
45
|
"created_at" => {"type" => "string", "format" =>"date-time", "optional" => true, "readonly" => true},
|
46
46
|
"updated_at" => {"type" => "string", "format" =>"date-time", "optional" => true, "readonly" => true},
|
47
47
|
"address_field" => {"type" => "string", "optional" => true, "readonly" => true},
|
48
|
-
"addresses" => {"type" => "array"}
|
48
|
+
"addresses" => {"type" => "array","properties" => SKApi::Resources::Address.schema_props, "optional" => true}
|
49
49
|
}
|
50
50
|
end #schema_props
|
51
51
|
|
data/lib/resources/invoice.rb
CHANGED
@@ -6,6 +6,19 @@ module SKApi
|
|
6
6
|
save_with_validation
|
7
7
|
end
|
8
8
|
|
9
|
+
def open
|
10
|
+
self.put(:open, :id => self.id) # PUT /invoices/:id/open
|
11
|
+
end
|
12
|
+
|
13
|
+
# rethink
|
14
|
+
def print(template_id)
|
15
|
+
self.get(:print, :template_id => template_id) # GET /invoices.pdf?template_id=:ids
|
16
|
+
end
|
17
|
+
|
18
|
+
def mail(template_id, cc, bcc)
|
19
|
+
self.get(:print, :template_id => template_id) # GET /invoices.pdf?template_id=:ids
|
20
|
+
end
|
21
|
+
|
9
22
|
##########################################################################
|
10
23
|
# Class methods
|
11
24
|
##########################################################################
|
@@ -41,8 +54,14 @@ module SKApi
|
|
41
54
|
|
42
55
|
def self.api_links
|
43
56
|
#internal links on fields=> id => salesking.eu/clients/4567.json
|
44
|
-
#external links to actions and related objects => invoeis => salesking.eu/clients/4567/invoices.json
|
45
57
|
[:edit, :destroy, :copy, :print, :show, :payments, :payment_new]
|
58
|
+
# [ :edit,
|
59
|
+
# :destroy,
|
60
|
+
# { :copy =>"invoices/new?source=#{self.id}" },
|
61
|
+
# :open => "PUT invoices/#{self.id}/open",
|
62
|
+
# :print,
|
63
|
+
# :show, ]
|
64
|
+
|
46
65
|
end
|
47
66
|
end
|
48
67
|
end
|
data/lib/resources/product.rb
CHANGED
@@ -22,7 +22,6 @@ module SKApi
|
|
22
22
|
"quantity_unit"=> {"type" => "string", "optional" => true},
|
23
23
|
"tag_list" => {"type" => "string", "optional" => true},
|
24
24
|
"lock_version" => {"type" => "integer", "readonly" => true, "optional" => true},
|
25
|
-
"published_at" => {"type" => "string", "format" =>"date", "optional" => true},
|
26
25
|
"created_at" => {"type" => "string", "format" =>"date-time", "optional" => true, "readonly" => true },
|
27
26
|
"updated_at" => {"type" => "string", "format" =>"date-time", "optional" => true, "readonly" => true },
|
28
27
|
}
|
data/lib/sk_api.rb
CHANGED
@@ -1,29 +1,28 @@
|
|
1
|
-
require 'rubygems'
|
1
|
+
#require 'rubygems'
|
2
2
|
require 'active_resource'
|
3
|
+
require 'active_resource/version'
|
3
4
|
# patches are for specific AR version
|
4
|
-
#
|
5
|
+
# switch A-resource patch includes
|
5
6
|
|
6
|
-
|
7
|
-
require '
|
8
|
-
require '
|
9
|
-
|
10
|
-
|
11
|
-
require '
|
12
|
-
require 'rufus-json'
|
13
|
-
Rufus::Json.backend = :json
|
7
|
+
if ActiveResource::VERSION::MAJOR == 3
|
8
|
+
require 'patches/ar3/base'
|
9
|
+
require 'patches/ar3/validations'
|
10
|
+
elsif ActiveResource::VERSION::MAJOR < 3
|
11
|
+
require 'patches/ar2/validations'
|
12
|
+
require 'patches/ar2/base'
|
14
13
|
end
|
15
14
|
|
16
15
|
# utilities
|
17
|
-
require
|
18
|
-
require
|
16
|
+
require 'utils/field_map'
|
17
|
+
require 'utils/serializer'
|
19
18
|
|
20
19
|
#resources
|
21
|
-
require
|
22
|
-
require
|
23
|
-
require
|
24
|
-
require
|
25
|
-
require
|
26
|
-
require
|
27
|
-
require
|
28
|
-
|
29
|
-
|
20
|
+
require 'resources/base'
|
21
|
+
require 'resources/product'
|
22
|
+
require 'resources/client'
|
23
|
+
require 'resources/address'
|
24
|
+
require 'resources/invoice'
|
25
|
+
require 'resources/credit_note'
|
26
|
+
require 'resources/line_item'
|
27
|
+
|
28
|
+
# TODO before post kick empty fields and readonly's
|
data/lib/utils/serializer.rb
CHANGED
@@ -6,7 +6,7 @@ module SKApi
|
|
6
6
|
# f.ex. in the clients api controller
|
7
7
|
# => SKApi::Resources::Client.to_json(a_client)
|
8
8
|
# This way you can keep your API client up to date by using the resources and
|
9
|
-
# relying on SKApi::Resources::Client.
|
9
|
+
# relying on SKApi::Resources::Client.schema
|
10
10
|
module Serializer
|
11
11
|
def self.included(base)
|
12
12
|
base.extend ClassMethods
|
@@ -42,8 +42,8 @@ module SKApi
|
|
42
42
|
# ex: data['invoice']['client'] = SKApi::Models::Client.to_hash_from_schema(client)
|
43
43
|
data[obj_class_name][field] = klass.to_hash_from_schema(rel_obj)
|
44
44
|
end
|
45
|
-
|
46
|
-
data[obj_class_name][field] = obj.send(field)
|
45
|
+
else # a simple field which can be directly called, only added of objects know its
|
46
|
+
data[obj_class_name][field] = obj.send(field) if obj.respond_to?(field.to_sym)
|
47
47
|
end
|
48
48
|
end
|
49
49
|
data
|
@@ -52,7 +52,7 @@ module SKApi
|
|
52
52
|
def to_json(obj)
|
53
53
|
data = self.to_hash_from_schema(obj)
|
54
54
|
# data[:links] = self.api_links
|
55
|
-
|
55
|
+
ActiveSupport::JSON.encode(data)
|
56
56
|
end
|
57
57
|
|
58
58
|
end #ClassMethods
|
data/sk-api.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{sk-api}
|
8
|
-
s.version = "1.0
|
8
|
+
s.version = "1.1.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Georg Leciejewski"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-11-07}
|
13
13
|
s.description = %q{Interact with SalesKing}
|
14
14
|
s.email = %q{gl@salesking.eu}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -23,9 +23,11 @@ Gem::Specification.new do |s|
|
|
23
23
|
"Rakefile",
|
24
24
|
"VERSION",
|
25
25
|
"init.rb",
|
26
|
-
"lib/
|
27
|
-
"lib/
|
28
|
-
"lib/
|
26
|
+
"lib/patches/README",
|
27
|
+
"lib/patches/ar2/base.rb",
|
28
|
+
"lib/patches/ar2/validations.rb",
|
29
|
+
"lib/patches/ar3/base.rb",
|
30
|
+
"lib/patches/ar3/validations.rb",
|
29
31
|
"lib/resources/address.rb",
|
30
32
|
"lib/resources/base.rb",
|
31
33
|
"lib/resources/client.rb",
|
@@ -53,7 +55,7 @@ Gem::Specification.new do |s|
|
|
53
55
|
s.homepage = %q{http://github.com/salesking/sk-api}
|
54
56
|
s.rdoc_options = ["--charset=UTF-8"]
|
55
57
|
s.require_paths = ["lib"]
|
56
|
-
s.rubygems_version = %q{1.3.
|
58
|
+
s.rubygems_version = %q{1.3.7}
|
57
59
|
s.summary = %q{Interact with SalesKing}
|
58
60
|
s.test_files = [
|
59
61
|
"spec/resources/client_spec.rb",
|
@@ -68,7 +70,7 @@ Gem::Specification.new do |s|
|
|
68
70
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
69
71
|
s.specification_version = 3
|
70
72
|
|
71
|
-
if Gem::Version.new(Gem::
|
73
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
72
74
|
s.add_development_dependency(%q<rspec>, [">= 0"])
|
73
75
|
else
|
74
76
|
s.add_dependency(%q<rspec>, [">= 0"])
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'spec/spec_helper'
|
2
2
|
|
3
3
|
describe SKApi::Resources::Client, "in general" do
|
4
4
|
|
@@ -59,9 +59,10 @@ describe SKApi::Resources::Client, "in general" do
|
|
59
59
|
client = SKApi::Resources::Client.find(@client.id)
|
60
60
|
# convert to json and read raw without activeresource assigning classes
|
61
61
|
json = client.to_json
|
62
|
-
obj =
|
62
|
+
obj = ActiveSupport::JSON.decode(json)
|
63
|
+
# puts obj['client']['organisation']
|
63
64
|
lambda {
|
64
|
-
JSON::Schema.validate(obj, SKApi::Resources::Client.schema)
|
65
|
+
JSON::Schema.validate(obj['client'], SKApi::Resources::Client.schema)
|
65
66
|
}.should_not raise_error
|
66
67
|
end
|
67
68
|
|
@@ -83,6 +84,7 @@ describe SKApi::Resources::Client, "with addresses" do
|
|
83
84
|
#setup test client to work with
|
84
85
|
@client = SKApi::Resources::Client.new(:organisation=>'Second from testing API2',
|
85
86
|
:addresses => [{ :zip => '50374', :city => 'Cologne' }] )
|
87
|
+
|
86
88
|
@client.save
|
87
89
|
end
|
88
90
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'spec/spec_helper'
|
2
2
|
|
3
3
|
describe SKApi::Resources::CreditNote, "in general" do
|
4
4
|
|
@@ -25,11 +25,12 @@ describe SKApi::Resources::CreditNote, "in general" do
|
|
25
25
|
}.should raise_error(ActiveResource::ResourceNotFound)
|
26
26
|
end
|
27
27
|
|
28
|
-
it "should create a doc" do
|
28
|
+
it "should create a doc and use default before after text" do
|
29
29
|
@doc.errors.should be_empty
|
30
|
+
@doc.notes_before.should_not be_empty
|
30
31
|
@doc.new?.should be_false
|
31
32
|
end
|
32
|
-
|
33
|
+
|
33
34
|
it "should fail create a doc" do
|
34
35
|
doc = SKApi::Resources::CreditNote.new()
|
35
36
|
doc.save.should == false
|
@@ -44,12 +45,11 @@ describe SKApi::Resources::CreditNote, "in general" do
|
|
44
45
|
|
45
46
|
it "should validate raw json object with schema" do
|
46
47
|
doc = SKApi::Resources::CreditNote.find(@doc.id)
|
47
|
-
# doc.number.should=='23'
|
48
48
|
# convert to json and read raw without activeresource assigning classes
|
49
49
|
json = doc.to_json
|
50
|
-
obj =
|
50
|
+
obj = ActiveSupport::JSON.decode(json)
|
51
51
|
lambda {
|
52
|
-
JSON::Schema.validate(obj, SKApi::Resources::CreditNote.schema)
|
52
|
+
JSON::Schema.validate(obj['credit_note'], SKApi::Resources::CreditNote.schema)
|
53
53
|
}.should_not raise_error
|
54
54
|
end
|
55
55
|
|