inkit 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,30 @@
1
+ class Inkit
2
+ class Cache
3
+ def initialize(secret)
4
+ @secret = secret
5
+ @cache_dir = './.ink-cache'
6
+ Dir.mkdir @cache_dir unless Dir.exists? @cache_dir
7
+ @cached_at = {}
8
+ end
9
+ def []=(name,data)
10
+ File.open( filename(name), "w+") do |io|
11
+ io.write data
12
+ end
13
+ end
14
+ def [](name)
15
+ File.read filename(name)
16
+ end
17
+ def cached_at(name)
18
+ File.stat(filename(name)).mtime.rfc2822
19
+ end
20
+ def cached?(name)
21
+ File.exists? filename(name)
22
+ end
23
+
24
+ private
25
+
26
+ def filename(name)
27
+ @cache_dir+"/."+OpenSSL::HMAC::hexdigest("sha256",@secret,name.to_s)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,86 @@
1
+ require "net/http"
2
+ require "uri"
3
+ require 'cgi'
4
+ require 'mustache'
5
+ require 'time'
6
+
7
+ load File.dirname(__FILE__)+"/cache.rb"
8
+
9
+ class Hash
10
+ def to_query
11
+ map{|k,v| "#{::CGI.escape(k.to_s)}=#{::CGI.escape(v)}"}.join("&")
12
+ end
13
+ end
14
+
15
+ class String
16
+ def indent(n)
17
+ if n >= 0
18
+ gsub(/^/, ' ' * n)
19
+ else
20
+ gsub(/^ {0,#{-n}}/, "")
21
+ end
22
+ end
23
+ end
24
+
25
+ class Inkit
26
+
27
+ attr_accessor :token
28
+
29
+ # Constructor
30
+ def initialize(options)
31
+ raise 'Please provide your secret key!' unless options[:secret]
32
+ @secret = options[:secret].to_s
33
+ @token = options[:token].to_s
34
+ @cache = Cache.new(@secret)
35
+ end
36
+
37
+ # Pull a view from the inkit api
38
+ def digest(hash)
39
+ OpenSSL::HMAC::hexdigest("sha256", @secret, hash.to_query)
40
+ end
41
+
42
+ def pull(view,type = 'haml')
43
+ data = {:view => view.to_s, :type => type}
44
+ data[:digest] = digest(data)
45
+ data[:token] = @token
46
+ uri = URI("http://inkit.org/api/document?"+data.to_query)
47
+ req = ::Net::HTTP::Get.new uri.request_uri
48
+ if @cache.cached? view
49
+ req['If-Modified-Since'] = @cache.cached_at view
50
+ end
51
+ res = ::Net::HTTP.start(uri.host, uri.port) {|http|
52
+ http.request(req)
53
+ }
54
+ if res.is_a?(::Net::HTTPSuccess)
55
+ @cache[view] = res.body
56
+ return @cache[view]
57
+ end
58
+ if res.is_a?(::Net::HTTPNotModified)
59
+ return @cache[view]
60
+ end
61
+ raise res.code
62
+ end
63
+
64
+ def html(view, options = {})
65
+ render(view, options)
66
+ end
67
+
68
+ def haml(view, options = {})
69
+ render(view, options, 'haml')
70
+ end
71
+
72
+ def render(view, options = {}, type = 'html')
73
+ ret = self.pull(view,type)
74
+ if options[:layout]
75
+ layout = render(options[:layout], {}, type)
76
+ indent = 0
77
+ if layout =~ /( *)\{{3}yield\}{3}/
78
+ indent = $1.length
79
+ end
80
+ ret = "\n#{ret}"
81
+ ret = Mustache.render(layout,:yield => Mustache.render(ret.indent(indent)))
82
+ end
83
+ ret.gsub /\s*$/, ''
84
+ end
85
+ end
86
+
@@ -0,0 +1,7 @@
1
+ source :gemcutter
2
+ gem 'renee', :git=>"git://github.com/gdotdesign/renee.git"
3
+ gem 'haml'
4
+ gem 'sass'
5
+ gem 'json'
6
+ gem 'faker'
7
+ gem 'mustache'
@@ -0,0 +1,39 @@
1
+ GIT
2
+ remote: git://github.com/gdotdesign/renee.git
3
+ revision: 86aae1601e90b243222337c9ed94da1bf62d9791
4
+ specs:
5
+ renee (0.3.2)
6
+ renee-core (= 0.3.2)
7
+ renee-render (= 0.3.2)
8
+ renee-core (0.3.2)
9
+ rack (~> 1.3.0)
10
+ renee-render (0.3.2)
11
+ callsite (~> 0.0.6)
12
+ rack (~> 1.3.0)
13
+ renee-core (= 0.3.2)
14
+ tilt (~> 1.3.3)
15
+
16
+ GEM
17
+ remote: http://rubygems.org/
18
+ specs:
19
+ callsite (0.0.11)
20
+ faker (1.0.1)
21
+ i18n (~> 0.4)
22
+ haml (3.1.4)
23
+ i18n (0.6.0)
24
+ json (1.6.5)
25
+ mustache (0.99.4)
26
+ rack (1.3.6)
27
+ sass (3.1.15)
28
+ tilt (1.3.3)
29
+
30
+ PLATFORMS
31
+ ruby
32
+
33
+ DEPENDENCIES
34
+ faker
35
+ haml
36
+ json
37
+ mustache
38
+ renee!
39
+ sass
@@ -0,0 +1,14 @@
1
+ require "net/http"
2
+ require 'cgi'
3
+ require '../lib/inkit'
4
+
5
+
6
+ ink = Inkit.new({
7
+ :token => "egxM28qoFkP",
8
+ :secret => "QntGyT3P00T"
9
+ })
10
+
11
+ run lambda { |env|
12
+ [200, {"Content-Type" => "text/plain"}, [ink.haml(:asd,{:layout => :test01})]]
13
+ }
14
+
metadata ADDED
@@ -0,0 +1,63 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: inkit
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Szikszai Gusztáv
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-03-27 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: mustache
16
+ requirement: &81191750 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *81191750
25
+ description: Client library to pull and render INK views.
26
+ email: ink-support@hotmail.com
27
+ executables: []
28
+ extensions: []
29
+ extra_rdoc_files: []
30
+ files:
31
+ - ./lib/inkit.rb
32
+ - ./lib/cache.rb
33
+ - test/Gemfile.lock
34
+ - test/Gemfile
35
+ - test/config.ru
36
+ homepage: http://inkit.org
37
+ licenses: []
38
+ post_install_message:
39
+ rdoc_options: []
40
+ require_paths:
41
+ - ./
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ requirements: []
55
+ rubyforge_project:
56
+ rubygems_version: 1.8.17
57
+ signing_key:
58
+ specification_version: 3
59
+ summary: Client library for INK.
60
+ test_files:
61
+ - test/Gemfile.lock
62
+ - test/Gemfile
63
+ - test/config.ru