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 ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'http://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in activejson.gemspec
4
+ gemspec
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
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
@@ -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,2 @@
1
+ require 'activejson/activejson_template'
2
+ ActionView::Template.register_template_handler :activejson, ActionView::Template::Handlers::ActiveJsonTemplate
@@ -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
@@ -0,0 +1,3 @@
1
+ module Activejson
2
+ VERSION = "0.1.0"
3
+ 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
+