shopkit 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,19 +1,55 @@
1
- = Shopkit
1
+ # Shopkit
2
2
 
3
- Description goes here.
3
+ ShopQi Ruby API 客户端
4
4
 
5
- == Contributing to Shopkit
6
-
7
- * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
8
- * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
9
- * Fork the project.
10
- * Start a feature/bugfix branch.
11
- * Commit and push until you are happy with your contribution.
12
- * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
13
- * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
5
+ ## 安装
14
6
 
15
- == Copyright
7
+ $ gem install shopkit
16
8
 
17
- Copyright (c) 2012 saberma. See LICENSE.txt for
18
- further details.
9
+ ## 使用
19
10
 
11
+ * 通过 api clients 访问
12
+
13
+ require 'shopkit'
14
+ Shopkit.setup url: 'https://your-shop-name.shopqi.com', login: 'api key', password: 'password'
15
+ Shopkit.orders # 获取订单
16
+
17
+ `api key`, `password` 在商店后台管理 [应用] - [私有应用],点击"生成新的应用"即可看到
18
+
19
+ * 通过 OAuth2 访问
20
+
21
+ require 'shopkit'
22
+ Shopkit.setup url: 'https://rubyconfchina-shop.shopqi.com', access_token: 'access token'
23
+ Shopkit.products # 获取商品
24
+
25
+ `access token`为商店授权给应用后获取
26
+
27
+ ## API
28
+
29
+ ### 商店
30
+
31
+ [商店属性](https://github.com/saberma/shopqi/blob/master/app/views/api/v1/shops/show.rabl)
32
+
33
+ ### 订单
34
+
35
+ [订单属性](https://github.com/saberma/shopqi/blob/master/app/views/api/v1/orders/show.rabl)
36
+ [订单商品](https://github.com/saberma/shopqi/blob/master/app/views/api/v1/orders/line_items/show.rabl)
37
+
38
+ ### 商品
39
+
40
+ [商品属性](https://github.com/saberma/shopqi/blob/master/app/views/api/v1/products/show.rabl)
41
+ [商品款式](https://github.com/saberma/shopqi/blob/master/app/views/api/v1/product_variants/show.rabl)
42
+
43
+ ## 开发
44
+
45
+ ### 发布
46
+
47
+ 修改 `lib/shopkit/version.rb`
48
+
49
+ rake release -t -v
50
+
51
+ 如果出现以下问题
52
+
53
+ ERROR: Using beta/unreleased version of rubygems. Not pushing
54
+
55
+ 请尝试使用 VPN 连接网络,推荐 vpncup(免费)
data/lib/shopkit.rb CHANGED
@@ -10,6 +10,8 @@ module Shopkit
10
10
  def new(options={})
11
11
  options['url'] = self.url
12
12
  options['access_token'] = self.access_token
13
+ options['login'] = self.login
14
+ options['password'] = self.password
13
15
  Shopkit::Client.new(options)
14
16
  end
15
17
 
@@ -22,7 +24,10 @@ module Shopkit
22
24
 
23
25
  def setup(options)
24
26
  self.url = options[:url]
27
+ self.url = "http://#{self.url}" unless self.url.start_with?('http://', 'https://')
25
28
  self.access_token = options[:access_token]
29
+ self.login = options[:login] # or basic auth
30
+ self.password = options[:password]
26
31
  options
27
32
  end
28
33
 
@@ -1,5 +1,6 @@
1
1
  require 'shopkit/connection'
2
2
  require 'shopkit/request'
3
+ require 'shopkit/traversal'
3
4
 
4
5
  #Load all files in client/ directory
5
6
  Dir.glob("#{File.expand_path(File.dirname(__FILE__))}/client/*.rb").sort.each do |f|
@@ -19,5 +20,6 @@ module Shopkit
19
20
 
20
21
  include Shopkit::Connection
21
22
  include Shopkit::Request
23
+ include Shopkit::Traversal
22
24
  end
23
25
  end
@@ -3,7 +3,9 @@ module Shopkit
3
3
  module Orders
4
4
 
5
5
  def orders(options={})
6
- get('/orders', options)['orders']
6
+ traversal(options) do
7
+ get('/orders', options)['orders']
8
+ end
7
9
  end
8
10
 
9
11
  def order(id, options={})
@@ -6,6 +6,10 @@ module Shopkit
6
6
  get('/products', options)['products']
7
7
  end
8
8
 
9
+ def product(id, options={})
10
+ get("/products/#{id}", options)['product']
11
+ end
12
+
9
13
  end
10
14
 
11
15
  include Products
@@ -8,6 +8,8 @@ module Shopkit
8
8
  :api_version,
9
9
  :url,
10
10
  :access_token,
11
+ :login,
12
+ :password,
11
13
  :user_agent,
12
14
  :auto_traversal,
13
15
  :per_page].freeze
@@ -34,7 +36,9 @@ module Shopkit
34
36
  def reset
35
37
  self.adapter = DEFAULT_ADAPTER
36
38
  self.api_version = DEFAULT_API_VERSION
37
- self.access_token = nil
39
+ self.access_token = nil
40
+ self.login = nil
41
+ self.password = nil
38
42
  self.user_agent = DEFAULT_USER_AGENT
39
43
  self.auto_traversal = DEFAULT_AUTO_TRAVERSAL
40
44
  end
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  require 'faraday_middleware'
2
3
  require 'faraday_middleware/request/oauth2'
3
4
 
@@ -7,16 +8,17 @@ module Shopkit
7
8
  private
8
9
 
9
10
  def connection
10
- #@conn ||= Faraday.new(:url => "https://#{url}") do |builder|
11
- @conn ||= Faraday.new(:url => "http://#{url}") do |builder|
12
- builder.request :oauth2, access_token
11
+ @conn ||= Faraday.new(:url => url) do |builder|
12
+ builder.request :oauth2, access_token if access_token
13
+ builder.request :basic_auth, login, password if login and password
13
14
  builder.request :json # fixed: NoMethodError: undefined method `bytesize' for {...}:Hash
14
15
 
15
- #builder.response :logger
16
+ #builder.response :logger # 调试
16
17
  builder.response :json, :content_type => /\bjson$/
17
18
 
18
19
  builder.adapter :net_http
19
20
  end
21
+ @conn
20
22
  end
21
23
 
22
24
  end
@@ -31,6 +31,7 @@ module Shopkit
31
31
  end
32
32
  end
33
33
 
34
+
34
35
  response.body
35
36
  end
36
37
 
@@ -0,0 +1,17 @@
1
+ module Shopkit
2
+ module Traversal
3
+
4
+ def traversal(options) # 遍历所有页面
5
+ list = yield(options)
6
+ if auto_traversal and !list.empty?
7
+ options[:page] ||= 1
8
+ options[:page] += 1
9
+ list += traversal(options) do
10
+ yield(options)
11
+ end
12
+ end
13
+ list
14
+ end
15
+
16
+ end
17
+ end
@@ -1,3 +1,3 @@
1
1
  module Shopkit
2
- VERSION = "0.1.3" unless defined?(Shopkit::VERSION)
2
+ VERSION = "0.1.4" unless defined?(Shopkit::VERSION)
3
3
  end
data/shopkit.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "shopkit"
8
- s.version = "0.1.3"
8
+ s.version = "0.1.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["saberma"]
12
- s.date = "2012-08-01"
12
+ s.date = "2012-10-04"
13
13
  s.description = "a gem for the ShopQi API"
14
14
  s.email = "mahb45@gmail.com"
15
15
  s.extra_rdoc_files = [
@@ -35,10 +35,15 @@ Gem::Specification.new do |s|
35
35
  "lib/shopkit/configuration.rb",
36
36
  "lib/shopkit/connection.rb",
37
37
  "lib/shopkit/request.rb",
38
+ "lib/shopkit/traversal.rb",
38
39
  "lib/shopkit/version.rb",
39
40
  "shopkit.gemspec",
40
41
  "spec/json/order.json",
41
42
  "spec/json/orders.json",
43
+ "spec/json/orders_empty.json",
44
+ "spec/json/orders_page_2.json",
45
+ "spec/json/orders_page_3.json",
46
+ "spec/json/product.json",
42
47
  "spec/json/products.json",
43
48
  "spec/json/shop.json",
44
49
  "spec/json/variant.json",
@@ -48,6 +53,7 @@ Gem::Specification.new do |s|
48
53
  "spec/shopkit/client/products_spec.rb",
49
54
  "spec/shopkit/client/shop_spec.rb",
50
55
  "spec/shopkit/client/webhooks_spec.rb",
56
+ "spec/shopkit/shopkit_spec.rb",
51
57
  "spec/spec_helper.rb"
52
58
  ]
53
59
  s.homepage = "http://github.com/saberma/shopkit"
@@ -0,0 +1,3 @@
1
+ {
2
+ "orders": []
3
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "orders": [
3
+ {
4
+ "cancel_reason": null,
5
+ "cancelled_at": null,
6
+ "closed_at": "2012-05-15T21:36:38+08:00",
7
+ "created_at": "2012-04-16T23:07:33+08:00",
8
+ "customer_id": 2,
9
+ "email": "mahb45@gmail.com",
10
+ "financial_status": "pending",
11
+ "fulfillment_status": "fulfilled",
12
+ "id": 100,
13
+ "name": "#1096",
14
+ "note": "",
15
+ "number": 96,
16
+ "order_number": 1096,
17
+ "payment_id": 8,
18
+ "shipping_rate": "普通快递-0",
19
+ "shop_id": 2,
20
+ "status": "closed",
21
+ "subtotal_price": 45.0,
22
+ "token": "96b1d0806s0d928f21f6480aa969d9a6",
23
+ "total_line_items_price": 45.0,
24
+ "total_price": 45.0,
25
+ "trade_no": null,
26
+ "updated_at": "2012-05-15T21:36:38+08:00"
27
+ }
28
+ ]
29
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "orders": [
3
+ {
4
+ "cancel_reason": null,
5
+ "cancelled_at": null,
6
+ "closed_at": "2012-05-15T21:36:38+08:00",
7
+ "created_at": "2012-04-16T23:07:33+08:00",
8
+ "customer_id": 2,
9
+ "email": "mahb45@gmail.com",
10
+ "financial_status": "pending",
11
+ "fulfillment_status": "fulfilled",
12
+ "id": 101,
13
+ "name": "#1097",
14
+ "note": "",
15
+ "number": 97,
16
+ "order_number": 1097,
17
+ "payment_id": 8,
18
+ "shipping_rate": "普通快递-0",
19
+ "shop_id": 2,
20
+ "status": "closed",
21
+ "subtotal_price": 45.0,
22
+ "token": "96b1d0806s0d928f21f6480aa969d9a6",
23
+ "total_line_items_price": 45.0,
24
+ "total_price": 45.0,
25
+ "trade_no": null,
26
+ "updated_at": "2012-05-15T21:36:38+08:00"
27
+ }
28
+ ]
29
+ }
@@ -0,0 +1,76 @@
1
+ {
2
+ "product": {
3
+ "body_html": "",
4
+ "created_at": "2012-01-14T11:02:58+08:00",
5
+ "handle": "tee-01",
6
+ "id": 138,
7
+ "price": 45.0,
8
+ "product_type": "T恤",
9
+ "published": true,
10
+ "shop_id": 2,
11
+ "title": "Tee 01",
12
+ "updated_at": "2012-05-21T18:49:13+08:00",
13
+ "vendor": "吉尔丹",
14
+ "variants": [
15
+ {
16
+ "compare_at_price": null,
17
+ "created_at": "2012-03-26T21:45:47+08:00",
18
+ "id": 169,
19
+ "inventory_management": "",
20
+ "inventory_policy": "deny",
21
+ "inventory_quantity": null,
22
+ "option1": "默认大小",
23
+ "option2": "1",
24
+ "option3": "M",
25
+ "position": 1,
26
+ "price": 1900.0,
27
+ "product_id": 138,
28
+ "requires_shipping": true,
29
+ "shop_id": 2,
30
+ "sku": "",
31
+ "updated_at": "2012-05-21T21:24:58+08:00",
32
+ "weight": 0.0
33
+ },
34
+ {
35
+ "compare_at_price": null,
36
+ "created_at": "2012-05-21T18:49:53+08:00",
37
+ "id": 177,
38
+ "inventory_management": "",
39
+ "inventory_policy": "deny",
40
+ "inventory_quantity": null,
41
+ "option1": "默认",
42
+ "option2": "3",
43
+ "option3": "XL",
44
+ "position": 2,
45
+ "price": 1900.0,
46
+ "product_id": 138,
47
+ "requires_shipping": true,
48
+ "shop_id": 2,
49
+ "sku": "",
50
+ "updated_at": "2012-05-21T21:24:58+08:00",
51
+ "weight": 0.0
52
+ }
53
+ ],
54
+ "photos": [
55
+ {
56
+ "created_at": "2012-03-23T11:24:42+08:00",
57
+ "id": 154,
58
+ "position": 0,
59
+ "product_id": 138,
60
+ "product_image_format": "jpg",
61
+ "product_image_uid": "2/products/138/pink-preview_810.jpg",
62
+ "updated_at": "2012-03-23T11:24:54+08:00"
63
+ }
64
+ ],
65
+ "options": [
66
+ {
67
+ "name": "标题",
68
+ "position": 1
69
+ },
70
+ {
71
+ "name": "大小",
72
+ "position": 2
73
+ }
74
+ ]
75
+ }
76
+ }
@@ -9,5 +9,11 @@ describe Shopkit::Client::Products do
9
9
  it 'should get products' do
10
10
  Shopkit.products.size.should_not eql 0
11
11
  end
12
+
13
+ it 'should get product' do
14
+ id = 138
15
+ fake_web "products/#{id}", json_file: :product
16
+ Shopkit.product(id)['id'].should eql id
17
+ end
12
18
 
13
19
  end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe Shopkit do
4
+
5
+ before do
6
+ fake_web "orders", query: {per_page: 1, page: 1}
7
+ fake_web "orders", query: {per_page: 1, page: 2}, json_file: "orders_page_2"
8
+ fake_web "orders", query: {per_page: 1, page: 3}, json_file: "orders_page_3"
9
+ fake_web "orders", query: {per_page: 1, page: 4}, json_file: "orders_empty"
10
+ Shopkit.auto_traversal = true
11
+ end
12
+
13
+ after do
14
+ Shopkit.auto_traversal = false
15
+ end
16
+
17
+ it 'should be auto_traversal' do
18
+ Shopkit.orders(per_page: 1, page: 1).size.should eql 3
19
+ end
20
+
21
+ end
data/spec/spec_helper.rb CHANGED
@@ -5,7 +5,8 @@ require 'webmock/rspec'
5
5
  RSpec.configure do |config|
6
6
 
7
7
  config.before(:each) do
8
- shop_url = 'ruby-china-shop.shopqi.com'
8
+ #shop_url = 'https://ruby-china-shop.shopqi.com'
9
+ shop_url = 'http://ruby-china-shop.shopqi.com'
9
10
  access_token = 'b68da7c5eb6c07ff3f5a1ce731555fdc'
10
11
 
11
12
  Shopkit.setup(url: shop_url, access_token: access_token)
@@ -21,9 +22,10 @@ RSpec.configure do |config|
21
22
  body = options.has_key?(:body) ? options.delete(:body) : load_json(file)
22
23
  method = options.delete(:method) || :get
23
24
 
24
- #url = "https://#{Shopkit.url}/api/#{endpoint}.json"
25
- url = "http://#{Shopkit.url}/api/#{endpoint}.json"
26
- stub_request(method, url).with(body: request_body).to_return(body: body, headers: { content_type: 'text/json' })
25
+ url = "#{Shopkit.url}/api/#{endpoint}.json"
26
+ params = {body: request_body}
27
+ params.merge! query: options[:query] if options[:query]
28
+ stub_request(method, url).with(params).to_return(body: body, headers: { content_type: 'text/json' })
27
29
  end
28
30
 
29
31
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shopkit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-01 00:00:00.000000000 Z
12
+ date: 2012-10-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: faraday
@@ -165,10 +165,15 @@ files:
165
165
  - lib/shopkit/configuration.rb
166
166
  - lib/shopkit/connection.rb
167
167
  - lib/shopkit/request.rb
168
+ - lib/shopkit/traversal.rb
168
169
  - lib/shopkit/version.rb
169
170
  - shopkit.gemspec
170
171
  - spec/json/order.json
171
172
  - spec/json/orders.json
173
+ - spec/json/orders_empty.json
174
+ - spec/json/orders_page_2.json
175
+ - spec/json/orders_page_3.json
176
+ - spec/json/product.json
172
177
  - spec/json/products.json
173
178
  - spec/json/shop.json
174
179
  - spec/json/variant.json
@@ -178,6 +183,7 @@ files:
178
183
  - spec/shopkit/client/products_spec.rb
179
184
  - spec/shopkit/client/shop_spec.rb
180
185
  - spec/shopkit/client/webhooks_spec.rb
186
+ - spec/shopkit/shopkit_spec.rb
181
187
  - spec/spec_helper.rb
182
188
  homepage: http://github.com/saberma/shopkit
183
189
  licenses:
@@ -194,7 +200,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
194
200
  version: '0'
195
201
  segments:
196
202
  - 0
197
- hash: 701946319
203
+ hash: 474065761
198
204
  required_rubygems_version: !ruby/object:Gem::Requirement
199
205
  none: false
200
206
  requirements: