camel_snake_keys 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 +4 -0
- data/.rubocop.yml +1164 -0
- data/Gemfile +3 -0
- data/README.md +25 -0
- data/Rakefile +18 -0
- data/camel_snake.gemspec +24 -0
- data/lib/camel_snake_keys.rb +61 -0
- data/lib/version.rb +7 -0
- data/spec/lib/camel_snake_keys_spec.rb +42 -0
- data/spec/test_helper.rb +5 -0
- metadata +84 -0
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# camel_snake_keys
|
2
|
+
|
3
|
+
Add recursive with_snake_keys and with_camel_keys to Enumerable without converting everything into a string.
|
4
|
+
|
5
|
+
## Documentation
|
6
|
+
|
7
|
+
Add gem 'camel_snake_keys' to your gemfile or gem install camel_snake_keys.
|
8
|
+
|
9
|
+
Enumerables will be monkey patched the following methods:
|
10
|
+
|
11
|
+
with_snake_keys(with_indifferent=false)
|
12
|
+
with_camel_keys(with_indifferent=false)
|
13
|
+
|
14
|
+
If with_indifference is set to a true value hashes will be returned as ActiveSupport's HashWithIndifferentAccess.
|
15
|
+
|
16
|
+
```
|
17
|
+
require './lib/camel_snake_keys'
|
18
|
+
|
19
|
+
{fooBar: "Frob"}.with_snake_keys
|
20
|
+
=> {:foo_bar=>"Frob"}
|
21
|
+
|
22
|
+
[{:foo_bar=>"Frob"}].with_camel_keys
|
23
|
+
=> [{fooBar: "Frob"}]
|
24
|
+
```
|
25
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'CamelSnakeKeys'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.rdoc')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
Bundler::GemHelper.install_tasks
|
18
|
+
|
data/camel_snake.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
$:.push File.expand_path("../lib", __FILE__)
|
2
|
+
|
3
|
+
# Maintain your gem's version:
|
4
|
+
require "version"
|
5
|
+
|
6
|
+
# Describe your gem and declare its dependencies:
|
7
|
+
Gem::Specification.new do |s|
|
8
|
+
s.name = "camel_snake_keys"
|
9
|
+
s.version = CamelSnakeKeys::VERSION
|
10
|
+
s.authors = ["Josh Buermann"]
|
11
|
+
s.email = ["buermann@gmail.com"]
|
12
|
+
s.homepage = "https://github.com/buermann/camel_snake_keys"
|
13
|
+
s.summary = "Convert nested data structure hash keys between camel and snake case."
|
14
|
+
s.description = ""
|
15
|
+
s.license = "MIT"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n").sort
|
18
|
+
s.test_files = `git ls-files -- spec/*`.split("\n")
|
19
|
+
|
20
|
+
s.required_ruby_version = '~> 2.0'
|
21
|
+
s.add_dependency "activesupport"
|
22
|
+
|
23
|
+
s.add_development_dependency "rspec-rails", '>= 3.0'
|
24
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'active_support/core_ext/hash'
|
2
|
+
require 'active_support/core_ext/string/inflections'
|
3
|
+
|
4
|
+
module CamelSnakeKeys
|
5
|
+
class << self
|
6
|
+
def if_underscore(v)
|
7
|
+
if v.is_a? Symbol
|
8
|
+
v.to_s.underscore.to_sym
|
9
|
+
elsif v.is_a? String
|
10
|
+
v.underscore
|
11
|
+
else
|
12
|
+
v
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def if_camelize(v)
|
17
|
+
if v.is_a? Symbol
|
18
|
+
v.to_s.camelize(:lower).to_sym
|
19
|
+
elsif v.is_a? String
|
20
|
+
v.camelize(:lower)
|
21
|
+
else
|
22
|
+
v
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def snake_keys(data, indifference=false)
|
27
|
+
if data.kind_of? Array
|
28
|
+
data.map { |v| snake_keys(v) }
|
29
|
+
elsif data.kind_of? HashWithIndifferentAccess || (data.kind_of? Hash && indifference)
|
30
|
+
HashWithIndifferentAccess[data.map {|k, v| [if_underscore(k), snake_keys(v)] }]
|
31
|
+
elsif data.kind_of? Hash
|
32
|
+
Hash[data.map {|k, v| [if_underscore(k), snake_keys(v)]
|
33
|
+
}]
|
34
|
+
else
|
35
|
+
data
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def camel_keys(data, indifference=false)
|
40
|
+
if data.kind_of? Array
|
41
|
+
data.map { |v| camel_keys(v) }
|
42
|
+
elsif data.kind_of? HashWithIndifferentAccess || (data.kind_of? Hash && indifference)
|
43
|
+
HashWithIndifferentAccess[data.map {|k, v| [if_camelize(k), camel_keys(v)] }]
|
44
|
+
elsif data.kind_of?(Hash)
|
45
|
+
Hash[data.map {|k, v| [if_camelize(k), camel_keys(v)] }]
|
46
|
+
else
|
47
|
+
data
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
module Enumerable
|
54
|
+
def with_camel_keys(indifference=false)
|
55
|
+
CamelSnakeKeys.camel_keys(self, indifference)
|
56
|
+
end
|
57
|
+
|
58
|
+
def with_snake_keys(indifference=false)
|
59
|
+
CamelSnakeKeys.snake_keys(self, indifference)
|
60
|
+
end
|
61
|
+
end
|
data/lib/version.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
RSpec.describe Enumerable do
|
4
|
+
|
5
|
+
context "arrays" do
|
6
|
+
let(:snaked) { [[{true=>false, 1=>1.2, 1.2=>1, nil=>2, :foo_bar=>1, "dark_matter"=>[{:dark_energy=>"aBc", "baz_qux"=>"Frob."}]}]] }
|
7
|
+
let(:camelized) { [[{true=>false, 1=>1.2, 1.2=>1, nil=>2, :foo_bar=>1, "dark_matter"=>[{:dark_energy=>"aBc", "baz_qux"=>"Frob."}]}]] }
|
8
|
+
it "should snake case keys of hashes" do
|
9
|
+
camelized.with_snake_keys.should eq snaked
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should camel case keys of hashes" do
|
13
|
+
snaked.with_snake_keys.should eq camelized
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context "hashes" do
|
18
|
+
let(:snaked) { {false=>true, 1=>1.2, 1.2=>1, nil=>2, :foo_bar=>1, "dark_matter"=>[{:dark_energy=>"aBc", "baz_qux"=>"Frob."}]} }
|
19
|
+
let(:camelized) { {false=>true, 1=>1.2, 1.2=>1, nil=>2, :foo_bar=>1, "dark_matter"=>[{:dark_energy=>"aBc", "baz_qux"=>"Frob."}]} }
|
20
|
+
it "should snake case keys of hashes" do
|
21
|
+
camelized.with_snake_keys.should eq snaked
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should camel case keys of hashes" do
|
25
|
+
snaked.with_snake_keys.should eq camelized
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "hashes with indifferent access" do
|
30
|
+
let(:snaked) { {1.2=>1, 1=>1.2, nil=>2, :foo_bar=>1, "dark_matter"=>[{:dark_energy=>"aBc", "baz_qux"=>"Frob."}]}.with_indifferent_access }
|
31
|
+
let(:camelized) { { 1.2=>1, 1=>1.2, nil=>2, :foo_bar=>1, "dark_matter"=>[{:dark_energy=>"aBc", "baz_qux"=>"Frob."}]}.with_indifferent_access }
|
32
|
+
|
33
|
+
it "should snake case keys of hashes" do
|
34
|
+
camelized.with_snake_keys.should eq snaked
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should camel case keys of hashes" do
|
38
|
+
snaked.with_snake_keys.should eq camelized
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
data/spec/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: camel_snake_keys
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Josh Buermann
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-05-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
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: rspec-rails
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.0'
|
41
|
+
description: ''
|
42
|
+
email:
|
43
|
+
- buermann@gmail.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- ".gitignore"
|
49
|
+
- ".rubocop.yml"
|
50
|
+
- Gemfile
|
51
|
+
- README.md
|
52
|
+
- Rakefile
|
53
|
+
- camel_snake.gemspec
|
54
|
+
- lib/camel_snake_keys.rb
|
55
|
+
- lib/version.rb
|
56
|
+
- spec/lib/camel_snake_keys_spec.rb
|
57
|
+
- spec/test_helper.rb
|
58
|
+
homepage: https://github.com/buermann/camel_snake_keys
|
59
|
+
licenses:
|
60
|
+
- MIT
|
61
|
+
metadata: {}
|
62
|
+
post_install_message:
|
63
|
+
rdoc_options: []
|
64
|
+
require_paths:
|
65
|
+
- lib
|
66
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - "~>"
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '2.0'
|
71
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
requirements: []
|
77
|
+
rubyforge_project:
|
78
|
+
rubygems_version: 2.2.2
|
79
|
+
signing_key:
|
80
|
+
specification_version: 4
|
81
|
+
summary: Convert nested data structure hash keys between camel and snake case.
|
82
|
+
test_files:
|
83
|
+
- spec/lib/camel_snake_keys_spec.rb
|
84
|
+
- spec/test_helper.rb
|