json_serializable 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,4 +1,3 @@
1
1
  *.gem
2
2
  .bundle
3
- Gemfile.lock
4
3
  pkg/*
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --colour
data/Gemfile CHANGED
@@ -1,4 +1,6 @@
1
1
  source "http://rubygems.org"
2
2
 
3
- # Specify your gem's dependencies in json_serializable.gemspec
4
3
  gemspec
4
+
5
+ gem "rake"
6
+ gem "rspec"
data/Gemfile.lock ADDED
@@ -0,0 +1,26 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ json_serializable (0.1.0)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+ diff-lcs (1.1.3)
10
+ rake (0.9.2.2)
11
+ rspec (2.6.0)
12
+ rspec-core (~> 2.6.0)
13
+ rspec-expectations (~> 2.6.0)
14
+ rspec-mocks (~> 2.6.0)
15
+ rspec-core (2.6.4)
16
+ rspec-expectations (2.6.0)
17
+ diff-lcs (~> 1.1.2)
18
+ rspec-mocks (2.6.0)
19
+
20
+ PLATFORMS
21
+ ruby
22
+
23
+ DEPENDENCIES
24
+ json_serializable!
25
+ rake
26
+ rspec
data/Rakefile CHANGED
@@ -1 +1,11 @@
1
+ require "bundler"
1
2
  require "bundler/gem_tasks"
3
+ Bundler.setup
4
+
5
+ require "rspec/core/rake_task"
6
+
7
+ RSpec::Core::RakeTask.new("spec") do |spec|
8
+ spec.pattern = "spec/**/*_spec.rb"
9
+ end
10
+
11
+ task :default => :spec
@@ -1,6 +1,13 @@
1
- # json_serializable [:name, :description],
2
- # :price => lambda{|content| content.price.to_i},
3
- # :secret_key => :primary_key
1
+ # This Module extends the as_json method in your model to easily customize the JSON output
2
+ #
3
+ # Example:
4
+ # include JsonSerializable
5
+ # json_serializable [:name, :description], :private => lambda {|model| model.secret}
6
+ # this will produce the following Hash
7
+ # {:name => model.name, :description => model.description, :private => model.secret}
8
+ #
9
+ # This module works best when you want to whitelist your attributes for JSON and want to
10
+ # use different names/values than your attributes name in the models
4
11
 
5
12
  require "json_serializable/version"
6
13
 
@@ -15,11 +22,15 @@ module JsonSerializable
15
22
 
16
23
  def as_json(options = {})
17
24
  options ||= {}
18
- custom_options = self.class.json_field_names.present? ? options.merge(only: self.class.json_field_names) : options
25
+ custom_options = self.class.json_field_names.size > 0 ? options.merge(only: self.class.json_field_names) : options
19
26
  custom_hash = super(custom_options)
20
27
 
21
28
  self.class.json_mappings.each_pair do |key, value|
22
- custom_hash[key] = value.is_a?(Symbol) ? self.send(value) : value[self]
29
+ if value.is_a?(Symbol)
30
+ custom_hash[value] = self.send(key)
31
+ else
32
+ custom_hash[key] = value[self]
33
+ end
23
34
  end
24
35
 
25
36
  custom_hash
@@ -28,6 +39,7 @@ module JsonSerializable
28
39
 
29
40
  module ClassMethods
30
41
 
42
+
31
43
  def json_serializable field_names, mappings = {}
32
44
  @@json_field_names = field_names
33
45
  @@json_mappings = mappings
@@ -38,7 +50,7 @@ module JsonSerializable
38
50
  end
39
51
 
40
52
  def json_mappings
41
- @@json_mappings ||= []
53
+ @@json_mappings ||= {}
42
54
  end
43
55
 
44
56
  end
@@ -1,3 +1,3 @@
1
1
  module JsonSerializable
2
- VERSION = "0.0.2"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -0,0 +1,69 @@
1
+ require 'json_serializable'
2
+
3
+ class Base
4
+ def as_json(options = {})
5
+ options
6
+ end
7
+ end
8
+
9
+ class Model < Base
10
+ include JsonSerializable
11
+
12
+ attr_accessor :name, :description, :secret
13
+
14
+ def greet
15
+ "Hello there"
16
+ end
17
+ end
18
+
19
+ describe JsonSerializable do
20
+
21
+ before(:each) do
22
+ @model = Model.new
23
+ end
24
+
25
+ it 'should use base.as_json by default' do
26
+ @model.as_json(hello: "world").should == {hello: "world"}
27
+ end
28
+
29
+ describe 'custom serialization' do
30
+
31
+ before(:each) do
32
+ @model.name = "Sohan"
33
+ @model.description = "Simple guy"
34
+ @model.secret = "8789aasd7"
35
+ end
36
+
37
+ it 'should whitelist the fields' do
38
+ Model.class_eval do
39
+ json_serializable [:name, :description]
40
+ end
41
+
42
+ @model.as_json.should == {only: [:name, :description]}
43
+ end
44
+
45
+ it 'should whitelist with lambdas' do
46
+ Model.class_eval do
47
+ json_serializable [:name], :private => lambda {|model| model.secret}
48
+ end
49
+
50
+ @model.as_json.should == {only: [:name], :private => @model.secret}
51
+ end
52
+
53
+ it 'should allow methods with custom key' do
54
+ Model.class_eval do
55
+ json_serializable [:name], :greet => :welcome
56
+ end
57
+
58
+ @model.as_json.should == {only: [:name], :welcome => "Hello there"}
59
+ end
60
+
61
+ it 'should allow fields with custom key' do
62
+ Model.class_eval do
63
+ json_serializable [:name], :description => :summary
64
+ end
65
+
66
+ @model.as_json.should == {only: [:name], :summary => "Simple guy"}
67
+ end
68
+ end
69
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_serializable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-03-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &2164770400 !ruby/object:Gem::Requirement
16
+ requirement: &2156365720 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,7 +21,7 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *2164770400
24
+ version_requirements: *2156365720
25
25
  description: Use custom names in JSON keys and your custom logic in JSON values
26
26
  email:
27
27
  - sohan39@gmail.com
@@ -30,11 +30,14 @@ extensions: []
30
30
  extra_rdoc_files: []
31
31
  files:
32
32
  - .gitignore
33
+ - .rspec
33
34
  - Gemfile
35
+ - Gemfile.lock
34
36
  - Rakefile
35
37
  - json_serializable.gemspec
36
38
  - lib/json_serializable.rb
37
39
  - lib/json_serializable/version.rb
40
+ - spec/json_serializable_spec.rb
38
41
  homepage: ''
39
42
  licenses: []
40
43
  post_install_message:
@@ -47,16 +50,23 @@ required_ruby_version: !ruby/object:Gem::Requirement
47
50
  - - ! '>='
48
51
  - !ruby/object:Gem::Version
49
52
  version: '0'
53
+ segments:
54
+ - 0
55
+ hash: 329497193356031779
50
56
  required_rubygems_version: !ruby/object:Gem::Requirement
51
57
  none: false
52
58
  requirements:
53
59
  - - ! '>='
54
60
  - !ruby/object:Gem::Version
55
61
  version: '0'
62
+ segments:
63
+ - 0
64
+ hash: 329497193356031779
56
65
  requirements: []
57
66
  rubyforge_project: json_serializable
58
- rubygems_version: 1.8.11
67
+ rubygems_version: 1.8.17
59
68
  signing_key:
60
69
  specification_version: 3
61
70
  summary: Provides a clean approach to custom JSON serialize your AR models
62
- test_files: []
71
+ test_files:
72
+ - spec/json_serializable_spec.rb