versatile_rjs 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/.document +5 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +17 -0
  4. data/History.txt +9 -0
  5. data/LICENSE.txt +20 -0
  6. data/README.rdoc +19 -0
  7. data/Rakefile +56 -0
  8. data/VERSION +1 -0
  9. data/features/step_definitions/versatile_rjs_steps.rb +0 -0
  10. data/features/support/env.rb +13 -0
  11. data/features/versatile_rjs.feature +9 -0
  12. data/init.rb +1 -0
  13. data/lib/versatile_rjs/container.rb +23 -0
  14. data/lib/versatile_rjs/page.rb +109 -0
  15. data/lib/versatile_rjs/proxy/default_responder.rb +13 -0
  16. data/lib/versatile_rjs/proxy/each_proxy.rb +37 -0
  17. data/lib/versatile_rjs/proxy/element_by_id_proxy.rb +20 -0
  18. data/lib/versatile_rjs/proxy/element_proxy.rb +63 -0
  19. data/lib/versatile_rjs/proxy/element_set_proxy.rb +22 -0
  20. data/lib/versatile_rjs/proxy/expression_proxy.rb +10 -0
  21. data/lib/versatile_rjs/proxy/framework_dependent.rb +21 -0
  22. data/lib/versatile_rjs/proxy/jquery/each_proxy.rb +25 -0
  23. data/lib/versatile_rjs/proxy/jquery/element_by_id_proxy.rb +13 -0
  24. data/lib/versatile_rjs/proxy/jquery/element_proxy.rb +37 -0
  25. data/lib/versatile_rjs/proxy/jquery/element_set.rb +8 -0
  26. data/lib/versatile_rjs/proxy/jquery/element_set_proxy.rb +15 -0
  27. data/lib/versatile_rjs/proxy/jquery/selectable.rb +12 -0
  28. data/lib/versatile_rjs/proxy/jquery/selector_proxy.rb +14 -0
  29. data/lib/versatile_rjs/proxy/jquery.rb +9 -0
  30. data/lib/versatile_rjs/proxy/selectable.rb +9 -0
  31. data/lib/versatile_rjs/proxy/selector_proxy.rb +17 -0
  32. data/lib/versatile_rjs/proxy.rb +42 -0
  33. data/lib/versatile_rjs/railtie.rb +33 -0
  34. data/lib/versatile_rjs/template_handler.rb +11 -0
  35. data/lib/versatile_rjs/to_function_ext.rb +23 -0
  36. data/lib/versatile_rjs/utils/.gitignore +0 -0
  37. data/lib/versatile_rjs/utils.rb +3 -0
  38. data/lib/versatile_rjs.rb +39 -0
  39. data/script/console +10 -0
  40. data/script/destroy +14 -0
  41. data/script/generate +14 -0
  42. data/spec/spec_helper.rb +12 -0
  43. data/spec/versatile_rjs_spec.rb +5 -0
  44. data/versatile_rjs.gemspec +101 -0
  45. metadata +203 -0
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile ADDED
@@ -0,0 +1,17 @@
1
+ source "http://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ # gem "activesupport", ">= 2.3.5"
5
+
6
+ # Add dependencies to develop your gem here.
7
+ # Include everything needed to run rake, tests, features, etc.
8
+
9
+ gem 'rails', '>= 3.1.0'
10
+
11
+ group :development do
12
+ gem "rspec", "~> 2.3.0"
13
+ gem "cucumber", ">= 0"
14
+ gem "bundler", "~> 1.0.0"
15
+ gem "jeweler", "~> 1.6.4"
16
+ gem "rcov", ">= 0"
17
+ end
data/History.txt ADDED
@@ -0,0 +1,9 @@
1
+ === 0.1.2 2011-11-06
2
+
3
+ * Renewed internal architecture. Method calls no longer disable repeated invocation of proxy objects. JavaScript statements are added only when the suitable method invoked.
4
+ * Added each method to the ElementSetProxy (trial future: not production state)
5
+
6
+ === 0.0.1 2011-10-08
7
+
8
+ * 1 major enhancement:
9
+ * Initial release
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Kevin T
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,19 @@
1
+ = versatile_rjs
2
+
3
+ This gem enables RJS using Rails 3.1 or higher and jQuery.
4
+
5
+ == Contributing to versatile_rjs
6
+
7
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
8
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
9
+ * Fork the project
10
+ * Start a feature/bugfix branch
11
+ * Commit and push until you are happy with your contribution
12
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
13
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
14
+
15
+ == Copyright
16
+
17
+ Copyright (c) 2011 Kevin IMAI TOYODA See LICENSE.txt for
18
+ further details.
19
+
data/Rakefile ADDED
@@ -0,0 +1,56 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
+ gem.name = "versatile_rjs"
18
+ gem.homepage = "http://github.com/condor/versatile_rjs"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{VersatileRJS: Enables RJS with Rails(3.1 or higher) and jQuery.}
21
+ gem.description = <<-EOD
22
+ VersatileRJS: Enables RJS with Rails(3.1 or higher) and jQuery.
23
+
24
+
25
+ EOD
26
+ gem.email = "condor1226@gmail.com"
27
+ gem.authors = ["Kevin IMAI TOYODA"]
28
+ # dependencies defined in Gemfile
29
+ end
30
+ Jeweler::RubygemsDotOrgTasks.new
31
+
32
+ require 'rspec/core'
33
+ require 'rspec/core/rake_task'
34
+ RSpec::Core::RakeTask.new(:spec) do |spec|
35
+ spec.pattern = FileList['spec/**/*_spec.rb']
36
+ end
37
+
38
+ RSpec::Core::RakeTask.new(:rcov) do |spec|
39
+ spec.pattern = 'spec/**/*_spec.rb'
40
+ spec.rcov = true
41
+ end
42
+
43
+ require 'cucumber/rake/task'
44
+ Cucumber::Rake::Task.new(:features)
45
+
46
+ task :default => :spec
47
+
48
+ require 'rdoc/task'
49
+ Rake::RDocTask.new do |rdoc|
50
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
51
+
52
+ rdoc.rdoc_dir = 'rdoc'
53
+ rdoc.title = "versatile_rjs #{version}"
54
+ rdoc.rdoc_files.include('README*')
55
+ rdoc.rdoc_files.include('lib/**/*.rb')
56
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.2
File without changes
@@ -0,0 +1,13 @@
1
+ require 'bundler'
2
+ begin
3
+ Bundler.setup(:default, :development)
4
+ rescue Bundler::BundlerError => e
5
+ $stderr.puts e.message
6
+ $stderr.puts "Run `bundle install` to install missing gems"
7
+ exit e.status_code
8
+ end
9
+
10
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
11
+ require 'versatile_rjs'
12
+
13
+ require 'rspec/expectations'
@@ -0,0 +1,9 @@
1
+ Feature: something something
2
+ In order to something something
3
+ A user something something
4
+ something something something
5
+
6
+ # Scenario: something something
7
+ # Given inspiration
8
+ # When I create a sweet new gem
9
+ # Then everyone should see how awesome I am
data/init.rb ADDED
@@ -0,0 +1 @@
1
+ require 'versatile_rjs'
@@ -0,0 +1,23 @@
1
+ require 'weakref'
2
+
3
+ module VersatileRJS
4
+ module Container
5
+ DELIMITER_WITH_NEW_LINE = ';\n'
6
+ DELIMITER_WITHOUT_NEW_LINE = ';'
7
+
8
+ def statements
9
+ @statements ||= []
10
+ end
11
+
12
+ def add_statement(statement)
13
+ statements << statement
14
+ end
15
+
16
+ def to_script(with_new_line = false)
17
+ delimiter = with_new_line ? DELIMITER_WITH_NEW_LINE : DELIMITER_WITHOUT_NEW_LINE
18
+ statement = statements.map(&:to_json).join(delimiter)
19
+ statement += ';'
20
+ statement_prefix(statement).to_s + statement + statement_suffix(statement).to_s
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,109 @@
1
+ require 'versatile_rjs/container'
2
+
3
+ module VersatileRJS
4
+ class Page
5
+
6
+ include Container
7
+
8
+ def method_missing(name, *args)
9
+ if name.to_s =~ /=$/
10
+ assign(name, args.first)
11
+ else
12
+ view.__send__ name, *args
13
+ end
14
+ end
15
+
16
+ class ContainerStack < Array
17
+ def peek
18
+ self[-1]
19
+ end
20
+ end
21
+
22
+ attr_reader :view, :stack
23
+ private :stack
24
+
25
+ def initialize(view)
26
+ @view = view
27
+ @stack = ContainerStack.new
28
+ @stack.push self
29
+ end
30
+
31
+ def push_container(container)
32
+ stack.push container
33
+ end
34
+
35
+ def pop_container
36
+ stack.pop
37
+ end
38
+
39
+ def append_statement(statement)
40
+ stack.peek.add_statement statement
41
+ statement
42
+ end
43
+
44
+ def <<(statement)
45
+ append_statement(ActiveSupport::JSON::Variable.new(statement))
46
+ end
47
+
48
+ def [](id)
49
+ VersatileRJS::Proxy::ElementByIdProxy.new_instance(self, id)
50
+ end
51
+
52
+ def select(selector)
53
+ VersatileRJS::Proxy::SelectorProxy.new_instance(self, selector)
54
+ end
55
+
56
+ def assign(variable, value)
57
+ self << "var #{variable} = #{value.to_json}"
58
+ end
59
+
60
+ def replace_html(id, *args)
61
+ self[id].replace_html(*args)
62
+ end
63
+
64
+ def replace(id, *args)
65
+ self[id].replace(*args)
66
+ end
67
+
68
+ def insert_html(id, *args)
69
+ self[id].insert_html(*args)
70
+ end
71
+
72
+ def remove(id, *args)
73
+ self[id].remove(*args)
74
+ end
75
+
76
+ def evaluate(&block)
77
+ view.instance_exec(self, &block)
78
+ self
79
+ end
80
+
81
+ def execute_rendering(*args_for_rendering)
82
+ return '' if args_for_rendering.size == 0
83
+ return args_for_rendering.first if args_for_rendering.size == 1 &&
84
+ args_for_rendering.first.kind_of?(String)
85
+ return render_on_view(*args_for_rendering)
86
+ end
87
+
88
+ def statement_prefix(statement)
89
+ "try{" if VersatileRJS.debug_rjs?
90
+ end
91
+
92
+ def statement_suffix(statement)
93
+ if VersatileRJS.debug_rjs
94
+ <<-EOS
95
+ }catch(e){
96
+ alert('RJS Error: ' + e);
97
+ alert('#{view.__send__(:escape_javascript, statement)}');
98
+ throw e;
99
+ }
100
+ EOS
101
+ end
102
+ end
103
+
104
+ private
105
+ def render_on_view(*args_for_rendering)
106
+ view.instance_eval{render *args_for_rendering}
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,13 @@
1
+ module VersatileRJS
2
+ class Proxy
3
+ module DefaultResponder
4
+ def method_missing(name, *args)
5
+ if name.to_s =~ /=$/
6
+ assign(name, args.first)
7
+ else
8
+ call(name, *args)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,37 @@
1
+ module VersatileRJS
2
+ class Proxy
3
+ class EachProxy < Proxy
4
+
5
+ attr_reader :variable_name
6
+
7
+ include Container
8
+
9
+ def initialize(page)
10
+ super(page, nil)
11
+ self.variable_name = "_v#{next_variable_count}"
12
+ end
13
+
14
+ def each
15
+ page.push_container(self)
16
+ element = ElementProxy.new_instance(page, variable_name)
17
+ begin
18
+ yield element
19
+ page.append_statement statement
20
+ ensure
21
+ page.pop_container
22
+ end
23
+ end
24
+
25
+ def statement
26
+ end
27
+
28
+ def statement_prefix(statement);end
29
+ def statement_suffix(statement);end
30
+
31
+ def next_variable_count
32
+ count = Thread.current[:__versatile_rjs_each_var_counter] || -1
33
+ Thread.current[:__versatile_rjs_each_var_counter] += 1
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,20 @@
1
+ require 'versatile_rjs/proxy/element_proxy'
2
+
3
+ module VersatileRJS
4
+ class Proxy
5
+ module ElementByIdProxy
6
+ include FrameworkDependent
7
+
8
+ def self.included(base)
9
+ base.class_eval do
10
+ attr_accessor :id
11
+ end
12
+ end
13
+
14
+ def initialize(page, id)
15
+ self.id = id
16
+ super(page, statement_for_id(id))
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,63 @@
1
+ require 'versatile_rjs/proxy/framework_dependent'
2
+ require 'versatile_rjs/proxy/selectable'
3
+ require 'versatile_rjs/proxy/default_responder'
4
+
5
+ module VersatileRJS
6
+ class Proxy
7
+ class ElementProxy < Proxy
8
+ include FrameworkDependent
9
+ include Selectable
10
+
11
+ def replace_html(*args)
12
+ page.append_statement call(js_method(:replace_html), page.execute_rendering(*args))
13
+ end
14
+
15
+ def replace(*args)
16
+ page.append_statement call(js_method(:replace), page.execute_rendering(*args))
17
+ end
18
+
19
+ def insert_html(position, *args)
20
+ content = page.execute_rendering(*args)
21
+ arguments = Array(self.args(:insert_html, position, content))
22
+ page.append_statement call(js_method(:insert_html, position), *arguments)
23
+ end
24
+
25
+ def remove
26
+ page.append_statement call(js_method(:remove))
27
+ end
28
+
29
+ def value
30
+ call(js_method(:value))
31
+ end
32
+
33
+ def value=(value)
34
+ page.append_statement call(js_method(:value=), value)
35
+ end
36
+
37
+ def show
38
+ page.append_statement call(js_method(:show))
39
+ end
40
+
41
+ def hide
42
+ page.append_statement call(js_method(:hide))
43
+ end
44
+
45
+ def toggle
46
+ page.append_statement call(js_method(:toggle))
47
+ end
48
+
49
+ def inner_html=(html)
50
+ replace_html(html)
51
+ end
52
+
53
+ def js_method(method, *args)
54
+ self.class.js_method(method, *args)
55
+ end
56
+
57
+ def args(method, *args)
58
+ self.class.args(method, *args)
59
+ end
60
+
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,22 @@
1
+ require 'versatile_rjs/proxy/selectable'
2
+
3
+ module VersatileRJS
4
+ class Proxy
5
+ class ElementSetProxy < Proxy
6
+ include Selectable
7
+ include FrameworkDependent
8
+
9
+ def initialize(page, statement)
10
+ super
11
+ end
12
+
13
+ def each(&block)
14
+ EachProxy.new_instance(page).each(&block)
15
+ end
16
+
17
+ def invoke(method_name)
18
+ raise NotImplementedError, "invoke must be implemented in each class."
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,10 @@
1
+ module VersatileRJS
2
+ class Proxy
3
+ class ExpressionProxy
4
+
5
+ def initialize(page, expression)
6
+ super(page, expression)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,21 @@
1
+ module VersatileRJS
2
+ class Proxy
3
+ module FrameworkDependent
4
+ def self.included(base)
5
+ base.extend ClassMethods
6
+ end
7
+
8
+ module ClassMethods
9
+ def new_instance(*args)
10
+ implementation_class.new(*args)
11
+ end
12
+
13
+ private
14
+ def implementation_class
15
+ @implementation_class ||= VersatileRJS.implementation_class_of(self)
16
+ end
17
+
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,25 @@
1
+ module VersatileRJS
2
+ class Proxy
3
+ module Jquery
4
+ class EachProxy < VersatileRJS::Proxy::EachProxy
5
+ def initialize(page)
6
+ super
7
+ add_statement(ActiveSupport::JSON::Variable.new("var #{variable_name} = $(#{tmp_variable_name})"))
8
+ end
9
+
10
+ def tmp_variable_name
11
+ @tmp_variable_name ||= "_tmp" + variable_name
12
+ end
13
+
14
+ def statement_prefix(statement)
15
+ loop_variable_name = "_loop" + variable_name
16
+ "$.each(function(#{loop_variable_name}, #{tmp_variable_name}){"
17
+ end
18
+
19
+ def statement_suffix(statement)
20
+ "})"
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,13 @@
1
+ module VersatileRJS
2
+ class Proxy
3
+ module Jquery
4
+ class ElementByIdProxy < ElementProxy
5
+ include ::VersatileRJS::Proxy::ElementByIdProxy
6
+ private
7
+ def statement_for_id(id)
8
+ "$('##{id}')"
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,37 @@
1
+ module VersatileRJS
2
+ class Proxy
3
+ module Jquery
4
+ class ElementProxy < VersatileRJS::Proxy::ElementProxy
5
+ METHODS = {
6
+ :replace_html => :html,
7
+ :replace => :replaceWith,
8
+ :insert_html => {
9
+ :top => :prepend,
10
+ :bottom => :append
11
+ },
12
+ :value => :val,
13
+ :value= => :val,
14
+ :select => :find
15
+ }.freeze
16
+
17
+ def self.js_method(method, *args)
18
+ case method
19
+ when :insert_html
20
+ METHODS[method][args.first]
21
+ else
22
+ METHODS[method] || method
23
+ end
24
+ end
25
+
26
+ def self.args(method, *args)
27
+ case method
28
+ when :insert_html
29
+ args.second
30
+ else
31
+ args
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,8 @@
1
+ module VersatileRJS
2
+ class Proxy
3
+ module Jquery
4
+ module ElementSet
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,15 @@
1
+ require 'versatile_rjs/proxy/jquery/selectable'
2
+ require 'versatile_rjs/proxy/jquery/element_set'
3
+
4
+ module VersatileRJS
5
+ class Proxy
6
+ module Jquery
7
+ class ElementSetProxy < ::VersatileRJS::Proxy::ElementSetProxy
8
+
9
+ def invoke(method_name)
10
+ page.append_statement call(method_name)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ module VersatileRJS
2
+ class Proxy
3
+ module Jquery
4
+ module Selectable
5
+ private
6
+ def _select(locator)
7
+ call :find, locator
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,14 @@
1
+ require 'versatile_rjs/proxy/jquery/element_set_proxy'
2
+
3
+ module VersatileRJS
4
+ class Proxy
5
+ module Jquery
6
+ class SelectorProxy < ElementSetProxy
7
+ private
8
+ def statement_for_selector(selector)
9
+ "$('#{selector}')"
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,9 @@
1
+ module VersatileRJS
2
+ class Proxy
3
+ module Jquery;end
4
+ end
5
+ end
6
+ require 'versatile_rjs/proxy/jquery/element_proxy'
7
+ require 'versatile_rjs/proxy/jquery/element_by_id_proxy'
8
+ require 'versatile_rjs/proxy/jquery/element_set_proxy'
9
+ require 'versatile_rjs/proxy/jquery/selector_proxy'
@@ -0,0 +1,9 @@
1
+ module VersatileRJS
2
+ class Proxy
3
+ module Selectable
4
+ def select(locator)
5
+ page.append_statement call(js_methods(:select), selector)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,17 @@
1
+ module VersatileRJS
2
+ class Proxy
3
+ module SelectorProxy
4
+ include FrameworkDependent
5
+
6
+ def self.included(base)
7
+ base.class_eval do
8
+ attr_accessor :selector
9
+ end
10
+ end
11
+
12
+ def initialize(page, selector)
13
+ super(page, statement_for_selector(selector))
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,42 @@
1
+
2
+ module VersatileRJS
3
+ class Proxy
4
+ attr_reader :page, :statement, :container
5
+ attr_accessor :index, :container
6
+ private :page, :statement, :container, :index
7
+
8
+ def method_missing(method, *args)
9
+ page.append_statement call(method, *args)
10
+ end
11
+
12
+ def initialize(page, statement)
13
+ @page = page
14
+ @statement = statement
15
+ end
16
+
17
+ def call(method, *arguments)
18
+ method = method.to_s.camelcase(:lower)
19
+ script =
20
+ if method =~ /(.*)=$/
21
+ "#{statement}.#{$1} = #{arguments.first.to_json}"
22
+ else
23
+ "#{statement}.#{method}(#{arguments.map(&:to_json).join(', ')})"
24
+ end
25
+ ActiveSupport::JSON::Variable.new script
26
+ end
27
+
28
+ def to_json
29
+ ActiveSupport::JSON::Variable.new(statement)
30
+ end
31
+
32
+ alias_method :to_s, :to_json
33
+ end
34
+ end
35
+
36
+ require 'versatile_rjs/proxy/element_proxy'
37
+ require 'versatile_rjs/proxy/element_by_id_proxy'
38
+ require 'versatile_rjs/proxy/element_set_proxy'
39
+ require 'versatile_rjs/proxy/selector_proxy'
40
+ require 'versatile_rjs/proxy/framework_dependent'
41
+ require 'versatile_rjs/proxy/selectable'
42
+ require 'versatile_rjs/proxy/each_proxy'
@@ -0,0 +1,33 @@
1
+ require 'rails'
2
+
3
+ class Rails::Application::Configuration
4
+ def versatile_rjs
5
+ @versatile_rjs ||= ActiveSupport::OrderedOptions.new
6
+ end
7
+ end
8
+
9
+ module VersatileRJS
10
+ class Railtie < Rails::Railtie
11
+
12
+ initializer "versatile_rjs.enable_debug_rjs" do |app|
13
+ VersatileRJS.debug_rjs = app.config.versatile_rjs.debug_rjs
14
+ end
15
+
16
+ initializer "versatile_rjs.register_template_handler" do |app|
17
+ ActiveSupport.on_load(:action_view) do
18
+ ActionView::Template.register_template_handler :rjs, VersatileRJS::TemplateHandler
19
+ end
20
+ end
21
+
22
+ initializer "versatile_rjs.extend_link_and_button_to_function" do |app|
23
+ ActiveSupport.on_load(:action_view) do
24
+ require 'versatile_rjs/to_function_ext'
25
+ end
26
+ end
27
+
28
+ initializer "versatile_rjs.setup_framework" do |app|
29
+ VersatileRJS.javascript_framework = app.config.versatile_rjs.javascript_framework || VersatileRJS.default_javascript_framework
30
+ VersatileRJS.require_framework
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,11 @@
1
+ module VersatileRJS
2
+ class TemplateHandler
3
+ def self.call(template)
4
+ new.call(template)
5
+ end
6
+
7
+ def call(template)
8
+ "VersatileRJS::Page.new(self).evaluate{|page|#{template.source}}.to_script(true)"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,23 @@
1
+ require 'action_view/helpers/javascript_helper'
2
+
3
+ module ActionView::Helpers::JavaScriptHelper
4
+
5
+ def button_to_function_with_block(name, function = nil, html_options={}, &block)
6
+ function =
7
+ _versatile_rjs_function_block_extraction(block) if block_given?
8
+ button_to_function_without_block(name, function, html_options)
9
+ end
10
+
11
+ def link_to_function_with_block(name, function = nil, html_options={}, &block)
12
+ function =
13
+ _versatile_rjs_function_block_extraction(block) if block_given?
14
+ link_to_function_without_block(name, function, html_options)
15
+ end
16
+
17
+ def _versatile_rjs_function_block_extraction(block)
18
+ VersatileRJS::Page.new(self).evaluate(&block).to_script.gsub(/[\r\n]+/, '')
19
+ end
20
+
21
+ alias_method_chain :button_to_function, :block
22
+ alias_method_chain :link_to_function, :block
23
+ end
File without changes
@@ -0,0 +1,3 @@
1
+ module VersatileRJS
2
+ module Utils;end
3
+ end
@@ -0,0 +1,39 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ require 'versatile_rjs/utils'
5
+ require 'versatile_rjs/page'
6
+ require 'versatile_rjs/proxy'
7
+ require 'versatile_rjs/template_handler'
8
+ require 'versatile_rjs/railtie'
9
+
10
+ module VersatileRJS
11
+ VERSION = '0.1.0'
12
+
13
+ class <<self
14
+ attr_accessor :javascript_framework, :debug_rjs, :default_javascript_framework
15
+ alias_method :debug_rjs?, :debug_rjs
16
+ end
17
+
18
+ self.default_javascript_framework = :jquery
19
+
20
+ def self.framework_module
21
+ javascript_framework.to_s.camelcase
22
+ end
23
+
24
+ def self.implementation_class_of(mod)
25
+
26
+ class_name_tree = mod.name.split('::')
27
+
28
+ class_dirnames = class_name_tree[0...-1]
29
+ class_basename = class_name_tree[-1]
30
+ implementation_class_name =
31
+ [class_dirnames, framework_module, class_basename].flatten.join('::')
32
+
33
+ implementation_class_name.constantize
34
+ end
35
+
36
+ def self.require_framework
37
+ require "versatile_rjs/proxy/#{javascript_framework}"
38
+ end
39
+ end
data/script/console ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ # File: script/console
3
+ irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
4
+
5
+ libs = " -r irb/completion"
6
+ # Perhaps use a console_lib to store any extra methods I may want available in the cosole
7
+ # libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
8
+ libs << " -r #{File.dirname(__FILE__) + '/../lib/versatile_rjs.rb'}"
9
+ puts "Loading versatile_rjs gem"
10
+ exec "#{irb} #{libs} --simple-prompt"
data/script/destroy ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/destroy'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
+ RubiGen::Scripts::Destroy.new.run(ARGV)
data/script/generate ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/generate'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
+ RubiGen::Scripts::Generate.new.run(ARGV)
@@ -0,0 +1,12 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+ require 'rspec'
4
+ require 'versatile_rjs'
5
+
6
+ # Requires supporting files with custom matchers and macros, etc,
7
+ # in ./support/ and its subdirectories.
8
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
9
+
10
+ RSpec.configure do |config|
11
+
12
+ end
@@ -0,0 +1,5 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "VersatileRjs" do
4
+ pending 'initialization'
5
+ end
@@ -0,0 +1,101 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{versatile_rjs}
8
+ s.version = "0.1.2"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = [%q{Kevin IMAI TOYODA}]
12
+ s.date = %q{2011-11-06}
13
+ s.description = %q{VersatileRJS: Enables RJS with Rails(3.1 or higher) and jQuery.
14
+
15
+
16
+ }
17
+ s.email = %q{condor1226@gmail.com}
18
+ s.extra_rdoc_files = [
19
+ "LICENSE.txt",
20
+ "README.rdoc"
21
+ ]
22
+ s.files = [
23
+ ".document",
24
+ ".rspec",
25
+ "Gemfile",
26
+ "History.txt",
27
+ "LICENSE.txt",
28
+ "README.rdoc",
29
+ "Rakefile",
30
+ "VERSION",
31
+ "features/step_definitions/versatile_rjs_steps.rb",
32
+ "features/support/env.rb",
33
+ "features/versatile_rjs.feature",
34
+ "init.rb",
35
+ "lib/versatile_rjs.rb",
36
+ "lib/versatile_rjs/container.rb",
37
+ "lib/versatile_rjs/page.rb",
38
+ "lib/versatile_rjs/proxy.rb",
39
+ "lib/versatile_rjs/proxy/default_responder.rb",
40
+ "lib/versatile_rjs/proxy/each_proxy.rb",
41
+ "lib/versatile_rjs/proxy/element_by_id_proxy.rb",
42
+ "lib/versatile_rjs/proxy/element_proxy.rb",
43
+ "lib/versatile_rjs/proxy/element_set_proxy.rb",
44
+ "lib/versatile_rjs/proxy/expression_proxy.rb",
45
+ "lib/versatile_rjs/proxy/framework_dependent.rb",
46
+ "lib/versatile_rjs/proxy/jquery.rb",
47
+ "lib/versatile_rjs/proxy/jquery/each_proxy.rb",
48
+ "lib/versatile_rjs/proxy/jquery/element_by_id_proxy.rb",
49
+ "lib/versatile_rjs/proxy/jquery/element_proxy.rb",
50
+ "lib/versatile_rjs/proxy/jquery/element_set.rb",
51
+ "lib/versatile_rjs/proxy/jquery/element_set_proxy.rb",
52
+ "lib/versatile_rjs/proxy/jquery/selectable.rb",
53
+ "lib/versatile_rjs/proxy/jquery/selector_proxy.rb",
54
+ "lib/versatile_rjs/proxy/selectable.rb",
55
+ "lib/versatile_rjs/proxy/selector_proxy.rb",
56
+ "lib/versatile_rjs/railtie.rb",
57
+ "lib/versatile_rjs/template_handler.rb",
58
+ "lib/versatile_rjs/to_function_ext.rb",
59
+ "lib/versatile_rjs/utils.rb",
60
+ "lib/versatile_rjs/utils/.gitignore",
61
+ "script/console",
62
+ "script/destroy",
63
+ "script/generate",
64
+ "spec/spec_helper.rb",
65
+ "spec/versatile_rjs_spec.rb",
66
+ "versatile_rjs.gemspec"
67
+ ]
68
+ s.homepage = %q{http://github.com/condor/versatile_rjs}
69
+ s.licenses = [%q{MIT}]
70
+ s.require_paths = [%q{lib}]
71
+ s.rubygems_version = %q{1.8.6}
72
+ s.summary = %q{VersatileRJS: Enables RJS with Rails(3.1 or higher) and jQuery.}
73
+
74
+ if s.respond_to? :specification_version then
75
+ s.specification_version = 3
76
+
77
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
78
+ s.add_runtime_dependency(%q<rails>, [">= 3.1.0"])
79
+ s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
80
+ s.add_development_dependency(%q<cucumber>, [">= 0"])
81
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
82
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
83
+ s.add_development_dependency(%q<rcov>, [">= 0"])
84
+ else
85
+ s.add_dependency(%q<rails>, [">= 3.1.0"])
86
+ s.add_dependency(%q<rspec>, ["~> 2.3.0"])
87
+ s.add_dependency(%q<cucumber>, [">= 0"])
88
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
89
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
90
+ s.add_dependency(%q<rcov>, [">= 0"])
91
+ end
92
+ else
93
+ s.add_dependency(%q<rails>, [">= 3.1.0"])
94
+ s.add_dependency(%q<rspec>, ["~> 2.3.0"])
95
+ s.add_dependency(%q<cucumber>, [">= 0"])
96
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
97
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
98
+ s.add_dependency(%q<rcov>, [">= 0"])
99
+ end
100
+ end
101
+
metadata ADDED
@@ -0,0 +1,203 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: versatile_rjs
3
+ version: !ruby/object:Gem::Version
4
+ hash: 31
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 2
10
+ version: 0.1.2
11
+ platform: ruby
12
+ authors:
13
+ - Kevin IMAI TOYODA
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-11-06 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ type: :runtime
22
+ requirement: &id001 !ruby/object:Gem::Requirement
23
+ none: false
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ hash: 3
28
+ segments:
29
+ - 3
30
+ - 1
31
+ - 0
32
+ version: 3.1.0
33
+ version_requirements: *id001
34
+ name: rails
35
+ prerelease: false
36
+ - !ruby/object:Gem::Dependency
37
+ type: :development
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 2
46
+ - 3
47
+ - 0
48
+ version: 2.3.0
49
+ version_requirements: *id002
50
+ name: rspec
51
+ prerelease: false
52
+ - !ruby/object:Gem::Dependency
53
+ type: :development
54
+ requirement: &id003 !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ hash: 3
60
+ segments:
61
+ - 0
62
+ version: "0"
63
+ version_requirements: *id003
64
+ name: cucumber
65
+ prerelease: false
66
+ - !ruby/object:Gem::Dependency
67
+ type: :development
68
+ requirement: &id004 !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ~>
72
+ - !ruby/object:Gem::Version
73
+ hash: 23
74
+ segments:
75
+ - 1
76
+ - 0
77
+ - 0
78
+ version: 1.0.0
79
+ version_requirements: *id004
80
+ name: bundler
81
+ prerelease: false
82
+ - !ruby/object:Gem::Dependency
83
+ type: :development
84
+ requirement: &id005 !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ hash: 7
90
+ segments:
91
+ - 1
92
+ - 6
93
+ - 4
94
+ version: 1.6.4
95
+ version_requirements: *id005
96
+ name: jeweler
97
+ prerelease: false
98
+ - !ruby/object:Gem::Dependency
99
+ type: :development
100
+ requirement: &id006 !ruby/object:Gem::Requirement
101
+ none: false
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ hash: 3
106
+ segments:
107
+ - 0
108
+ version: "0"
109
+ version_requirements: *id006
110
+ name: rcov
111
+ prerelease: false
112
+ description: |+
113
+ VersatileRJS: Enables RJS with Rails(3.1 or higher) and jQuery.
114
+
115
+
116
+ email: condor1226@gmail.com
117
+ executables: []
118
+
119
+ extensions: []
120
+
121
+ extra_rdoc_files:
122
+ - LICENSE.txt
123
+ - README.rdoc
124
+ files:
125
+ - .document
126
+ - .rspec
127
+ - Gemfile
128
+ - History.txt
129
+ - LICENSE.txt
130
+ - README.rdoc
131
+ - Rakefile
132
+ - VERSION
133
+ - features/step_definitions/versatile_rjs_steps.rb
134
+ - features/support/env.rb
135
+ - features/versatile_rjs.feature
136
+ - init.rb
137
+ - lib/versatile_rjs.rb
138
+ - lib/versatile_rjs/container.rb
139
+ - lib/versatile_rjs/page.rb
140
+ - lib/versatile_rjs/proxy.rb
141
+ - lib/versatile_rjs/proxy/default_responder.rb
142
+ - lib/versatile_rjs/proxy/each_proxy.rb
143
+ - lib/versatile_rjs/proxy/element_by_id_proxy.rb
144
+ - lib/versatile_rjs/proxy/element_proxy.rb
145
+ - lib/versatile_rjs/proxy/element_set_proxy.rb
146
+ - lib/versatile_rjs/proxy/expression_proxy.rb
147
+ - lib/versatile_rjs/proxy/framework_dependent.rb
148
+ - lib/versatile_rjs/proxy/jquery.rb
149
+ - lib/versatile_rjs/proxy/jquery/each_proxy.rb
150
+ - lib/versatile_rjs/proxy/jquery/element_by_id_proxy.rb
151
+ - lib/versatile_rjs/proxy/jquery/element_proxy.rb
152
+ - lib/versatile_rjs/proxy/jquery/element_set.rb
153
+ - lib/versatile_rjs/proxy/jquery/element_set_proxy.rb
154
+ - lib/versatile_rjs/proxy/jquery/selectable.rb
155
+ - lib/versatile_rjs/proxy/jquery/selector_proxy.rb
156
+ - lib/versatile_rjs/proxy/selectable.rb
157
+ - lib/versatile_rjs/proxy/selector_proxy.rb
158
+ - lib/versatile_rjs/railtie.rb
159
+ - lib/versatile_rjs/template_handler.rb
160
+ - lib/versatile_rjs/to_function_ext.rb
161
+ - lib/versatile_rjs/utils.rb
162
+ - lib/versatile_rjs/utils/.gitignore
163
+ - script/console
164
+ - script/destroy
165
+ - script/generate
166
+ - spec/spec_helper.rb
167
+ - spec/versatile_rjs_spec.rb
168
+ - versatile_rjs.gemspec
169
+ homepage: http://github.com/condor/versatile_rjs
170
+ licenses:
171
+ - MIT
172
+ post_install_message:
173
+ rdoc_options: []
174
+
175
+ require_paths:
176
+ - lib
177
+ required_ruby_version: !ruby/object:Gem::Requirement
178
+ none: false
179
+ requirements:
180
+ - - ">="
181
+ - !ruby/object:Gem::Version
182
+ hash: 3
183
+ segments:
184
+ - 0
185
+ version: "0"
186
+ required_rubygems_version: !ruby/object:Gem::Requirement
187
+ none: false
188
+ requirements:
189
+ - - ">="
190
+ - !ruby/object:Gem::Version
191
+ hash: 3
192
+ segments:
193
+ - 0
194
+ version: "0"
195
+ requirements: []
196
+
197
+ rubyforge_project:
198
+ rubygems_version: 1.8.6
199
+ signing_key:
200
+ specification_version: 3
201
+ summary: "VersatileRJS: Enables RJS with Rails(3.1 or higher) and jQuery."
202
+ test_files: []
203
+