xi_wechat_corp 1.0.0 → 1.0.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a668aecce2c27bf2ecf30019fe33a0a7e03778a9
4
- data.tar.gz: 99ea5c52fe837b0e3dc317de78325a6e01566ba6
3
+ metadata.gz: f43b1974370248c09d051e2e6892767be0991916
4
+ data.tar.gz: 3597d0baf0dee464ddae6ac9a6124694607cbff3
5
5
  SHA512:
6
- metadata.gz: 3257dd7d6467d516ba196d8be07f635bf826d6dacfd6d77c17ad21c038b67fdc12c9804ac4d53cd9323f23eb57108d0406788151ea23cc0cd815d43c7f46d059
7
- data.tar.gz: 4496688d3f9aa96234d5f538e1d6b69013e44995a924bb8eb1d037109b77292900822f9d04b5da4ec885376d8a27dc92c73a1ce540549c1f9de5a27153c32f64
6
+ metadata.gz: 7bae479c83066ae4b2950a44804aec6ef600731f4bd36e9dbdfe3242f9c89df8e611c094d4596463b293ba18941fb185f3c112130d3c4c80c2155646ae2d8df7
7
+ data.tar.gz: c0fc91b01d1f986e8589a8cd6cc9a8e696319d92bfee9c6f83c48274b6df0d8c0e3c160723b73a51a94ba83ed9a73058988b7e65193496794affc1efe99558fb
@@ -59,9 +59,10 @@ module XiWechatCorp
59
59
  def get_access_token(corp_id = nil, secret = nil)
60
60
  @corp_id = corp_id unless corp_id.nil?
61
61
  @secret = secret unless secret.nil?
62
- resp = get('gettoken', corpid: @corp_id, corpsecret: @secret)
63
- @access_token.assign(resp.body['access_token'])
64
- @access_token
62
+ @access_token = maybe_cache do
63
+ resp = get('gettoken', corpid: @corp_id, corpsecret: @secret)
64
+ resp.body['access_token']
65
+ end
65
66
  end
66
67
 
67
68
  alias_method :auth, :get_access_token
@@ -72,6 +73,27 @@ module XiWechatCorp
72
73
  end
73
74
 
74
75
  private
76
+ def maybe_cache
77
+ if XiWechatCorp.cache.nil?
78
+ AccessToken.new(yield)
79
+ else
80
+ expired_at = 0
81
+ key = ['xi_wechat_corp', SHA1Signer.new(@secret).sign(@corp_id)].join('/')
82
+ cached = XiWechatCorp.cache.read(key)
83
+ if cached && cached =~ /\A\d+:/
84
+ expired_at, token = cached.split(':', 2)
85
+ expired_at = expired_at.to_i
86
+ end
87
+ if token && expired_at != 0 && expired_at > Time.now.to_i
88
+ AccessToken.new(token, expired_at)
89
+ else
90
+ ret = AccessToken.new(yield)
91
+ XiWechatCorp.cache.write(key, [ret.expired_at, ret.token].join(':'))
92
+ ret
93
+ end
94
+ end
95
+ end
96
+
75
97
  def can_get_access_token?
76
98
  !@corp_id.nil? && !@secret.nil?
77
99
  end
@@ -0,0 +1,18 @@
1
+ module XiWechatCorp
2
+ module Callback
3
+ # Ensure that XiWechatCorp::Callback::Rack middleware has bee added.
4
+ #
5
+ # parser :xml, XiWechatCorp::Callback::GrapeXmlParser
6
+ module GrapeXmlParser
7
+ class << self
8
+ def call(object, env)
9
+ if env['xi_wechat_corp.params']
10
+ env['xi_wechat_corp.params']
11
+ else
12
+ Grape::Parser::Xml.call(object, env)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,3 +1,3 @@
1
1
  module XiWechatCorp
2
- VERSION = '1.0.0'
2
+ VERSION = '1.0.1'
3
3
  end
@@ -7,6 +7,20 @@ module XiWechatCorp
7
7
  autoload :AesCrypt, 'xi_wechat_corp/aes_crypt'
8
8
 
9
9
  class << self
10
- attr_accessor :logger
10
+ # logger must support method `error(string)`
11
+ attr_reader :logger
12
+ # value = cache.read(key)
13
+ # cache.write(key, value)
14
+ attr_reader :cache
15
+
16
+ def logger=(logger)
17
+ raise ArgumentError if logger && !logger.respond_to?(:error)
18
+ @logger = logger
19
+ end
20
+
21
+ def cache=(cache)
22
+ raise ArgumentError if cache && (!cache.respond_to?(:read) || !cache.respond_to?(:write))
23
+ @cache = cache
24
+ end
11
25
  end
12
26
  end
data/test/test_helper.rb CHANGED
@@ -4,6 +4,7 @@ require 'minitest/unit'
4
4
  require 'minitest/autorun'
5
5
  require 'minitest/pride'
6
6
  require 'webmock/minitest'
7
+ require 'pry'
7
8
 
8
9
  class << Minitest::Test
9
10
  def test(name, &block)
@@ -4,8 +4,20 @@ require 'xi_wechat_corp/api/access_token'
4
4
  module XiWechatCorp
5
5
  module API
6
6
  class ConnectionTest < Minitest::Test
7
+ class Cache < Hash
8
+ alias_method :read, :[]
9
+ alias_method :write, :[]=
10
+ end
11
+
7
12
  def setup
13
+ WebMock.reset!
8
14
  stub_request(:any, %r{https://qyapi.weixin.qq.com/cgi-bin/.*}).to_return(body: '{"access_token":"at"}')
15
+ @remember_cache = XiWechatCorp.cache
16
+ XiWechatCorp.cache = Cache.new
17
+ end
18
+
19
+ def teardown
20
+ XiWechatCorp.cache = @remember_cache
9
21
  end
10
22
 
11
23
  def conn
@@ -31,6 +43,16 @@ module XiWechatCorp
31
43
  assert_requested :get, 'https://qyapi.weixin.qq.com/cgi-bin/test',
32
44
  query: { 'access_token' => 'at' }
33
45
  end
46
+
47
+ test 'access token cache' do
48
+ conn = Connection.new corp_id: 'corptest', secret: 'secret'
49
+ conn.get_access_token
50
+
51
+ conn = Connection.new corp_id: 'corptest', secret: 'secret'
52
+ conn.get_access_token
53
+
54
+ assert_requested :get, 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=corptest&corpsecret=secret', times: 1
55
+ end
34
56
  end
35
57
  end
36
58
  end
@@ -28,4 +28,5 @@ Gem::Specification.new do |spec|
28
28
  spec.add_development_dependency 'minitest', '~> 5.5.1'
29
29
  spec.add_development_dependency 'webmock'
30
30
  spec.add_development_dependency 'rack-test'
31
+ spec.add_development_dependency 'pry'
31
32
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xi_wechat_corp
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ian Yang
@@ -150,6 +150,20 @@ dependencies:
150
150
  - - ">="
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: pry
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
153
167
  description: Wechat Corp development toolkits
154
168
  email:
155
169
  - ian@3pjgames.com
@@ -169,6 +183,7 @@ files:
169
183
  - lib/xi_wechat_corp/api/connection.rb
170
184
  - lib/xi_wechat_corp/callback.rb
171
185
  - lib/xi_wechat_corp/callback/config.rb
186
+ - lib/xi_wechat_corp/callback/grape_xml_parser.rb.rb
172
187
  - lib/xi_wechat_corp/callback/rack.rb
173
188
  - lib/xi_wechat_corp/callback/request.rb
174
189
  - lib/xi_wechat_corp/callback/response.rb