easyrb 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/lib/easyrb.rb ADDED
@@ -0,0 +1,4 @@
1
+ require 'easyrb/local'
2
+ require 'easyrb/context'
3
+ require 'easyrb/runner'
4
+ require 'easyrb/monkey'
@@ -0,0 +1,64 @@
1
+ module Easyrb
2
+
3
+ class Context
4
+
5
+ ################
6
+ # #
7
+ # Declarations #
8
+ # #
9
+ ################
10
+
11
+ attr_reader :helpers
12
+
13
+ ###############
14
+ # #
15
+ # Constructor #
16
+ # #
17
+ ###############
18
+
19
+ def initialize(context, helpers)
20
+ @context = context
21
+ @helpers = Array(helpers)
22
+ end
23
+
24
+ #################
25
+ # #
26
+ # Class Methods #
27
+ # #
28
+ #################
29
+
30
+ def self.[](context, helpers)
31
+ new(context, helpers).generate_context
32
+ end
33
+
34
+ ####################
35
+ # #
36
+ # Instance Methods #
37
+ # #
38
+ ####################
39
+
40
+ def generate_context
41
+ context.tap do |obj|
42
+ helpers.each do |mod|
43
+ obj.extend(mod)
44
+ end
45
+ end
46
+ end
47
+
48
+ private
49
+
50
+ def bare_context
51
+ @context
52
+ end
53
+
54
+ def context
55
+ delegated_context || bare_context || Object.new
56
+ end
57
+
58
+ def delegated_context
59
+ SimpleDelegator.new(bare_context) if bare_context && helpers.any?
60
+ end
61
+
62
+ end
63
+
64
+ end
@@ -0,0 +1,66 @@
1
+ module Easyrb
2
+
3
+ class Local
4
+
5
+ ################
6
+ # #
7
+ # Declarations #
8
+ # #
9
+ ################
10
+
11
+ attr_reader :context, :hash
12
+
13
+ ###############
14
+ # #
15
+ # Constructor #
16
+ # #
17
+ ###############
18
+
19
+ def initialize(context, hash)
20
+ @context = context
21
+ @hash = hash || Hash.new
22
+ end
23
+
24
+ #################
25
+ # #
26
+ # Class Methods #
27
+ # #
28
+ #################
29
+
30
+ def self.[](context, hash)
31
+ new(context, hash).generate_binding
32
+ end
33
+
34
+ ####################
35
+ # #
36
+ # Instance Methods #
37
+ # #
38
+ ####################
39
+
40
+ def generate_binding
41
+ locals_function.(*values)
42
+ end
43
+
44
+ private
45
+
46
+ def function_string
47
+ locals_string = "#{ keys.join(', ') }, = args;" if keys.any?
48
+
49
+ "->(*args) { #{ locals_string } ->(){}.binding }"
50
+ end
51
+
52
+ def keys
53
+ hash.keys
54
+ end
55
+
56
+ def locals_function
57
+ context.instance_eval(function_string)
58
+ end
59
+
60
+ def values
61
+ hash.values
62
+ end
63
+
64
+ end
65
+
66
+ end
@@ -0,0 +1,19 @@
1
+ class String
2
+
3
+ def erb(options = {})
4
+ Easyrb::Runner.new(self).run(options)
5
+ end
6
+
7
+ end
8
+
9
+ class File
10
+
11
+ def self.erb(filename, options = {})
12
+ File.read(filename).erb(options)
13
+ end
14
+
15
+ def erb(options = {})
16
+ self.read.erb(options)
17
+ end
18
+
19
+ end
@@ -0,0 +1,60 @@
1
+ require 'erb'
2
+ require 'delegate'
3
+
4
+ module Easyrb
5
+
6
+ class Runner
7
+
8
+ ################
9
+ # #
10
+ # Declarations #
11
+ # #
12
+ ################
13
+
14
+ attr_reader :erb_template
15
+
16
+ VALID_OPTIONS = [:context, :helpers, :locals]
17
+
18
+ ###############
19
+ # #
20
+ # Constructor #
21
+ # #
22
+ ###############
23
+
24
+ def initialize(erb_template)
25
+ @erb_template = erb_template
26
+ end
27
+
28
+ ####################
29
+ # #
30
+ # Instance Methods #
31
+ # #
32
+ ####################
33
+
34
+ def run(options = {})
35
+ validate_options!(options)
36
+
37
+ object = Easyrb::Context[options[:context], options[:helpers]]
38
+ binding = Easyrb::Local[object, options[:locals]]
39
+
40
+ erb.result(binding)
41
+ end
42
+
43
+ private
44
+
45
+ def erb
46
+ ERB.new(erb_template)
47
+ end
48
+
49
+ def validate_options!(options)
50
+ bad_keys = options.keys - VALID_OPTIONS
51
+
52
+ if bad_keys.any?
53
+ bad_key_string = bad_keys.map { |k| k.inspect }.join(', ')
54
+ raise ArgumentError, "#erb invalid keys: #{ bad_key_string }"
55
+ end
56
+ end
57
+
58
+ end
59
+
60
+ end
metadata ADDED
@@ -0,0 +1,50 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: easyrb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Mark Josef
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-09-21 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Making it easy to use ERB in a Rails-y fashion
15
+ email: mcphage@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/easyrb.rb
21
+ - lib/easyrb/context.rb
22
+ - lib/easyrb/local.rb
23
+ - lib/easyrb/monkey.rb
24
+ - lib/easyrb/runner.rb
25
+ homepage: http://github.com/mark/easyrb
26
+ licenses:
27
+ - MIT
28
+ post_install_message:
29
+ rdoc_options: []
30
+ require_paths:
31
+ - lib
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ required_rubygems_version: !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ requirements: []
45
+ rubyforge_project:
46
+ rubygems_version: 1.8.10
47
+ signing_key:
48
+ specification_version: 3
49
+ summary: Making it easy to use ERB in a Rails-y fashion
50
+ test_files: []