activejson 0.1.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.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/README.md +54 -0
- data/Rakefile +2 -0
- data/activejson.gemspec +20 -0
- data/lib/activejson.rb +2 -0
- data/lib/activejson/activejson_core.rb +48 -0
- data/lib/activejson/activejson_template.rb +15 -0
- data/lib/activejson/version.rb +3 -0
- metadata +101 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
#ActiveJSON
|
2
|
+
|
3
|
+
##Introduction
|
4
|
+
|
5
|
+
A lightweight JSON view renderer in the style of the usual Rails ActiveView engine.
|
6
|
+
|
7
|
+
Uses yajl to encode the JSON to text for extra speed.
|
8
|
+
|
9
|
+
##Installation
|
10
|
+
|
11
|
+
Installation is easy, just add `gem activejson` to your Gemfile and let bundle do the rest. Alternatively `gem install activejson` will install the gem globally on your system.
|
12
|
+
|
13
|
+
##Example
|
14
|
+
|
15
|
+
Create a view, something like `user.activejson` and fill it with something like this:
|
16
|
+
|
17
|
+
json.user do |user|
|
18
|
+
user.name @user.name
|
19
|
+
user.age @user.age
|
20
|
+
user.pets(@user.pets) do |pet_json, pet|
|
21
|
+
pet_json.name pet.name
|
22
|
+
pet_json.age do |pet_age_json|
|
23
|
+
pet_age_json.human_years pet.age*7
|
24
|
+
pet_age_json.animal_years pet.age
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
And, assuming your `@user` object has a name, an age and an array of pets, this will be rendered as:
|
30
|
+
|
31
|
+
{
|
32
|
+
user : {
|
33
|
+
name : "Steve",
|
34
|
+
age : 23,
|
35
|
+
pets : [
|
36
|
+
{
|
37
|
+
name : "frank",
|
38
|
+
age : {
|
39
|
+
human_years : 14,
|
40
|
+
animal_years 2
|
41
|
+
}
|
42
|
+
},
|
43
|
+
{
|
44
|
+
name : "fred",
|
45
|
+
age : {
|
46
|
+
human_years : 21,
|
47
|
+
animal_years : 3
|
48
|
+
}
|
49
|
+
}
|
50
|
+
]
|
51
|
+
}
|
52
|
+
}
|
53
|
+
|
54
|
+
...except not-pretty printed (for speed).
|
data/Rakefile
ADDED
data/activejson.gemspec
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/activejson/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Andy Caldwell"]
|
6
|
+
gem.email = ["andy.m.caldwell@googlemail.com"]
|
7
|
+
gem.description = %q{Simple template engine for JSON views}
|
8
|
+
gem.summary = %q{Simple template engine for JSON views}
|
9
|
+
gem.homepage = ""
|
10
|
+
|
11
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
12
|
+
gem.files = `git ls-files`.split("\n")
|
13
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
14
|
+
gem.name = "activejson"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = Activejson::VERSION
|
17
|
+
|
18
|
+
gem.add_dependency "multi_json"
|
19
|
+
gem.add_dependency "yajl-ruby"
|
20
|
+
end
|
data/lib/activejson.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'multi_json'
|
3
|
+
|
4
|
+
MultiJson.engine = :yajl
|
5
|
+
|
6
|
+
module ActiveJson
|
7
|
+
class Core
|
8
|
+
instance_methods.each {|m| undef_method(m) unless %w(__id__ __send__ to_json instance_eval nil? is_a? class).include?(m.to_s)}
|
9
|
+
attr_accessor :hash
|
10
|
+
|
11
|
+
def initialize()
|
12
|
+
@hash = {}
|
13
|
+
yield self if block_given?
|
14
|
+
end
|
15
|
+
|
16
|
+
def method_missing(key, *values)
|
17
|
+
value =
|
18
|
+
if block_given?
|
19
|
+
if values.size == 1
|
20
|
+
values.first.map do |v|
|
21
|
+
new_json_ele = ActiveJson::Core.new
|
22
|
+
yield new_json_ele, v
|
23
|
+
new_json_ele
|
24
|
+
end
|
25
|
+
else
|
26
|
+
new_json_ele = ActiveJson::Core.new
|
27
|
+
yield new_json_ele
|
28
|
+
new_json_ele
|
29
|
+
end
|
30
|
+
else
|
31
|
+
values.size == 1 ? values.first : values
|
32
|
+
end
|
33
|
+
|
34
|
+
if @hash[key].nil?
|
35
|
+
@hash[key] = value
|
36
|
+
elsif @hash[key].is_a? Array
|
37
|
+
@hash[key] << value
|
38
|
+
else
|
39
|
+
@hash[key] = value
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def respond_to?(method) true end
|
44
|
+
def to_json() MultiJson.encode(@hash) end
|
45
|
+
def to_s() @hash.to_s end
|
46
|
+
def inspect() @hash.inspect end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'activejson/activejson_core'
|
2
|
+
|
3
|
+
module ActionView
|
4
|
+
module Template::Handlers
|
5
|
+
class ActiveJsonTemplate < Template::Handler
|
6
|
+
include Compilable
|
7
|
+
|
8
|
+
def compile(template)
|
9
|
+
%{ActiveJson::Core.new do |json|
|
10
|
+
#{template.source}
|
11
|
+
end.to_json }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
metadata
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: activejson
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Andy Caldwell
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-09-23 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: multi_json
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 3
|
29
|
+
segments:
|
30
|
+
- 0
|
31
|
+
version: "0"
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: yajl-ruby
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
hash: 3
|
43
|
+
segments:
|
44
|
+
- 0
|
45
|
+
version: "0"
|
46
|
+
type: :runtime
|
47
|
+
version_requirements: *id002
|
48
|
+
description: Simple template engine for JSON views
|
49
|
+
email:
|
50
|
+
- andy.m.caldwell@googlemail.com
|
51
|
+
executables: []
|
52
|
+
|
53
|
+
extensions: []
|
54
|
+
|
55
|
+
extra_rdoc_files: []
|
56
|
+
|
57
|
+
files:
|
58
|
+
- .gitignore
|
59
|
+
- Gemfile
|
60
|
+
- README.md
|
61
|
+
- Rakefile
|
62
|
+
- activejson.gemspec
|
63
|
+
- lib/activejson.rb
|
64
|
+
- lib/activejson/activejson_core.rb
|
65
|
+
- lib/activejson/activejson_template.rb
|
66
|
+
- lib/activejson/version.rb
|
67
|
+
homepage: ""
|
68
|
+
licenses: []
|
69
|
+
|
70
|
+
post_install_message:
|
71
|
+
rdoc_options: []
|
72
|
+
|
73
|
+
require_paths:
|
74
|
+
- lib
|
75
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
76
|
+
none: false
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
hash: 3
|
81
|
+
segments:
|
82
|
+
- 0
|
83
|
+
version: "0"
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
hash: 3
|
90
|
+
segments:
|
91
|
+
- 0
|
92
|
+
version: "0"
|
93
|
+
requirements: []
|
94
|
+
|
95
|
+
rubyforge_project:
|
96
|
+
rubygems_version: 1.8.4
|
97
|
+
signing_key:
|
98
|
+
specification_version: 3
|
99
|
+
summary: Simple template engine for JSON views
|
100
|
+
test_files: []
|
101
|
+
|