hsquare 0.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 +7 -0
- data/.gitignore +22 -0
- data/Gemfile +9 -0
- data/Guardfile +33 -0
- data/LICENSE.txt +22 -0
- data/README.md +106 -0
- data/Rakefile +2 -0
- data/hsquare.gemspec +26 -0
- data/lib/hsquare.rb +44 -0
- data/lib/hsquare/client.rb +29 -0
- data/lib/hsquare/configuration.rb +10 -0
- data/lib/hsquare/device.rb +88 -0
- data/lib/hsquare/notification.rb +104 -0
- data/lib/hsquare/version.rb +3 -0
- data/spec/lib/hsquare/client_spec.rb +12 -0
- data/spec/lib/hsquare/device_spec.rb +47 -0
- data/spec/lib/hsquare/notification_spec.rb +18 -0
- data/spec/lib/hsquare_spec.rb +25 -0
- data/spec/spec_helper.rb +5 -0
- data/spec/support/mock_client.rb +0 -0
- metadata +125 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: fc918c686257ac4d8b60bcc048478af856fc2c5d
|
4
|
+
data.tar.gz: 384c6efac79fedb378ff6cc33cc8b4f577e90059
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9cb102be70277076f0b11bf91538e0f68eb61e17f25df3ba74df3e461c1ac2a0e3d03d3edbdfd54b333b42a755a62bc9c3a00a25b4360df13d52c6b0973e2dc0
|
7
|
+
data.tar.gz: 81ada066c79ce2686a76b73b3e8994e0fb0d76b68d8b0bd1133f3a60e8fbabb8d8c1f4ea62805b7b7beb2dc538d305629061ff87eddfba4fe5f8314b6c242a4e
|
data/.gitignore
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
.yardoc
|
6
|
+
Gemfile.lock
|
7
|
+
InstalledFiles
|
8
|
+
_yardoc
|
9
|
+
coverage
|
10
|
+
doc/
|
11
|
+
lib/bundler/man
|
12
|
+
pkg
|
13
|
+
rdoc
|
14
|
+
spec/reports
|
15
|
+
test/tmp
|
16
|
+
test/version_tmp
|
17
|
+
tmp
|
18
|
+
*.bundle
|
19
|
+
*.so
|
20
|
+
*.o
|
21
|
+
*.a
|
22
|
+
mkmf.log
|
data/Gemfile
ADDED
data/Guardfile
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
# Note: The cmd option is now required due to the increasing number of ways
|
5
|
+
# rspec may be run, below are examples of the most common uses.
|
6
|
+
# * bundler: 'bundle exec rspec'
|
7
|
+
# * bundler binstubs: 'bin/rspec'
|
8
|
+
# * spring: 'bin/rsspec' (This will use spring if running and you have
|
9
|
+
# installed the spring binstubs per the docs)
|
10
|
+
# * zeus: 'zeus rspec' (requires the server to be started separetly)
|
11
|
+
# * 'just' rspec: 'rspec'
|
12
|
+
guard :rspec, cmd: 'bundle exec rspec' do
|
13
|
+
watch(%r{^spec/.+_spec\.rb$})
|
14
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
15
|
+
watch('spec/spec_helper.rb') { "spec" }
|
16
|
+
|
17
|
+
# Rails example
|
18
|
+
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
19
|
+
watch(%r{^app/(.*)(\.erb|\.haml|\.slim)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
|
20
|
+
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
|
21
|
+
watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
|
22
|
+
watch('config/routes.rb') { "spec/routing" }
|
23
|
+
watch('app/controllers/application_controller.rb') { "spec/controllers" }
|
24
|
+
watch('spec/rails_helper.rb') { "spec" }
|
25
|
+
|
26
|
+
# Capybara features specs
|
27
|
+
watch(%r{^app/views/(.+)/.*\.(erb|haml|slim)$}) { |m| "spec/features/#{m[1]}_spec.rb" }
|
28
|
+
|
29
|
+
# Turnip features and steps
|
30
|
+
watch(%r{^spec/acceptance/(.+)\.feature$})
|
31
|
+
watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
|
32
|
+
end
|
33
|
+
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Inbeom Hwang
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
# Hsquare
|
2
|
+
|
3
|
+
Hsquare는 [Kakao developers](http://developers.kakao.com) Open Platform API의
|
4
|
+
루비 클라이언트 라이브러리입니다.
|
5
|
+
|
6
|
+
현재는 푸시 알림 기능을 제공하며, 앞으로 인증 및 카카오톡, 카카오스토리 포스팅
|
7
|
+
등으로 지원 기능을 확장해 나갈 계획입니다.
|
8
|
+
|
9
|
+
## 설치하기
|
10
|
+
|
11
|
+
애플리케이션의 Gemfile에 hsquare를 추가합니다:
|
12
|
+
|
13
|
+
gem 'hsquare'
|
14
|
+
|
15
|
+
Bundler를 이용해 설치합니다:
|
16
|
+
|
17
|
+
$ bundle
|
18
|
+
|
19
|
+
## 사용하기
|
20
|
+
|
21
|
+
### 애플리케이션 생성
|
22
|
+
|
23
|
+
Hsquare를 사용하려면 Kakao Developers에서 애플리케이션을 생성해야 합니다.
|
24
|
+
Kakao Developers에 가입 및 로그인하신 후
|
25
|
+
[내 애플리케이션](https://developers.kakao.com/apps) 페이지에서 애플리케이션을
|
26
|
+
생성해 주세요.
|
27
|
+
|
28
|
+
### Hsquare 설정
|
29
|
+
|
30
|
+
애플리케이션 생성 후, 내 애플리케이션 페이지에서 앱 키를 얻을 수 있습니다.
|
31
|
+
4개의 앱 키 중 Admin 키를 Hsquare에 설정합니다:
|
32
|
+
|
33
|
+
```ruby
|
34
|
+
# In config/initializers/hsquare.rb
|
35
|
+
|
36
|
+
Hsquare.config do |config|
|
37
|
+
config.admin_key = '내 애플리케이션의 Admin 키'
|
38
|
+
end
|
39
|
+
```
|
40
|
+
|
41
|
+
Admin 키는 외부에 노출되지 않도록 보안에 주의를 기울여야 합니다. 환경 변수
|
42
|
+
등으로 소스 컨트롤에서 분리하여 설정하도록 처리하는 것을 추천합니다.
|
43
|
+
|
44
|
+
### 푸시 알림
|
45
|
+
|
46
|
+
#### 기기의 푸시 토큰 등록
|
47
|
+
|
48
|
+
애플리케이션 서버에서 푸시 토큰을 등록해야 한다면 `Hsquare::Device` 클래스의
|
49
|
+
객체를 다음과 같이 생성하고,
|
50
|
+
|
51
|
+
```ruby
|
52
|
+
device = Hsquare::Device.new(
|
53
|
+
id: (애플리케이션 내 기기 ID),
|
54
|
+
user_id: (애플리케이션 사용자 ID),
|
55
|
+
token: '푸시 토큰',
|
56
|
+
type: '(apns 또는 gcm)'
|
57
|
+
)
|
58
|
+
```
|
59
|
+
|
60
|
+
해당 객체의 `#register` 메소드를 호출하여 기기의 푸시 토큰을 등록할 수
|
61
|
+
있습니다.
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
device.register # Open Platform API가 호출됩니다.
|
65
|
+
```
|
66
|
+
|
67
|
+
클라이언트에서 푸시 토큰을 등록하도록 처리되어 있다면 이 과정은 거치지 않아도
|
68
|
+
됩니다.
|
69
|
+
|
70
|
+
#### 알림 전송
|
71
|
+
|
72
|
+
`Hsquare::Notification` 클래스의 객체를 생성하고 `#deliver` 메소드로 알림을
|
73
|
+
전송합니다.
|
74
|
+
|
75
|
+
`Hsquare::Notification` 클래스는 다음과 같이 생성합니다. 각 인자의 의미는 이
|
76
|
+
젬의 소스 코드나 Kakao Developers의 [API 소개 페이지](https://developers.kakao.com/docs/restapi#푸시-알림-푸시-알림-보내기)를
|
77
|
+
참조하세요:
|
78
|
+
|
79
|
+
```ruby
|
80
|
+
notification = Hsquare::Notification.new(
|
81
|
+
recipient_ids: [1, 2, 3], # 알림을 받을 사용자 ID의 목록
|
82
|
+
message: 'Hello world!' # 전송할 알림 메시지
|
83
|
+
badge: 0 # 뱃지 카운트 (iOS only)
|
84
|
+
sound: 'default' # 알림 시 재생할 소리 (iOS only)
|
85
|
+
push_alert: true # 푸시 알림 여부 (iOS only, default: true)
|
86
|
+
collapse: nil # GCM collapse key (Android only)
|
87
|
+
idle_delay: false # 사용자 기기 상태에 따른 알림 전송 시점 변경 (Android only)
|
88
|
+
extra: {} # 추가 Payload
|
89
|
+
)
|
90
|
+
|
91
|
+
notification.deliver # 알림을 전송하는 Open Platform API를 호춣합니다.
|
92
|
+
```
|
93
|
+
|
94
|
+
#### 푸시 토큰 등록 해제
|
95
|
+
|
96
|
+
기기 푸시 토큰 등록에서와 같은 방법으로 `Hsquare::Device` 객체를 생성하고 해당
|
97
|
+
객체의 `#unregister` 메소드를 호출하여 기기의 푸시 토큰을 등록 해제할 수
|
98
|
+
있습니다.
|
99
|
+
|
100
|
+
## Contributing
|
101
|
+
|
102
|
+
1. Fork it ( https://github.com/inbeom/hsquare/fork )
|
103
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
104
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
105
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
106
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
data/hsquare.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'hsquare/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'hsquare'
|
8
|
+
spec.version = Hsquare::VERSION
|
9
|
+
spec.authors = ['Inbeom Hwang']
|
10
|
+
spec.email = ['hwanginbeom@gmail.com']
|
11
|
+
spec.summary = %q{Client library for Kakao Developers Open Platform API}
|
12
|
+
spec.description = %q{Client library for Kakao Developers Open Platform API}
|
13
|
+
spec.homepage = 'https://github.com/inbeom/hsquare'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
|
21
|
+
spec.add_dependency 'httparty'
|
22
|
+
|
23
|
+
spec.add_development_dependency 'bundler', "~> 1.6"
|
24
|
+
spec.add_development_dependency 'rake'
|
25
|
+
spec.add_development_dependency 'rspec'
|
26
|
+
end
|
data/lib/hsquare.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'httparty'
|
2
|
+
|
3
|
+
require 'hsquare/version'
|
4
|
+
require 'hsquare/configuration'
|
5
|
+
require 'hsquare/client'
|
6
|
+
require 'hsquare/device'
|
7
|
+
require 'hsquare/notification'
|
8
|
+
|
9
|
+
module Hsquare
|
10
|
+
# Public: Configures Hsquare with given block.
|
11
|
+
#
|
12
|
+
# Examples
|
13
|
+
#
|
14
|
+
# Hsqure.config do |config|
|
15
|
+
# config.admin_key = # Admin key obtained from Kakao Developers
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# Returns newly set configuration.
|
19
|
+
def self.config
|
20
|
+
if block_given?
|
21
|
+
Hsquare::Configuration.new.tap do |configuration|
|
22
|
+
yield(configuration)
|
23
|
+
apply(configuration)
|
24
|
+
end
|
25
|
+
else
|
26
|
+
@configuration ||= Hsquare::Configuration.new
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Public: Applies given configuration.
|
31
|
+
#
|
32
|
+
# Returns nothing.
|
33
|
+
def self.apply(configuration)
|
34
|
+
Hsquare::Client::Admin.admin_key = configuration.admin_key if configuration.admin_key
|
35
|
+
|
36
|
+
if configuration.http_proxy
|
37
|
+
http_proxy_uri = URI.parse(configuration.http_proxy)
|
38
|
+
|
39
|
+
Hsquare::Client.http_proxy http_proxy_uri.host, http_proxy_uri.port
|
40
|
+
end
|
41
|
+
|
42
|
+
@configuration = configuration
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Hsquare
|
2
|
+
# Public: HTTP(S) client for Kakao API.
|
3
|
+
class Client
|
4
|
+
include HTTParty
|
5
|
+
|
6
|
+
# Public: HTTP(S) client for Kakao API with Admin access.
|
7
|
+
class Admin < Client
|
8
|
+
base_uri 'https://kapi.kakao.com'
|
9
|
+
|
10
|
+
# Public: Getter for admin_key.
|
11
|
+
#
|
12
|
+
# Returns String of admin key.
|
13
|
+
def self.admin_key
|
14
|
+
@admin_key
|
15
|
+
end
|
16
|
+
|
17
|
+
# Public: Setter for admin_key.
|
18
|
+
#
|
19
|
+
# admin_key - Admin key to newly set.
|
20
|
+
#
|
21
|
+
# Returns nothing.
|
22
|
+
def self.admin_key=(admin_key)
|
23
|
+
@admin_key = admin_key
|
24
|
+
|
25
|
+
default_options.merge!(headers: { 'Authorization' => "KakaoAK #{admin_key}" })
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module Hsquare
|
2
|
+
# Public: APNS/GCM devices with push tokens.
|
3
|
+
class Device
|
4
|
+
# Public: ID of the device.
|
5
|
+
attr_accessor :id
|
6
|
+
|
7
|
+
# Public: ID of owner of the device.
|
8
|
+
attr_accessor :user_id
|
9
|
+
|
10
|
+
# Public: Push token received from service providers.
|
11
|
+
attr_accessor :token
|
12
|
+
|
13
|
+
# Public: Type of the device.
|
14
|
+
attr_accessor :type
|
15
|
+
|
16
|
+
# Public: Fetch devices for given user.
|
17
|
+
#
|
18
|
+
# user_or_user_id - User or ID of user.
|
19
|
+
#
|
20
|
+
# Returns Array of HSquare::Device objects retrieved from the server.
|
21
|
+
def self.find_by_user_id(user_or_user_id)
|
22
|
+
user_id = user_or_user_id.respond_to?(:id) ? user_or_user_id.id : user_or_user_id
|
23
|
+
response = Hsquare::Client::Admin.get('/v1/push/tokens', query: { uuid: user_id })
|
24
|
+
|
25
|
+
response.parsed_response.map do |device_response|
|
26
|
+
new(device_response.symbolize_keys)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Public: Initializes new APNS type device.
|
31
|
+
#
|
32
|
+
# attributes - Attributes of the device.
|
33
|
+
# :id, :device_id - ID of the device.
|
34
|
+
# :user_id, :uuid - ID of the owner.
|
35
|
+
# :token, :push_token - Push token of the device.
|
36
|
+
#
|
37
|
+
# Returns newly initialized APNS device.
|
38
|
+
def self.apns(attributes = {})
|
39
|
+
new(attributes.merge(type: 'apns'))
|
40
|
+
end
|
41
|
+
|
42
|
+
# Public: Initializes new GCM type device.
|
43
|
+
#
|
44
|
+
# attributes - Attributes of the device.
|
45
|
+
# :id, :device_id - ID of the device.
|
46
|
+
# :user_id, :uuid - ID of the owner.
|
47
|
+
# :token, :push_token - Push token of the device.
|
48
|
+
#
|
49
|
+
# Returns newly initialized APNS device.
|
50
|
+
def self.gcm(attributes = {})
|
51
|
+
new(attributes.merge(type: 'gcm'))
|
52
|
+
end
|
53
|
+
|
54
|
+
# Public: Initializes new device object.
|
55
|
+
#
|
56
|
+
# attributes - Attributes of the device.
|
57
|
+
# :id, :device_id - ID of the device.
|
58
|
+
# :type, :push_type - Type of the device.
|
59
|
+
# :user_id, :uuid - ID of the owner.
|
60
|
+
# :token, :push_token - Push token of the device.
|
61
|
+
#
|
62
|
+
# Returns newly iniitalized device object.
|
63
|
+
def initialize(attributes = {})
|
64
|
+
@id = attributes[:id] || attributes[:device_id]
|
65
|
+
@user_id = attributes[:user_id] || attributes[:uuid]
|
66
|
+
@token = attributes[:token] || attributes[:push_token]
|
67
|
+
@type = attributes[:type] || attributes[:push_type]
|
68
|
+
end
|
69
|
+
|
70
|
+
# Public: Registers the device via Kakao API.
|
71
|
+
#
|
72
|
+
# Returns Number of days before invalidation.
|
73
|
+
def register
|
74
|
+
Hsquare::Client::Admin.post('/v1/push/register', body: {
|
75
|
+
uuid: user_id, device_id: id, push_type: type, push_token: token.gsub(/\s/, '')
|
76
|
+
})
|
77
|
+
end
|
78
|
+
|
79
|
+
# Public: Unregisters the device via Kakao API.
|
80
|
+
#
|
81
|
+
# Returns Number of days before invalidation.
|
82
|
+
def unregister
|
83
|
+
Hsquare::Client::Admin.post('/v1/push/deregister', body: {
|
84
|
+
uuid: user_id, device_id: id, push_type: type
|
85
|
+
})
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
module Hsquare
|
2
|
+
# Public: Notification entries sent to Kakao push.
|
3
|
+
class Notification
|
4
|
+
# Public: Array of recipient IDs.
|
5
|
+
attr_accessor :recipient_ids
|
6
|
+
|
7
|
+
# Public: Message (alert in APNS) displayed to recipients.
|
8
|
+
attr_accessor :message
|
9
|
+
|
10
|
+
# Public: Badge count to set.
|
11
|
+
attr_accessor :badge
|
12
|
+
|
13
|
+
# Public: Sound to play.
|
14
|
+
attr_accessor :sound
|
15
|
+
|
16
|
+
# Public: Whether notification is delivered through notification center.
|
17
|
+
attr_accessor :push_alert
|
18
|
+
|
19
|
+
# Public: Collapse key for GCM.
|
20
|
+
attr_accessor :collapse
|
21
|
+
|
22
|
+
# Public: Whether GCM message delivery is delayed while device is idle.
|
23
|
+
attr_accessor :idle_delay
|
24
|
+
|
25
|
+
# Public: Extra payload.
|
26
|
+
attr_accessor :extra
|
27
|
+
|
28
|
+
# Public: Initializes new notification object.
|
29
|
+
#
|
30
|
+
# attributes - Attributes of the notification.
|
31
|
+
# :recipient_id - ID of recipient (optinoal).
|
32
|
+
# :recipient_ids - List of IDs of recipients (optinoal).
|
33
|
+
# :message - Message displayed to recipients (optional).
|
34
|
+
# :badge - Badge count (optinoal).
|
35
|
+
# :sound - Sound to play (optinoal).
|
36
|
+
# :push_alert - Whether notification is delivered through
|
37
|
+
# notification center (default: true).
|
38
|
+
# :collapse - Collapse key for GCM (optional).
|
39
|
+
# :idle_delay - Whether GCM message delivery is delayed
|
40
|
+
# while device is idle (default: false).
|
41
|
+
# :extra - Extra payload (optinoal).
|
42
|
+
#
|
43
|
+
# Returns newly initialized notification object.
|
44
|
+
def initialize(attributes = {})
|
45
|
+
@recipient_ids = (attributes[:recipient_id] && [attributes[:recipient_id]]) || attributes[:recipient_ids]
|
46
|
+
@message = attributes[:message]
|
47
|
+
@badge = attributes[:badge]
|
48
|
+
@sound = attributes[:sound]
|
49
|
+
@push_alert = attributes.has_key?(:push_alert) ? attributes[:push_alert] : true
|
50
|
+
@collapse = attributes[:collapse]
|
51
|
+
@idle_delay = attributes.has_key?(:idle_delay) ? attributes[:idle_delay] : false
|
52
|
+
@extra = attributes[:extra]
|
53
|
+
end
|
54
|
+
|
55
|
+
# Public: Helper method to set recipient_ids with single ID.
|
56
|
+
#
|
57
|
+
# recipient_id - ID of single recipient.
|
58
|
+
#
|
59
|
+
# Returns 1-length array of recipient_id.
|
60
|
+
def recipient_id=(recipient_id)
|
61
|
+
@recipient_ids = [recipient_id]
|
62
|
+
end
|
63
|
+
|
64
|
+
# Public: Delivers notification to recipients' devices.
|
65
|
+
#
|
66
|
+
# Returns nothing.
|
67
|
+
def deliver
|
68
|
+
Hsquare::Client::Admin.post('/v1/push/send', body: payload)
|
69
|
+
end
|
70
|
+
|
71
|
+
protected
|
72
|
+
|
73
|
+
# Internal: Payload delivered to push send API.
|
74
|
+
#
|
75
|
+
# Returns Hash of request body.
|
76
|
+
def payload
|
77
|
+
{ uuids: recipient_ids.to_json, push_message: { for_apns: apns_payload, for_gcm: gcm_payload }.to_json }
|
78
|
+
end
|
79
|
+
|
80
|
+
# Internal: Payload for APNS.
|
81
|
+
#
|
82
|
+
# Returns Hash of APNS payload.
|
83
|
+
def apns_payload
|
84
|
+
{
|
85
|
+
badge: badge,
|
86
|
+
sound: sound,
|
87
|
+
push_alert: push_alert,
|
88
|
+
message: message,
|
89
|
+
custom_field: extra
|
90
|
+
}.keep_if { |_, v| !v.nil? }
|
91
|
+
end
|
92
|
+
|
93
|
+
# Internal: Payload for GCM.
|
94
|
+
#
|
95
|
+
# Returns Hash of GCM payload.
|
96
|
+
def gcm_payload
|
97
|
+
{
|
98
|
+
collapse: collapse,
|
99
|
+
delay_while_idle: idle_delay,
|
100
|
+
custom_field: (extra || {}).merge(message: message)
|
101
|
+
}.keep_if { |_, v| !v.nil? }
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Hsquare::Client do
|
4
|
+
describe Hsquare::Client::Admin do
|
5
|
+
describe '#admin_key=' do
|
6
|
+
let(:admin_key) { 'admin-key' }
|
7
|
+
|
8
|
+
it { expect { Hsquare::Client::Admin.admin_key = admin_key }.to change { Hsquare::Client::Admin.default_options } }
|
9
|
+
it { expect { Hsquare::Client::Admin.admin_key = admin_key }.not_to change { Hsquare::Client.default_options } }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Hsquare::Device do
|
4
|
+
describe '.find_by_user_id' do
|
5
|
+
let(:user_id) { 123 }
|
6
|
+
let(:mock_response) { double(parsed_response: []) }
|
7
|
+
|
8
|
+
it { expect(Hsquare::Client::Admin).to receive(:get).with('/v1/push/tokens', query: { uuid: user_id }).and_return(mock_response); Hsquare::Device.find_by_user_id(user_id) }
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '#initialize' do
|
12
|
+
let(:attributes) { {} }
|
13
|
+
let(:device) { Hsquare::Device.new(attributes) }
|
14
|
+
|
15
|
+
context 'when attributes is set with proper values' do
|
16
|
+
let(:attributes) { { id: 2, type: 'apns', user_id: 3, token: 'token' } }
|
17
|
+
|
18
|
+
it { expect(device.id).to eq(attributes[:id]) }
|
19
|
+
it { expect(device.type).to eq(attributes[:type]) }
|
20
|
+
it { expect(device.user_id).to eq(attributes[:user_id]) }
|
21
|
+
it { expect(device.token).to eq(attributes[:token]) }
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'when attributes is set with values from API response' do
|
25
|
+
let(:attributes) { { device_id: 2, push_type: 'apns', uuid: 3, push_token: 'token' } }
|
26
|
+
|
27
|
+
it { expect(device.id).to eq(attributes[:device_id]) }
|
28
|
+
it { expect(device.type).to eq(attributes[:push_type]) }
|
29
|
+
it { expect(device.user_id).to eq(attributes[:uuid]) }
|
30
|
+
it { expect(device.token).to eq(attributes[:push_token]) }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe '#register' do
|
35
|
+
let(:attributes) { { id: 1, user_id: 2, type: 'apns', token: 'token' } }
|
36
|
+
let(:device) { Hsquare::Device.new(attributes) }
|
37
|
+
|
38
|
+
it { expect(Hsquare::Client::Admin).to receive(:post).with('/v1/push/register', body: { uuid: device.user_id, device_id: device.id, push_type: device.type, push_token: device.token }); device.register }
|
39
|
+
end
|
40
|
+
|
41
|
+
describe '#unregister' do
|
42
|
+
let(:attributes) { { id: 1, user_id: 2, type: 'apns', token: 'token' } }
|
43
|
+
let(:device) { Hsquare::Device.new(attributes) }
|
44
|
+
|
45
|
+
it { expect(Hsquare::Client::Admin).to receive(:post).with('/v1/push/deregister', body: { uuid: device.user_id, device_id: device.id, push_type: device.type }); device.unregister }
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Hsquare::Notification do
|
4
|
+
describe '#deliver' do
|
5
|
+
let(:recipient_id) { 123 }
|
6
|
+
let(:message) { 'message' }
|
7
|
+
let(:notification) { Hsquare::Notification.new(recipient_id: recipient_id, message: message) }
|
8
|
+
|
9
|
+
it { expect(Hsquare::Client::Admin).to receive(:post).with('/v1/push/send', body: { uuids: [recipient_id].to_json, push_message: { for_apns: { push_alert: true, message: message }, for_gcm: { delay_while_idle: false, custom_field: { message: message } } }.to_json }); notification.deliver }
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '#recipient_id=' do
|
13
|
+
let(:recipient_id) { 123 }
|
14
|
+
let(:notification) { Hsquare::Notification.new }
|
15
|
+
|
16
|
+
it { expect { notification.recipient_id = recipient_id }.to change { notification.recipient_ids }.to([recipient_id]) }
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Hsquare do
|
4
|
+
describe '.apply' do
|
5
|
+
let(:configuration) { Hsquare::Configuration.new }
|
6
|
+
|
7
|
+
before { Hsquare::Client.default_options.clear }
|
8
|
+
before { Hsquare::Client::Admin.default_options.clear }
|
9
|
+
|
10
|
+
context 'when http_proxy is set' do
|
11
|
+
before { configuration.http_proxy = 'http://proxy.com:1234' }
|
12
|
+
|
13
|
+
it { expect { Hsquare.apply(configuration) }.to change { Hsquare::Client.default_options } }
|
14
|
+
it { expect { Hsquare.apply(configuration) }.to change { Hsquare::Client::Admin.default_options } }
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'when admin_key is set' do
|
18
|
+
before { configuration.admin_key = 'admin-key' }
|
19
|
+
|
20
|
+
it { expect { Hsquare.apply(configuration) }.not_to change { Hsquare::Client.default_options } }
|
21
|
+
it { expect { Hsquare.apply(configuration) }.to change { Hsquare::Client::Admin.admin_key } }
|
22
|
+
it { expect { Hsquare.apply(configuration) }.to change { Hsquare::Client::Admin.default_options } }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/spec/spec_helper.rb
ADDED
File without changes
|
metadata
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: hsquare
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Inbeom Hwang
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-09-12 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: httparty
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.6'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.6'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: Client library for Kakao Developers Open Platform API
|
70
|
+
email:
|
71
|
+
- hwanginbeom@gmail.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- ".gitignore"
|
77
|
+
- Gemfile
|
78
|
+
- Guardfile
|
79
|
+
- LICENSE.txt
|
80
|
+
- README.md
|
81
|
+
- Rakefile
|
82
|
+
- hsquare.gemspec
|
83
|
+
- lib/hsquare.rb
|
84
|
+
- lib/hsquare/client.rb
|
85
|
+
- lib/hsquare/configuration.rb
|
86
|
+
- lib/hsquare/device.rb
|
87
|
+
- lib/hsquare/notification.rb
|
88
|
+
- lib/hsquare/version.rb
|
89
|
+
- spec/lib/hsquare/client_spec.rb
|
90
|
+
- spec/lib/hsquare/device_spec.rb
|
91
|
+
- spec/lib/hsquare/notification_spec.rb
|
92
|
+
- spec/lib/hsquare_spec.rb
|
93
|
+
- spec/spec_helper.rb
|
94
|
+
- spec/support/mock_client.rb
|
95
|
+
homepage: https://github.com/inbeom/hsquare
|
96
|
+
licenses:
|
97
|
+
- MIT
|
98
|
+
metadata: {}
|
99
|
+
post_install_message:
|
100
|
+
rdoc_options: []
|
101
|
+
require_paths:
|
102
|
+
- lib
|
103
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
104
|
+
requirements:
|
105
|
+
- - ">="
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: '0'
|
108
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0'
|
113
|
+
requirements: []
|
114
|
+
rubyforge_project:
|
115
|
+
rubygems_version: 2.2.2
|
116
|
+
signing_key:
|
117
|
+
specification_version: 4
|
118
|
+
summary: Client library for Kakao Developers Open Platform API
|
119
|
+
test_files:
|
120
|
+
- spec/lib/hsquare/client_spec.rb
|
121
|
+
- spec/lib/hsquare/device_spec.rb
|
122
|
+
- spec/lib/hsquare/notification_spec.rb
|
123
|
+
- spec/lib/hsquare_spec.rb
|
124
|
+
- spec/spec_helper.rb
|
125
|
+
- spec/support/mock_client.rb
|