naver-sdk 0.4.0 → 0.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 169e8f3de0474b1aafd74629d97c606f721bf728
4
- data.tar.gz: f4d679fdf11f3287b42c3917fac0ae6c37f11127
3
+ metadata.gz: d16fe3d0b77daf05e8f77f8e5caa2d42aac547e5
4
+ data.tar.gz: ccb0b9772ebf335765d967f0f5caf81e0dd52a4d
5
5
  SHA512:
6
- metadata.gz: 29b617d3bf7793a577969d2d025741c0a115cddc42a0b36041eb616d9f8bf73bda3feb685c87a655381fc2f56be99da314118e18552e3019a22e057179bfd98f
7
- data.tar.gz: 57a587e7e8851029f32066856cd54c2f3d3fea3ad52409e15d2e6542fe77c05a82eff12b051200fa5c38578ff1646ce61e4eaf0d45c1dbeba9eb5001355a97f3
6
+ metadata.gz: 3380b8d54040b9838c56551fe04a1fc38237a1e6d16903fecec117ba3264c03a98d44b930c89401a2d9b2dfd4dcb28456ac32ecb324e9951e61259eaa7620ea4
7
+ data.tar.gz: 398dfd1d1342c8072fc2d39d223095cb5cd6d3496fbc0ce37e38549ddd17010660d44d1db0c1e65445d7580b2455ba0ecd5ef6ff16461d03fe94b58f158e2251
@@ -2,7 +2,10 @@
2
2
  All notable changes to this project will be documented in this file.
3
3
 
4
4
  ## [unreleased]
5
- - No significant changes.
5
+
6
+ ## [0.5.0] - 2017-07-09
7
+ - improve configration
8
+ - core_ext/hash/keys
6
9
 
7
10
  ## [0.4.0] - 2017-06-26
8
11
  - [breaking] JSON 출력 결과를 CamelCase 에서 underscore 변경
@@ -28,4 +31,5 @@ All notable changes to this project will be documented in this file.
28
31
  [0.2.0]: https://github.com/kimsuelim/naver-sdk-ruby/compare/v0.1.0...v0.2.0
29
32
  [0.3.0]: https://github.com/kimsuelim/naver-sdk-ruby/compare/v0.2.0...v0.3.0
30
33
  [0.4.0]: https://github.com/kimsuelim/naver-sdk-ruby/compare/v0.3.0...v0.4.0
31
- [unreleased]: https://github.com/kimsuelim/naver-sdk-ruby/compare/v0.4.0...HEAD
34
+ [0.5.0]: https://github.com/kimsuelim/naver-sdk-ruby/compare/v0.4.0...v0.5.0
35
+ [unreleased]: https://github.com/kimsuelim/naver-sdk-ruby/compare/v0.5.0...HEAD
data/README.md CHANGED
@@ -1,10 +1,10 @@
1
- # NAVER SDK for Ruby
1
+ # 네이버 루비 SDK (NAVER SDK for Ruby)
2
2
 
3
3
  [![Build Status](https://travis-ci.org/kimsuelim/naver-sdk-ruby.svg?branch=master)](https://travis-ci.org/kimsuelim/naver-sdk-ruby)
4
4
  [![Coverage Status](https://coveralls.io/repos/github/kimsuelim/naver-sdk-ruby/badge.svg?branch=master)](https://coveralls.io/github/kimsuelim/naver-sdk-ruby?branch=master)
5
5
  [![Gem Version](https://badge.fury.io/rb/naver-sdk.svg)](https://badge.fury.io/rb/naver-sdk)
6
6
 
7
- A ruby client for the NAVER API. [https://developers.naver.com](https://developers.naver.com)
7
+ 네이버 오픈API 루비 클라이언트 (A ruby client for the NAVER API)
8
8
 
9
9
  ## Links of Interest
10
10
 
@@ -145,15 +145,15 @@ puts response.items[0].name
145
145
  response = Naver::Papago.translate(
146
146
  source: "ko",
147
147
  target: "en",
148
- text: "기술이 인간을 대체하는 것이 아니라 인간은 기술의 도움으로 더욱 창조적으로 것이라는 믿는다."
148
+ text: "기술은 사람을 대체하는 것이 아니라 기술의 도움으로 사람을 창조적으로 만들 것이라 믿는다."
149
149
  )
150
150
  # => #<Naver::ObjectifiedHash:70362563050680 {hash: {
151
- "translated_text"=>"To replace the technology not believe that humans are more creatively with the help of technology."
151
+ "translated_text"=>"It is to replace the technology is more creative with the help of technology, not believe that it would make."
152
152
  }
153
153
  }
154
154
 
155
155
  puts response.translated_text
156
- # => "To replace the technology not believe that humans are more creatively with the help of technology."
156
+ # => "It is to replace the technology is more creative with the help of technology, not believe that it would make."
157
157
  ```
158
158
 
159
159
  ## 지도
@@ -162,7 +162,6 @@ puts response.translated_text
162
162
 
163
163
  ```ruby
164
164
  response = Naver::Map.geocode(query: "불정로 6")
165
- # => <Naver::ObjectifiedHash:70145842773600 {hash: {:total=>1, :userquery=>"불정로 6", :items=>[{:address=>"경기도 성남시 분당구 불정로 6 NAVER그린팩토리", :addrdetail=>{:country=>"대한민국", :sido=>"경기도", :sigugun=>"성남시 분당구", :dongmyun=>"불정로", :rest=>" 6 NAVER그린팩토리"}, :is_road_address=>true, :point=>{:x=>127.1052133, :y=>37.3595316}}]}}
166
165
  # => [#<Naver::ObjectifiedHash:70284981985920 {hash: {
167
166
  "address"=>"경기도 성남시 분당구 불정로 6 NAVER그린팩토리",
168
167
  "addrdetail"=>{"country"=>"대한민국", "sido"=>"경기도", "sigugun"=>"성남시 분당구", "dongmyun"=>"불정로", "rest"=>" 6 NAVER그린팩토리"},
data/Rakefile CHANGED
@@ -7,4 +7,4 @@ Rake::TestTask.new(:test) do |t|
7
7
  t.test_files = FileList["test/**/*_test.rb"]
8
8
  end
9
9
 
10
- task :default => :test
10
+ task default: :test
@@ -10,10 +10,10 @@ module Naver # :nodoc:
10
10
  # Converts the response body to an ObjectifiedHash.
11
11
  def self.parse(body)
12
12
  if body.is_a?(Hash)
13
- body = body.to_underscore_keys
13
+ body = body.deep_underscore_keys
14
14
  ObjectifiedHash.new(body)
15
15
  elsif body.is_a?(Array)
16
- body = body.to_underscore_keys
16
+ body = body.deep_underscore_keys
17
17
  body.collect! { |e| ObjectifiedHash.new(e) }
18
18
  elsif body
19
19
  true
@@ -0,0 +1,30 @@
1
+ module Naver
2
+ # Defines constants and methods related to configuration.
3
+ module Configration
4
+ # An array of valid keys in the options hash when configuring a Naver::Client.
5
+ OPTION_KEYS = [:client_id, :client_secret, :redirect_uri, :timeout, :debug].freeze
6
+
7
+ # The user agent that will be sent to the API endpoint if none is set.
8
+ DEFAULT_USER_AGENT = "NAVER Ruby SDK Gem #{Naver::Sdk::VERSION}".freeze
9
+
10
+ # Base URI for the NAVER API.
11
+ DEFAULT_API_BASE_URI = "https://openapi.naver.com".freeze
12
+
13
+ # Base URI for NAVER OAuth.
14
+ DEFAULT_OAUTH_BASE_URI = "https://nid.naver.com".freeze
15
+
16
+ attr_accessor *OPTION_KEYS
17
+
18
+ # Convenience method to allow configuration options to be set in a block.
19
+ def configure
20
+ yield(self)
21
+ end
22
+
23
+ # Creates a hash of options and their values.
24
+ def options
25
+ options = {}
26
+ OPTION_KEYS.each { |key| options[key] = send(key) }
27
+ options
28
+ end
29
+ end
30
+ end
@@ -1,17 +1,12 @@
1
1
  module Naver
2
2
  class Connection
3
- # Base URI for the NAVER API..
4
- DEFAULT_API_BASE_URI = "https://openapi.naver.com"
5
-
6
3
  # Create a Connection object.
7
- # @param api_base_uri [String] Base URI at which to make API calls.
8
- def initialize(api_base_uri: DEFAULT_API_BASE_URI)
4
+ def initialize
9
5
  @client_id = Naver.client_id
10
6
  @client_secret = Naver.client_secret
11
- @api_base_uri = api_base_uri
12
-
13
- headers = { user_agent: "NAVER Ruby SDK Gem #{ Naver::Sdk::VERSION}" }
14
- @connection = Faraday.new(url: @api_base_uri, headers: headers) do |faraday|
7
+ @api_base_uri = Configration::DEFAULT_API_BASE_URI
8
+ @headers = { user_agent: Configration::DEFAULT_USER_AGENT }
9
+ @connection = Faraday.new(url: @api_base_uri, headers: @headers) do |faraday|
15
10
  faraday.request :multipart
16
11
  faraday.request :url_encoded
17
12
  faraday.response :logger if Naver.debug
@@ -50,14 +45,14 @@ module Naver
50
45
  private
51
46
 
52
47
  def request(verb, path, params = {})
53
- raise ArgumentError.new "Invalid http verb #{verb}" if ![:get, :post, :put, :delete].include?(verb)
48
+ raise ArgumentError.new "Invalid http verb #{verb}" unless [:get, :post, :put, :delete].include?(verb)
54
49
 
55
50
  response = @connection.run_request(verb, path, params, public_auth_header) do |request|
56
51
  request.params.update(params) if verb == :get && params
57
52
  yield(request) if block_given?
58
53
  end
59
54
 
60
- if !(200..299).include?(response.status)
55
+ unless (200..299).include?(response.status)
61
56
  body = JSON.parse(response.body)
62
57
  raise Naver::Error.new(body)
63
58
  end
@@ -0,0 +1,116 @@
1
+ class Hash
2
+ # Returns a new hash with all keys converted to underscore strings.
3
+ #
4
+ # hash = { firstName: "Rob", lastName: "Bob" }
5
+ #
6
+ # hash.underscore_keys
7
+ # # => {:first_name=>"Rob", :last_name=>"Bob"}
8
+ def underscore_keys
9
+ transform_keys { |key| underscore_key(key) }
10
+ end
11
+
12
+ # Returns a new hash with all keys converted to camelcase strings.
13
+ #
14
+ # hash = { first_name: "Rob", last_name: "Bob" }
15
+ #
16
+ # hash.camelize_keys
17
+ # # => {:firstName=>"Rob", :lastName=>"Bob"}
18
+ def camelize_keys
19
+ transform_keys { |key| camelize_key(key) }
20
+ end
21
+
22
+ # Returns a new hash with all keys converted to underscore strings.
23
+ # This includes the keys from the root hash and from all
24
+ # nested hashes and arrays.
25
+ #
26
+ # hash = { person: { firstName: "Rob", lastName: "Bob" } }
27
+ #
28
+ # hash.deep_underscore_keys
29
+ # # => {:person=>{:first_name=>"Rob", :last_name=>"Bob"}}
30
+ def deep_underscore_keys
31
+ deep_transform_keys_in_object(self) { |key| underscore_key(key) }
32
+ end
33
+
34
+ # Returns a new hash with all keys converted to camelcase strings.
35
+ # This includes the keys from the root hash and from all
36
+ # nested hashes and arrays.
37
+ #
38
+ # hash = { person: { first_name: "Rob", last_name: "Bob" } }
39
+ #
40
+ # hash.deep_camelize_keys
41
+ # # => {:person=>{:firstName=>"Rob", :lastName=>"Bob"}}
42
+ def deep_camelize_keys
43
+ deep_transform_keys_in_object(self) { |key| camelize_key(key) }
44
+ end
45
+
46
+ private
47
+
48
+ # Returns a new hash with all keys converted using the +block+ operation.
49
+ def transform_keys
50
+ return enum_for(:transform_keys) { size } unless block_given?
51
+ result = {}
52
+ each_key do |key|
53
+ result[yield(key)] = self[key]
54
+ end
55
+ result
56
+ end
57
+
58
+ # support methods for deep transforming nested hashes and arrays
59
+ def deep_transform_keys_in_object(object, &block)
60
+ case object
61
+ when Array
62
+ object.map { |e| deep_transform_keys_in_object(e, &block) }
63
+ when Hash
64
+ object.each_with_object({}) do |(key, value), result|
65
+ result[yield(key)] = deep_transform_keys_in_object(value, &block)
66
+ end
67
+ # Hash[object.map { |key, value| [yield(key), deep_transform_keys_in_object(value, &block)] }]
68
+ else
69
+ object
70
+ end
71
+ end
72
+
73
+ def underscore_key(key)
74
+ if key.is_a?(Symbol)
75
+ underscore(key.to_s).to_sym
76
+ elsif key.is_a?(String)
77
+ underscore(key)
78
+ else
79
+ key
80
+ end
81
+ end
82
+
83
+ def underscore(camel_cased_word)
84
+ return camel_cased_word unless camel_cased_word =~ /[A-Z-]|::/
85
+ word = camel_cased_word.to_s.gsub("::".freeze, "/".freeze)
86
+ word.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2'.freeze)
87
+ word.gsub!(/([a-z\d])([A-Z])/, '\1_\2'.freeze)
88
+ word.tr!("-".freeze, "_".freeze)
89
+ word.downcase!
90
+ word
91
+ end
92
+
93
+ def camelize_key(key)
94
+ if key.is_a?(Symbol)
95
+ camelize(key.to_s, :lower).to_sym
96
+ elsif key.is_a?(String)
97
+ camelize(key, :lower)
98
+ else
99
+ key
100
+ end
101
+ end
102
+
103
+ def camelize(underscore_word, first_letter = :upper)
104
+ word = underscore_word.to_s
105
+ case first_letter
106
+ when :upper
107
+ word = word.sub(/^[a-z\d]*/) { $&.capitalize }
108
+ when :lower
109
+ word = word.sub(/^(?:(?=\b|[A-Z_])|\w)/) { $&.downcase }
110
+ end
111
+
112
+ word.gsub!(/(?:_|(\/))([a-z\d]*)/) { "#{$1}#{$2.capitalize}" }
113
+ word.gsub!(/\//, "::".freeze)
114
+ word
115
+ end
116
+ end
@@ -2,18 +2,25 @@ module Naver # :nodoc:
2
2
  # Naver Map API
3
3
  class Map < Client
4
4
  class << self
5
- # 주소 -> 좌표 변환
5
+ # 주소를 좌표로 변환
6
6
  # @param params [Hash] Params for the search
7
7
  def geocode(params = {})
8
8
  parse(JSON.parse(connection.get("/v1/map/geocode", params).body)["result"])
9
9
  end
10
10
 
11
- # 좌표 -> 주소 변환
11
+ # 좌표를 주소로 변환
12
12
  # @param params [Hash] Params for the search
13
13
  def reverse_geocode(params = {})
14
14
  params = { query: "#{params[:lat]}, #{params[:lng]}" }
15
15
  parse(JSON.parse(connection.get("/v1/map/reversegeocode", params).body)["result"])
16
16
  end
17
+
18
+ # StaticMap
19
+ # 지정된 좌표의 네이버 지도 이미지를 출력
20
+ # @param params [Hash] Params for the search
21
+ def static_map(params = {})
22
+ connection.get("/v1/map/staticmap.bin", params).body
23
+ end
17
24
  end
18
25
  end
19
26
  end
@@ -1,18 +1,14 @@
1
1
  module Naver
2
2
  class Oauth
3
- # Base URI for NAVER OAuth.
4
- # DEFAULT_OAUTH_BASE_URI = "https://nid.naver.com/oauth2.0"
5
- DEFAULT_OAUTH_BASE_URI = "https://nid.naver.com"
6
-
7
- # Create a Oauth object.
8
- # @param oauth_base_uri [String] Base URI at which to make API calls.
9
- def initialize(oauth_base_uri: DEFAULT_OAUTH_BASE_URI, redirect_uri: Naver.redirect_uri)
3
+ # Create a OAuth object.
4
+ # @param redirect_uri [String] OAuth redirect_uri
5
+ def initialize(redirect_uri: Naver.redirect_uri)
10
6
  @client_id = Naver.client_id
11
7
  @client_secret = Naver.client_secret
12
- @oauth_base_uri = oauth_base_uri
8
+ @oauth_base_uri = Configration::DEFAULT_OAUTH_BASE_URI
13
9
  @redirect_uri = redirect_uri
14
10
 
15
- headers = { user_agent: "NAVER Ruby SDK Gem #{ Naver::Sdk::VERSION}" }
11
+ headers = { user_agent: Configration::DEFAULT_USER_AGENT }
16
12
  @oauth = OAuth2::Client.new(@client_id, @client_secret, site: @oauth_base_uri, authorize_url: "/oauth2.0/authorize", token_url: "/oauth2.0/token", headers: headers) do |http|
17
13
  http.request :multipart
18
14
  http.request :url_encoded
@@ -60,9 +56,8 @@ module Naver
60
56
  private
61
57
 
62
58
  def refresh_token!
63
- return if !@oauth_token.expired?
59
+ return unless @oauth_token.expired?
64
60
  @oauth_token = @oauth_token.refresh_token
65
61
  end
66
62
  end
67
63
  end
68
-
@@ -6,7 +6,7 @@ module Naver # :nodoc:
6
6
  # @param source [String] 번역 소스 텍스트의 언어 설정: (ko:한국어, en:영어, ja:일본어, zh-CN:중국어(간체), zh-TW:중국어(번체)
7
7
  # @param target [String] 번역 대상 언어, 가능한 값은 source 파라미터와 동일
8
8
  # @param text [String] 번역할 문장이며 UTF-8만 지원
9
- # @return [Hash] 번역된 문장
9
+ # @return [ObjectifiedHash] 번역된 문장
10
10
  def translate(source:, target:, text:)
11
11
  params = method(__method__).parameters.map(&:last).map { |p| [p, eval(p.to_s)] }.to_h
12
12
  parse(JSON.parse(connection.post("/v1/language/translate", params).body)["message"]["result"])
@@ -14,7 +14,7 @@ module Naver # :nodoc:
14
14
 
15
15
  # 한글인명 - 로마자 변환
16
16
  # @param query [String] 로마자로 바꾸려는 한글 이름
17
- # @return [Hash] 변환 결과
17
+ # @return [ObjectifiedHash] 변환 결과
18
18
  def romanization(query:)
19
19
  params = { query: query }
20
20
  result = JSON.parse(connection.get("/v1/krdict/romanization", params).body)["aResult"][0]
@@ -2,8 +2,8 @@ require "oauth2"
2
2
  require "faraday"
3
3
 
4
4
  require "naver/sdk/version"
5
- require "naver/ext/hash/to_underscore_keys"
6
- require "naver/config"
5
+ require "naver/core_ext/hash/keys"
6
+ require "naver/configration"
7
7
  require "naver/connection"
8
8
  require "naver/client"
9
9
  require "naver/error"
@@ -20,8 +20,5 @@ require "naver/vision"
20
20
  require "naver/voice"
21
21
 
22
22
  module Naver
23
- extend Config
24
-
25
- module Sdk
26
- end
23
+ extend Configration
27
24
  end
@@ -1,5 +1,5 @@
1
1
  module Naver
2
2
  module Sdk
3
- VERSION = "0.4.0"
3
+ VERSION = "0.5.0".freeze
4
4
  end
5
5
  end
@@ -11,7 +11,7 @@ module Naver # :nodoc:
11
11
  # Search > News (검색 > 뉴스)
12
12
  # @param params [Hash] Params for the search
13
13
  def news(params = {})
14
- parse(JSON.parse(connection.get("/v1/search/news", params).body))
14
+ parse(JSON.parse(connection.get("/v1/search/news", params).body))
15
15
  end
16
16
 
17
17
  # Search > Book (검색 > 책)
@@ -4,7 +4,7 @@ module Naver # :nodoc:
4
4
  class << self
5
5
  # 유명인 얼굴인식(Beta)
6
6
  # @param image [Binary] 얼굴이 포함된 이미지 (최대 2MB)
7
- # @return [Hash] 인식결과
7
+ # @return [ObjectifiedHash] 인식결과
8
8
  def celebrity(image:)
9
9
  params = {}
10
10
  params[:image] = Faraday::UploadIO.new(image, "image/jpeg")
@@ -13,7 +13,7 @@ module Naver # :nodoc:
13
13
 
14
14
  # 얼굴 감지(Beta)
15
15
  # @param image [Binary] 얼굴이 포함된 이미지 (최대 2MB)
16
- # @return [Hash] 인식결과
16
+ # @return [ObjectifiedHash] 인식결과
17
17
  def face(image:)
18
18
  params = {}
19
19
  params[:image] = Faraday::UploadIO.new(image, "image/jpeg")
@@ -21,6 +21,8 @@ Gem::Specification.new do |spec|
21
21
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
22
  spec.require_paths = ["lib"]
23
23
 
24
+ spec.required_ruby_version = ">= 2.2.2"
25
+
24
26
  spec.add_dependency "faraday", [">= 0.8", "< 1.0"]
25
27
  spec.add_dependency "oauth2", "~> 1.0"
26
28
 
@@ -28,5 +30,5 @@ Gem::Specification.new do |spec|
28
30
  spec.add_development_dependency "rake", "~> 10.0"
29
31
  spec.add_development_dependency "minitest", "~> 5.0"
30
32
  spec.add_development_dependency "rubocop", "~> 0.49.0"
31
- spec.add_development_dependency "coveralls", '~> 0.8.21'
33
+ spec.add_development_dependency "coveralls", "~> 0.8.21"
32
34
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: naver-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Surim Kim
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-06-26 00:00:00.000000000 Z
11
+ date: 2017-07-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -133,10 +133,10 @@ files:
133
133
  - bin/console
134
134
  - bin/setup
135
135
  - lib/naver/client.rb
136
- - lib/naver/config.rb
136
+ - lib/naver/configration.rb
137
137
  - lib/naver/connection.rb
138
+ - lib/naver/core_ext/hash/keys.rb
138
139
  - lib/naver/error.rb
139
- - lib/naver/ext/hash/to_underscore_keys.rb
140
140
  - lib/naver/map.rb
141
141
  - lib/naver/oauth.rb
142
142
  - lib/naver/objectified_hash.rb
@@ -162,7 +162,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
162
162
  requirements:
163
163
  - - ">="
164
164
  - !ruby/object:Gem::Version
165
- version: '0'
165
+ version: 2.2.2
166
166
  required_rubygems_version: !ruby/object:Gem::Requirement
167
167
  requirements:
168
168
  - - ">="
@@ -1,24 +0,0 @@
1
- module Naver
2
- module Config
3
- OPTION_KEYS = [
4
- :client_id,
5
- :client_secret,
6
- :redirect_uri,
7
- :timeout,
8
- :debug
9
- ]
10
-
11
- attr_accessor *OPTION_KEYS
12
-
13
- def configure
14
- yield self
15
- self
16
- end
17
-
18
- def options
19
- options = {}
20
- OPTION_KEYS.each{ |key| options[key] = send(key) }
21
- options
22
- end
23
- end
24
- end
@@ -1,40 +0,0 @@
1
- # Hash.to_underscore_keys
2
- class Hash
3
- # Recursively converts CamelCase hash keys to underscore
4
- def to_underscore_keys(value = self)
5
- case value
6
- when Array
7
- value.map { |v| to_underscore_keys(v) }
8
- when Hash
9
- underscore_hash(value)
10
- else
11
- value
12
- end
13
- end
14
-
15
- private
16
-
17
- def underscore_hash(value)
18
- Hash[value.map { |k, v| [underscore_key(k), to_underscore_keys(v)] }]
19
- end
20
-
21
- def underscore_key(key)
22
- if key.is_a?(Symbol)
23
- underscore(key.to_s).to_sym
24
- elsif key.is_a?(String)
25
- underscore(key)
26
- else
27
- key # can't snakify anything except strings and symbols
28
- end
29
- end
30
-
31
- def underscore(camel_cased_word)
32
- return camel_cased_word unless camel_cased_word =~ /[A-Z-]|::/
33
- word = camel_cased_word.to_s.gsub("::".freeze, "/".freeze)
34
- word.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2'.freeze)
35
- word.gsub!(/([a-z\d])([A-Z])/, '\1_\2'.freeze)
36
- word.tr!("-".freeze, "_".freeze)
37
- word.downcase!
38
- word
39
- end
40
- end