camel_snake_keys 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ gem 'rspec'
2
+ gem 'rake'
3
+ gem 'activesupport'
@@ -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
+
@@ -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
+
@@ -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
@@ -0,0 +1,7 @@
1
+ module CamelSnakeKeys
2
+ VERSION = "0.0.1".freeze
3
+
4
+ def self.version
5
+ VERSION
6
+ end
7
+ end
@@ -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
@@ -0,0 +1,5 @@
1
+ require 'camel_snake_keys'
2
+
3
+ RSpec.configure do |config|
4
+ config.expect_with(:rspec) { |c| c.syntax = :should }
5
+ end
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