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.
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