social_plus-web_api 1.0.0
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 +16 -0
- data/.rspec +3 -0
- data/.rubocop.yml +75 -0
- data/.travis.yml +7 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +55 -0
- data/Rakefile +2 -0
- data/lib/social_plus/web_api.rb +12 -0
- data/lib/social_plus/web_api/api_error.rb +50 -0
- data/lib/social_plus/web_api/client.rb +85 -0
- data/lib/social_plus/web_api/http_response_error.rb +18 -0
- data/lib/social_plus/web_api/invalid_token.rb +8 -0
- data/lib/social_plus/web_api/prefectures.rb +55 -0
- data/lib/social_plus/web_api/profile.rb +196 -0
- data/lib/social_plus/web_api/user.rb +58 -0
- data/lib/social_plus/web_api/version.rb +7 -0
- data/lib/tasks/rspec.rake +4 -0
- data/lib/tasks/rubocp.rake +6 -0
- data/lib/tasks/yard.rake +8 -0
- data/social_plus-web_api.gemspec +31 -0
- data/spec/social_plus/web_api/client_spec.rb +152 -0
- data/spec/social_plus/web_api/profile_spec.rb +418 -0
- data/spec/social_plus/web_api/user_spec.rb +133 -0
- data/spec/spec_helper.rb +13 -0
- data/spec/support/macros/social_plus_macros.rb +71 -0
- metadata +172 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 478a90847f6f39922aa12fc9f1712da864e5af9d
|
4
|
+
data.tar.gz: ccfa4efaede205efb439c1886773b1f956f167a1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f0775913c356fc0cb0df82688633624e516d4efbf0f1cd2494ce06b56e02f84b5a986d0cec74116af1c24a762f7e2eccc38b2f0aed7a80fa48150cf15469b0b3
|
7
|
+
data.tar.gz: 0ce553e92923ed27fe2bec14264b7afa2297675419fee39ee95f09398d570e11d0b91b60122a124941c1b9acfe2835ad9df0c0889a26c911a3be4c26cbd470a4
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
AllCops:
|
2
|
+
Exclude:
|
3
|
+
- bin/*
|
4
|
+
- db/schema.rb
|
5
|
+
- vendor/**/*
|
6
|
+
|
7
|
+
#Metrics/AbcSize:
|
8
|
+
# Max: 52
|
9
|
+
|
10
|
+
Metrics/LineLength:
|
11
|
+
Max: 192
|
12
|
+
AllowURI: true
|
13
|
+
URISchemes:
|
14
|
+
- http
|
15
|
+
- https
|
16
|
+
|
17
|
+
Style/MultilineOperationIndentation:
|
18
|
+
EnforcedStyle: indented
|
19
|
+
|
20
|
+
Style/NumericLiterals:
|
21
|
+
MinDigits: 6
|
22
|
+
|
23
|
+
Style/SpaceAroundEqualsInParameterDefault:
|
24
|
+
EnforcedStyle: no_space
|
25
|
+
|
26
|
+
Style/MethodCalledOnDoEndBlock:
|
27
|
+
Enabled: true
|
28
|
+
|
29
|
+
Style/SymbolArray:
|
30
|
+
Enabled: true
|
31
|
+
|
32
|
+
Style/ExtraSpacing:
|
33
|
+
Enabled: true
|
34
|
+
|
35
|
+
Style/BlockDelimiters:
|
36
|
+
EnforcedStyle: semantic
|
37
|
+
|
38
|
+
Style/FormatString:
|
39
|
+
Enabled: false
|
40
|
+
|
41
|
+
Style/PercentLiteralDelimiters:
|
42
|
+
Enabled: false
|
43
|
+
|
44
|
+
Style/RescueModifier:
|
45
|
+
Enabled: false
|
46
|
+
|
47
|
+
Style/SignalException:
|
48
|
+
Enabled: false
|
49
|
+
|
50
|
+
Style/SpaceInsideBrackets:
|
51
|
+
Enabled: false
|
52
|
+
|
53
|
+
Style/UnneededPercentQ:
|
54
|
+
Enabled: false
|
55
|
+
|
56
|
+
Style/CollectionMethods:
|
57
|
+
Enabled: false
|
58
|
+
|
59
|
+
Style/Encoding:
|
60
|
+
Enabled: false
|
61
|
+
|
62
|
+
Style/InlineComment:
|
63
|
+
Enabled: false
|
64
|
+
|
65
|
+
Style/BlockDelimiters:
|
66
|
+
Enabled: false
|
67
|
+
|
68
|
+
Style/StringLiterals:
|
69
|
+
Enabled: false
|
70
|
+
|
71
|
+
Style/ExtraSpacing:
|
72
|
+
Enabled: false
|
73
|
+
|
74
|
+
Style/GlobalVars:
|
75
|
+
Enabled: false
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2014 feedforce Inc.
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
# SocialPlus::WebApi
|
2
|
+
|
3
|
+
[][travisci]
|
4
|
+
[][license]
|
5
|
+
[][gem-link]
|
6
|
+
|
7
|
+
[travisci]: https://travis-ci.org/feedforce/social_plus-web_api
|
8
|
+
[license]: https://github.com/feedforce/social_plus-web_api/blob/master/LICENSE.txt
|
9
|
+
[gem-link]: http://badge.fury.io/rb/social_plus-web_api
|
10
|
+
|
11
|
+
This gem provides fundamental access to Social Plus's Web API.
|
12
|
+
|
13
|
+
## Installation
|
14
|
+
|
15
|
+
Add this line to your application's Gemfile:
|
16
|
+
|
17
|
+
```ruby
|
18
|
+
gem 'social_plus-web_api'
|
19
|
+
```
|
20
|
+
|
21
|
+
And then execute:
|
22
|
+
|
23
|
+
$ bundle
|
24
|
+
|
25
|
+
Or install it yourself as:
|
26
|
+
|
27
|
+
$ gem install social_plus-web_api
|
28
|
+
|
29
|
+
## Usage
|
30
|
+
|
31
|
+
Instantiate an instance of {SocialPlus::WebApi::Client} with a valid API key.
|
32
|
+
|
33
|
+
```ruby
|
34
|
+
client = SocialPlus::WebApi::Client.new(API_KEY)
|
35
|
+
```
|
36
|
+
|
37
|
+
### API access via GET method
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
begin
|
41
|
+
result = client.execute(:api_name, arguments_as_hash)
|
42
|
+
rescue SocialPlus::WebApi::ApiError => e
|
43
|
+
# handle exceptions
|
44
|
+
end
|
45
|
+
```
|
46
|
+
|
47
|
+
### API access via POST method
|
48
|
+
|
49
|
+
```ruby
|
50
|
+
begin
|
51
|
+
result = client.execute(:api_name, arguments_as_hash, via: :post)
|
52
|
+
rescue SocialPlus::WebApi::ApiError => e
|
53
|
+
# handle exceptions
|
54
|
+
end
|
55
|
+
```
|
data/Rakefile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# :nodoc:
|
2
|
+
module SocialPlus
|
3
|
+
# :nodoc:
|
4
|
+
module WebApi
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
require 'social_plus/web_api/version'
|
9
|
+
require 'social_plus/web_api/api_error'
|
10
|
+
require 'social_plus/web_api/client'
|
11
|
+
require 'social_plus/web_api/user'
|
12
|
+
require 'social_plus/web_api/profile'
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
|
3
|
+
# :nodoc:
|
4
|
+
module SocialPlus
|
5
|
+
# :nodoc:
|
6
|
+
module WebApi
|
7
|
+
# An Exception class which wraps errors from SocialPlus Web API
|
8
|
+
class ApiError < StandardError
|
9
|
+
# @overload initialize(error)
|
10
|
+
# @param error [Hash] a Hash which represents an API error
|
11
|
+
# @option error [String] message the error message
|
12
|
+
# @option error [Integer] code the error code
|
13
|
+
def initialize(error)
|
14
|
+
super(error['message'])
|
15
|
+
@code = error['code']
|
16
|
+
end
|
17
|
+
|
18
|
+
# @return [Integer] the error code (API error code or HTTP status)
|
19
|
+
attr_reader :code
|
20
|
+
end
|
21
|
+
|
22
|
+
require 'social_plus/web_api/invalid_token'
|
23
|
+
require 'social_plus/web_api/http_response_error'
|
24
|
+
|
25
|
+
class ApiError < StandardError
|
26
|
+
EXCEPTION_CLASSES = Hash.new(ApiError).tap do |exception_classes|
|
27
|
+
exception_classes[4] = InvalidToken
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.exception_from_api_result(response, result)
|
31
|
+
if social_plus_error?(response, result)
|
32
|
+
error = result['error']
|
33
|
+
raise EXCEPTION_CLASSES[error['code']], error
|
34
|
+
else
|
35
|
+
raise HttpResponseError, response
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
def self.social_plus_error?(response, result)
|
41
|
+
case response
|
42
|
+
when Net::HTTPServerError, Net::HTTPClientError
|
43
|
+
result.key?('error') && %w(message code).all? { |key| result['error'].key?(key) }
|
44
|
+
else
|
45
|
+
false
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'uri'
|
3
|
+
require 'net/https'
|
4
|
+
|
5
|
+
require 'active_support/core_ext/object/to_query'
|
6
|
+
require 'active_support/core_ext/hash/except'
|
7
|
+
|
8
|
+
require 'social_plus/web_api/api_error'
|
9
|
+
require 'social_plus/web_api/invalid_token'
|
10
|
+
require 'social_plus/web_api/version'
|
11
|
+
|
12
|
+
# :nodoc:
|
13
|
+
module SocialPlus
|
14
|
+
# :nodoc:
|
15
|
+
module WebApi
|
16
|
+
# A class which wraps calls to Social Plus Web API
|
17
|
+
class Client
|
18
|
+
API_KEY_RE = /\A[0-9a-f]{40}\z/
|
19
|
+
private_constant :API_KEY_RE
|
20
|
+
|
21
|
+
# @param [String] api_key A Social Plus API key
|
22
|
+
# @raise [ArgumentError] when `api_key` is invalid
|
23
|
+
def initialize(api_key)
|
24
|
+
raise ArgumentError, 'invalid API key' unless API_KEY_RE =~ api_key
|
25
|
+
@api_key = api_key.freeze
|
26
|
+
freeze
|
27
|
+
end
|
28
|
+
|
29
|
+
# Executes a Social Plus Web API
|
30
|
+
#
|
31
|
+
# @param [String, Symbol] method An API method name
|
32
|
+
# @param [Hash] parameters Parameters to API except `key`
|
33
|
+
# @option parameters [Symbol] :via HTTP method(default `:get`)
|
34
|
+
# @return [Hash] a Hash generated by parsing the JSON returned from the API call, except `status`,
|
35
|
+
# just `{}` on parsing failure
|
36
|
+
# @raise [ApiError] when the API returns a status other than 200 OK
|
37
|
+
def execute(method, parameters={})
|
38
|
+
parameters = parameters.with_indifferent_access
|
39
|
+
http_method = parameters.delete(:via) || :get
|
40
|
+
response = request(http_method, method, parameters.merge(key: @api_key))
|
41
|
+
result = parse_as_json(response.body)
|
42
|
+
|
43
|
+
ApiError.exception_from_api_result(response, result) unless response.is_a?(Net::HTTPOK)
|
44
|
+
|
45
|
+
result.except('status')
|
46
|
+
end
|
47
|
+
|
48
|
+
SOCIAL_PLUS_FQDN = URI('https://api.socialplus.jp/')
|
49
|
+
private_constant :SOCIAL_PLUS_FQDN
|
50
|
+
|
51
|
+
USER_AGENT = 'SocialPlus Web API gem/%s' % VERSION
|
52
|
+
private_constant :USER_AGENT
|
53
|
+
|
54
|
+
private
|
55
|
+
def request(http_method, api_method, parameters)
|
56
|
+
uri = request_uri(api_method)
|
57
|
+
request = send("create_#{http_method.downcase}_request", uri.path, parameters)
|
58
|
+
Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
|
59
|
+
http.request(request)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def create_get_request(path, parameters)
|
64
|
+
Net::HTTP::Get.new(path + '?' + parameters.to_query, 'User-Agent' => USER_AGENT)
|
65
|
+
end
|
66
|
+
|
67
|
+
def create_post_request(path, parameters)
|
68
|
+
Net::HTTP::Post.new(path, 'User-Agent' => USER_AGENT).tap { |request| request.body = parameters.to_query }
|
69
|
+
end
|
70
|
+
|
71
|
+
def request_uri(method)
|
72
|
+
SOCIAL_PLUS_FQDN.dup.tap do |uri|
|
73
|
+
uri.path = '/api/%s' % method
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def parse_as_json(json_text)
|
78
|
+
json_text ||= '{}'
|
79
|
+
JSON.parse(json_text)
|
80
|
+
rescue JSON::ParserError
|
81
|
+
{}
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# :nodoc:
|
2
|
+
module SocialPlus
|
3
|
+
# :nodoc:
|
4
|
+
module WebApi
|
5
|
+
# An Exception class raised when SocialPlus Web API reports http response error
|
6
|
+
#
|
7
|
+
class HttpResponseError < ApiError
|
8
|
+
# @overload initialize(response)
|
9
|
+
# @param response [Net::HTTPResponse] HTTP Response (except 200 OK)
|
10
|
+
def initialize(response)
|
11
|
+
super(
|
12
|
+
'message' => response.message,
|
13
|
+
'code' => response.code.to_i
|
14
|
+
)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# :nodoc:
|
2
|
+
module SocialPlus
|
3
|
+
# :nodoc:
|
4
|
+
module WebApi
|
5
|
+
PREFECTURES = {
|
6
|
+
1 => '北海道',
|
7
|
+
2 => '青森県',
|
8
|
+
3 => '岩手県',
|
9
|
+
4 => '宮城県',
|
10
|
+
5 => '秋田県',
|
11
|
+
6 => '山形県',
|
12
|
+
7 => '福島県',
|
13
|
+
8 => '茨城県',
|
14
|
+
9 => '栃木県',
|
15
|
+
10 => '群馬県',
|
16
|
+
11 => '埼玉県',
|
17
|
+
12 => '千葉県',
|
18
|
+
13 => '東京都',
|
19
|
+
14 => '神奈川県',
|
20
|
+
15 => '新潟県',
|
21
|
+
16 => '富山県',
|
22
|
+
17 => '石川県',
|
23
|
+
18 => '福井県',
|
24
|
+
19 => '山梨県',
|
25
|
+
20 => '長野県',
|
26
|
+
21 => '岐阜県',
|
27
|
+
22 => '静岡県',
|
28
|
+
23 => '愛知県',
|
29
|
+
24 => '三重県',
|
30
|
+
25 => '滋賀県',
|
31
|
+
26 => '京都府',
|
32
|
+
27 => '大阪府',
|
33
|
+
28 => '兵庫県',
|
34
|
+
29 => '奈良県',
|
35
|
+
30 => '和歌山県',
|
36
|
+
31 => '鳥取県',
|
37
|
+
32 => '島根県',
|
38
|
+
33 => '岡山県',
|
39
|
+
34 => '広島県',
|
40
|
+
35 => '山口県',
|
41
|
+
36 => '徳島県',
|
42
|
+
37 => '香川県',
|
43
|
+
38 => '愛媛県',
|
44
|
+
39 => '高知県',
|
45
|
+
40 => '福岡県',
|
46
|
+
41 => '佐賀県',
|
47
|
+
42 => '長崎県',
|
48
|
+
43 => '熊本県',
|
49
|
+
44 => '大分県',
|
50
|
+
45 => '宮崎県',
|
51
|
+
46 => '鹿児島県',
|
52
|
+
47 => '沖縄県'
|
53
|
+
}
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,196 @@
|
|
1
|
+
require 'active_support/core_ext/hash/indifferent_access'
|
2
|
+
require 'active_support/core_ext/object/blank'
|
3
|
+
require 'active_support/core_ext/object/inclusion'
|
4
|
+
require 'active_support/core_ext/object/try'
|
5
|
+
require 'active_support/core_ext/string/conversions'
|
6
|
+
|
7
|
+
require 'social_plus/web_api/prefectures'
|
8
|
+
|
9
|
+
# :nodoc:
|
10
|
+
module SocialPlus
|
11
|
+
# :nodoc:
|
12
|
+
module WebApi
|
13
|
+
# rubocop: disable Metrics/ClassLength, Metrics/AbcSize
|
14
|
+
|
15
|
+
# A class which represents authenticated user's information(profile and email) obtained from Social Plus
|
16
|
+
class Profile
|
17
|
+
# rubocop: disable Metrics/MethodLength
|
18
|
+
|
19
|
+
# @param [Hash<String,Object>] params a user's information obtained from Social Plus.
|
20
|
+
# @option params [Hash] "profile" profile of a user
|
21
|
+
# @option params [Array] "email" email addresses of a user
|
22
|
+
|
23
|
+
def initialize(params)
|
24
|
+
params = params.with_indifferent_access
|
25
|
+
|
26
|
+
profile = params[:profile]
|
27
|
+
@full_name, @given_name, @family_name, @full_name_kana, @given_name_kana, @family_name_kana = extract_names(profile).freeze
|
28
|
+
@zip_code = profile[:postal_code]
|
29
|
+
@prefecture, @prefecture_name, @city, @location = extract_location(profile).freeze
|
30
|
+
@gender = profile[:gender].in?([1, 2]) ? profile[:gender] : nil
|
31
|
+
@urls = profile[:uri].respond_to?(:map) ? filter_http_urls(profile[:uri]) : []
|
32
|
+
@birthday = /\A\d{4}-\d{2}-\d{2}\z/ =~ profile[:birthday] ? profile[:birthday].try(:to_date).freeze : nil
|
33
|
+
|
34
|
+
emails = params[:email]
|
35
|
+
@emails = emails && emails.respond_to?(:map) ? emails.map { |email| email[:email].freeze }.compact.freeze : []
|
36
|
+
|
37
|
+
freeze
|
38
|
+
end
|
39
|
+
# rubocop: enable Metrics/MethodLength
|
40
|
+
|
41
|
+
# @return [String] Returns the user's full name
|
42
|
+
attr_reader :full_name
|
43
|
+
|
44
|
+
# @return [String] Returns the user's family name
|
45
|
+
attr_reader :family_name
|
46
|
+
|
47
|
+
# @return [String] Returns the user's given name
|
48
|
+
attr_reader :given_name
|
49
|
+
|
50
|
+
# @return [String] Returns the user's full name in kana
|
51
|
+
attr_reader :full_name_kana
|
52
|
+
|
53
|
+
# @return [String] Returns the user's family name in kana
|
54
|
+
attr_reader :family_name_kana
|
55
|
+
|
56
|
+
# @return [String] Returns the user's given name in kana
|
57
|
+
attr_reader :given_name_kana
|
58
|
+
|
59
|
+
# @return [String] Returns the zip code of user's address
|
60
|
+
attr_reader :zip_code
|
61
|
+
|
62
|
+
# @return [Integer] Returns the prefecture code of user's address
|
63
|
+
attr_reader :prefecture
|
64
|
+
|
65
|
+
# @return [String] Returns the name of prefecture of user's address
|
66
|
+
attr_reader :prefecture_name
|
67
|
+
|
68
|
+
# @return [Integer] Returns the city code of user's address
|
69
|
+
attr_reader :city
|
70
|
+
|
71
|
+
# @return [String] Returns the rest of user's address
|
72
|
+
attr_reader :location
|
73
|
+
|
74
|
+
# @return [Date] Returns the user's birthday
|
75
|
+
attr_reader :birthday
|
76
|
+
|
77
|
+
# @return [Array<URI>] Returns the user's URLs
|
78
|
+
attr_reader :urls
|
79
|
+
|
80
|
+
# @return [Integer] Returns the user's gender
|
81
|
+
attr_reader :gender
|
82
|
+
|
83
|
+
# @return [Array<String>] Returns the user's E-Mail addresses
|
84
|
+
attr_reader :emails
|
85
|
+
|
86
|
+
private
|
87
|
+
|
88
|
+
def filter_http_urls(uris)
|
89
|
+
uris.map { |uri_string| URI(uri_string).freeze rescue nil }.select { |url| url.try(:scheme).in?(%w(http https)) }.freeze
|
90
|
+
end
|
91
|
+
|
92
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength
|
93
|
+
|
94
|
+
# @return [Array] Returns Array of full name, given name, family name, full name in kana, given name in kana and family name in kana
|
95
|
+
def extract_names(profile)
|
96
|
+
full_name_kanji = profile[:full_name_kanji] || ''
|
97
|
+
last_name_kanji = profile[:last_name_kanji] || ''
|
98
|
+
first_name_kanji = profile[:first_name_kanji] || ''
|
99
|
+
|
100
|
+
full_name_kana = profile[:full_name_kana] || ''
|
101
|
+
last_name_kana = profile[:last_name_kana] || ''
|
102
|
+
first_name_kana = profile[:first_name_kana] || ''
|
103
|
+
|
104
|
+
full_name = profile[:full_name] || ''
|
105
|
+
last_name = profile[:last_name] || ''
|
106
|
+
first_name = profile[:first_name] || ''
|
107
|
+
user_name = profile[:user_name] || ''
|
108
|
+
|
109
|
+
# NOTE: "".present? #=> false
|
110
|
+
|
111
|
+
# *: set
|
112
|
+
# -: not set
|
113
|
+
# : no care
|
114
|
+
# full(K) | last(K) | first(K) | full | last | first | user |
|
115
|
+
# #1 ******* | ******* | ******** | | | | |
|
116
|
+
# #1 ******* | ******* | -------- | | | | |
|
117
|
+
# #1 ******* | ------- | ******** | | | | |
|
118
|
+
# #1' | | | **** | **** | ***** | |
|
119
|
+
# #1' | | | **** | **** | ----- | |
|
120
|
+
# #1' | | | **** | ---- | ***** | |
|
121
|
+
# #2 ------- | ******* | ******** | | | | |
|
122
|
+
# #2 ------- | ******* | -------- | | | | |
|
123
|
+
# #2 ------- | ------- | ******** | | | | |
|
124
|
+
# #2' | | | ---- | **** | ***** | |
|
125
|
+
# #2' | | | ---- | **** | ----- | |
|
126
|
+
# #2' | | | ---- | ---- | ***** | |
|
127
|
+
# #3 ******* | ------- | -------- | | | | |
|
128
|
+
# #3' | | | **** | ---- | ----- | |
|
129
|
+
# #4 ------- | ------- | -------- | ---- | ---- | ----- | **** |
|
130
|
+
# #5 ------- | ------- | -------- | ---- | ---- | ----- | ---- |
|
131
|
+
|
132
|
+
# #1
|
133
|
+
if full_name_kanji.present? && (last_name_kanji.present? || first_name_kanji.present?)
|
134
|
+
names = [ full_name_kanji, first_name_kanji, last_name_kanji ]
|
135
|
+
# #1'
|
136
|
+
elsif full_name.present? && (last_name.present? || first_name.present?)
|
137
|
+
names = [ full_name, first_name, last_name ]
|
138
|
+
# #2
|
139
|
+
elsif last_name_kanji.present? || first_name_kanji.present?
|
140
|
+
names = [ [last_name_kanji, first_name_kanji].join(' ').strip, first_name_kanji, last_name_kanji ]
|
141
|
+
# #2'
|
142
|
+
elsif last_name.present? || first_name.present?
|
143
|
+
names = [ [last_name, first_name].join(' ').strip, first_name, last_name ]
|
144
|
+
# #3
|
145
|
+
elsif full_name_kanji.present?
|
146
|
+
names = [ full_name_kanji, '', full_name_kanji ]
|
147
|
+
# #3'
|
148
|
+
elsif full_name.present?
|
149
|
+
names = [ full_name, '', full_name ]
|
150
|
+
# #4
|
151
|
+
elsif user_name.present?
|
152
|
+
names = [ user_name, '', '' ]
|
153
|
+
# #5
|
154
|
+
else
|
155
|
+
names = [ '', '', '' ]
|
156
|
+
end
|
157
|
+
|
158
|
+
if full_name_kana.present? && (last_name_kana.present? || first_name_kana.present?)
|
159
|
+
kana = [ full_name_kana, first_name_kana, last_name_kana ]
|
160
|
+
elsif last_name_kana.present? || first_name_kana.present?
|
161
|
+
kana = [ [last_name_kana, first_name_kana].join(' ').strip, first_name_kana, last_name_kana ]
|
162
|
+
elsif full_name_kana.present?
|
163
|
+
kana = [ full_name_kana, '', full_name_kana ]
|
164
|
+
else
|
165
|
+
kana = [ '', '', '' ]
|
166
|
+
end
|
167
|
+
|
168
|
+
names + kana
|
169
|
+
end
|
170
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength
|
171
|
+
|
172
|
+
# @return [Array] Returns prefecture code, prefecture_name, city code and location(rest of the address)
|
173
|
+
def extract_location(profile)
|
174
|
+
location = profile[:location].presence || ''
|
175
|
+
|
176
|
+
city_code = city_code(profile)
|
177
|
+
prefecture_code = city_code ? city_code_to_prefecture_code(city_code) : nil
|
178
|
+
return [ nil, '', nil, location ] unless city_code && prefecture_code
|
179
|
+
|
180
|
+
prefecture_name = PREFECTURES[prefecture_code]
|
181
|
+
location_without_prefecture = location.sub(/\A#{prefecture_name}/, '')
|
182
|
+
[ prefecture_code, prefecture_name, city_code, location_without_prefecture ]
|
183
|
+
end
|
184
|
+
|
185
|
+
def city_code(profile)
|
186
|
+
profile[:location_jis_id].to_i.presence
|
187
|
+
end
|
188
|
+
|
189
|
+
def city_code_to_prefecture_code(city_code)
|
190
|
+
code = city_code / 1000
|
191
|
+
PREFECTURES.key?(code) ? code : nil
|
192
|
+
end
|
193
|
+
end
|
194
|
+
# rubocop: enable Metrics/ClassLength
|
195
|
+
end
|
196
|
+
end
|