rubyamf-ouvrages 2.0.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 +6 -0
- data/Gemfile +22 -0
- data/README.rdoc +105 -0
- data/Rakefile +21 -0
- data/lib/rubyamf.rb +64 -0
- data/lib/rubyamf/class_mapping.rb +239 -0
- data/lib/rubyamf/configuration.rb +272 -0
- data/lib/rubyamf/envelope.rb +102 -0
- data/lib/rubyamf/fault.rb +31 -0
- data/lib/rubyamf/gateway.png +0 -0
- data/lib/rubyamf/intermediate_object.rb +18 -0
- data/lib/rubyamf/logger.rb +39 -0
- data/lib/rubyamf/model.rb +215 -0
- data/lib/rubyamf/rails/controller.rb +23 -0
- data/lib/rubyamf/rails/model.rb +151 -0
- data/lib/rubyamf/rails/rails2_bootstrap.rb +73 -0
- data/lib/rubyamf/rails/rails3_bootstrap.rb +53 -0
- data/lib/rubyamf/rails/request_processor.rb +90 -0
- data/lib/rubyamf/rails/routing.rb +97 -0
- data/lib/rubyamf/rails/time.rb +6 -0
- data/lib/rubyamf/request_parser.rb +99 -0
- data/lib/rubyamf/test.rb +61 -0
- data/lib/rubyamf/version.rb +3 -0
- data/rubyamf.gemspec +26 -0
- data/spec/class_mapping_spec.rb +147 -0
- data/spec/configuration_spec.rb +90 -0
- data/spec/envelope_spec.rb +106 -0
- data/spec/fixtures/remotingMessage.bin +0 -0
- data/spec/fixtures/requestWithNewCredentials.bin +0 -0
- data/spec/fixtures/requestWithOldCredentials.bin +0 -0
- data/spec/fixtures/rubyamf_config.rb +24 -0
- data/spec/model_spec.rb +281 -0
- data/spec/rails_integration_spec.rb +22 -0
- data/spec/rails_routing_spec.rb +75 -0
- data/spec/request_parser_spec.rb +52 -0
- data/spec/request_processor_spec.rb +119 -0
- data/spec/spec_helper.rb +58 -0
- metadata +103 -0
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
require 'active_support/time_with_zone'
|
3
|
+
|
4
|
+
describe "Rails integration" do
|
5
|
+
it "should serialize TimeWithZone properly" do
|
6
|
+
zone = ActiveSupport::TimeZone.new('America/New_York')
|
7
|
+
time = Time.utc(2003, 2, 13, 0)
|
8
|
+
time_with_zone = ActiveSupport::TimeWithZone.new(time.getutc, zone)
|
9
|
+
RocketAMF.serialize(time_with_zone, 3).should == RocketAMF.serialize(time, 3)
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "Rails 3", :if => Rails::VERSION::MAJOR == 3 do
|
13
|
+
it "should convert ActiveRecord::Relation to array for serialization" do
|
14
|
+
rel = Parent.where(:name => 'a')
|
15
|
+
rel.should be_a ActiveRecord::Relation
|
16
|
+
|
17
|
+
ser = RocketAMF.serialize(rel, 3)
|
18
|
+
des = RocketAMF.deserialize(ser, 3)
|
19
|
+
des.should be_a(Array)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require "spec_helper.rb"
|
2
|
+
require "rubyamf/rails/routing"
|
3
|
+
|
4
|
+
describe RubyAMF::Rails::Routing do
|
5
|
+
include RubyAMF::Rails::Routing
|
6
|
+
def test_map *args
|
7
|
+
map_amf *args
|
8
|
+
@mappings = RubyAMF.configuration.param_mappings
|
9
|
+
if @mappings.size == 1
|
10
|
+
@controller, @action = @mappings.keys[0].split("#")
|
11
|
+
@params = @mappings.values[0]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
before :each do
|
16
|
+
RubyAMF.configuration = RubyAMF::Configuration.new # Reset configuration
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should support string style call" do
|
20
|
+
test_map("user#show", [:asdf, :fdsa])
|
21
|
+
@controller.should == "UserController"
|
22
|
+
@action.should == "show"
|
23
|
+
@params.should == [:asdf, :fdsa]
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should support option style call" do
|
27
|
+
test_map(:controller => "user", :action => "show", :params => [:asdf, :fdsa])
|
28
|
+
@controller.should == "UserController"
|
29
|
+
@action.should == "show"
|
30
|
+
@params.should == [:asdf, :fdsa]
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should not camelize controller name if already camelized" do
|
34
|
+
test_map(:controller => "AdminController", :action => "login", :params => [])
|
35
|
+
@controller.should == "AdminController"
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should support module-style namespace for non-rails" do
|
39
|
+
test_map("user#show", [], {:namespace => "NamespaceComplex::Nested"})
|
40
|
+
@controller.should == "NamespaceComplex::Nested::UserController"
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should support multiple action mapping" do
|
44
|
+
test_map(:user, "show" => [:asdf, :fdsa], :login => [:fdsa, :asdf])
|
45
|
+
@mappings["UserController#show"].should == [:asdf, :fdsa]
|
46
|
+
@mappings["UserController#login"].should == [:fdsa, :asdf]
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "Rails 2" do
|
50
|
+
it "should recognize namespace with string style call" do
|
51
|
+
test_map(:controller => "user", :action => "show", :params => [], :namespace => "namespace_complex/nested")
|
52
|
+
@controller.should == "NamespaceComplex::Nested::UserController"
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should recognize namespace with option style call" do
|
56
|
+
test_map("user#show", [], {:namespace => "namespace/nested"})
|
57
|
+
@controller.should == "Namespace::Nested::UserController"
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should recognize namespace with multiple action style call" do
|
61
|
+
test_map(:user, "show" => [:asdf, :fdsa], :login => [:fdsa, :asdf], :namespace => "namespace/nested")
|
62
|
+
@mappings.size.should == 2
|
63
|
+
@mappings["Namespace::Nested::UserController#show"].should == [:asdf, :fdsa]
|
64
|
+
@mappings["Namespace::Nested::UserController#login"].should == [:fdsa, :asdf]
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "Rails 3" do
|
69
|
+
it "should recognize namespace" do
|
70
|
+
@scope = {:module => "namespace/nested"}
|
71
|
+
test_map("user#show", [])
|
72
|
+
@controller.should == "Namespace::Nested::UserController"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
|
3
|
+
describe RubyAMF::RequestParser do
|
4
|
+
before :each do
|
5
|
+
@mock_next = mock("Middleware")
|
6
|
+
@app = RubyAMF::RequestParser.new(@mock_next)
|
7
|
+
@conf = RubyAMF.configuration = RubyAMF::Configuration.new
|
8
|
+
@conf.gateway_path = "/amf"
|
9
|
+
@env = {
|
10
|
+
'PATH_INFO' => '/amf',
|
11
|
+
'CONTENT_TYPE' => RubyAMF::MIME_TYPE,
|
12
|
+
'rack.input' => StringIO.new(RocketAMF::Envelope.new.to_s)
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should send HTML page if enabled for gateway requests" do
|
17
|
+
@env['CONTENT_TYPE'] = 'text/html'
|
18
|
+
@app.call(@env)[2].first.should =~ /html/
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should send image if HTML page enabled" do
|
22
|
+
@env['PATH_INFO'] = "/amf/gateway.png"
|
23
|
+
@app.call(@env)[1]['Content-Type'].should == 'image/png'
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should not send HTML page if not enabled" do
|
27
|
+
@conf.show_html_gateway = false
|
28
|
+
@env['CONTENT_TYPE'] = 'text/html'
|
29
|
+
@mock_next.should_receive(:call).and_return("success")
|
30
|
+
@app.call(@env).should == "success"
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should pass through requests that aren't AMF" do
|
34
|
+
@env['PATH_INFO'] = "/invalid"
|
35
|
+
@mock_next.should_receive(:call).and_return("success")
|
36
|
+
@app.call(@env).should == "success"
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should serialize to AMF if the response is constructed" do
|
40
|
+
@mock_next.stub!(:call) {|env| env['rubyamf.response'].should_receive('constructed?').and_return(true)}
|
41
|
+
RubyAMF.should_receive('logger').and_return(Logger.new(nil)) # Silence logging
|
42
|
+
response = @app.call(@env)
|
43
|
+
response[1]["Content-Type"].should == RubyAMF::MIME_TYPE
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should send a 400 if there's a deserialize error" do
|
47
|
+
@env['rack.input'] = StringIO.new(0xFF.chr) # Invalid AMF stream
|
48
|
+
response = @app.call(@env)
|
49
|
+
response[0].should == 400
|
50
|
+
response[1]["Content-Type"].should == 'text/plain'
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
describe RubyAMF::Rails::RequestProcessor do
|
2
|
+
before :all do
|
3
|
+
class AmfTestController < ActionController::Base
|
4
|
+
def self._routes
|
5
|
+
@_routes ||= ActionDispatch::Routing::RouteSet.new
|
6
|
+
end
|
7
|
+
|
8
|
+
def simple_test
|
9
|
+
render :amf => "success"
|
10
|
+
end
|
11
|
+
|
12
|
+
def is_amf_test
|
13
|
+
render :amf => is_amf?
|
14
|
+
end
|
15
|
+
|
16
|
+
def params_test
|
17
|
+
render :amf => params
|
18
|
+
end
|
19
|
+
|
20
|
+
def scope_test
|
21
|
+
render :amf => {:prop_a => "asdf"}, :mapping_scope => :test_scope
|
22
|
+
end
|
23
|
+
|
24
|
+
def raise_test
|
25
|
+
raise "exception raised"
|
26
|
+
end
|
27
|
+
|
28
|
+
def fault_test
|
29
|
+
render :amf => FaultObject.new("exception raised")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
before :each do
|
35
|
+
@mock_next = mock("Middleware")
|
36
|
+
@app = RubyAMF::Rails::RequestProcessor.new(@mock_next)
|
37
|
+
@conf = RubyAMF.configuration = RubyAMF::Configuration.new
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should pass through if not AMF" do
|
41
|
+
env = Rack::MockRequest.env_for('/amf')
|
42
|
+
@mock_next.should_receive(:call).and_return("success")
|
43
|
+
@app.call(env).should == "success"
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should call proper controller" do
|
47
|
+
env = RubyAMF::Test.create_call 3, "AmfTestController.simple_test"
|
48
|
+
@app.call(env)
|
49
|
+
env['rubyamf.response'].result.should == "success"
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should underscore the method name if it can't find it normally" do
|
53
|
+
env = RubyAMF::Test.create_call 3, "AmfTestController.simpleTest"
|
54
|
+
@app.call(env)
|
55
|
+
env['rubyamf.response'].result.should == "success"
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should should support is_amf? in controller" do
|
59
|
+
env = RubyAMF::Test.create_call 3, "AmfTestController.is_amf_test"
|
60
|
+
@app.call(env)
|
61
|
+
env['rubyamf.response'].result.should == true
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should return an exception if the controller doesn't exist" do
|
65
|
+
env = RubyAMF::Test.create_call 3, "Kernel.exec", "puts 'Muhahaha!'"
|
66
|
+
@app.call(env)
|
67
|
+
err = env['rubyamf.response'].messages[0].data
|
68
|
+
err.should be_a(RocketAMF::Values::ErrorMessage)
|
69
|
+
err.faultString.should == "Service KernelController does not exist"
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should return an exception if the controller doesn't respond to the action" do
|
73
|
+
env = RubyAMF::Test.create_call 3, "AmfTestController.non_existant"
|
74
|
+
@app.call(env)
|
75
|
+
err = env['rubyamf.response'].messages[0].data
|
76
|
+
err.should be_a(RocketAMF::Values::ErrorMessage)
|
77
|
+
err.faultString.should == "Service AmfTestController does not respond to non_existant"
|
78
|
+
end
|
79
|
+
|
80
|
+
it "shouldn't populate params hash if disabled" do
|
81
|
+
@conf.populate_params_hash = false
|
82
|
+
env = RubyAMF::Test.create_call 3, "AmfTestController.params_test", 1, 2, 3
|
83
|
+
@app.call(env)
|
84
|
+
params = env['rubyamf.response'].result
|
85
|
+
["action", "controller"].each {|k| params.delete(k)} # Certain versions of rails 2.X don't remove them
|
86
|
+
params.should == {}
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should map parameters if configured" do
|
90
|
+
@conf.map_params "AmfTestController", "params_test", [:param_1, :param_2, :param_3]
|
91
|
+
env = RubyAMF::Test.create_call 3, "AmfTestController.params_test", "asdf", "fdsa", 5
|
92
|
+
@app.call(env)
|
93
|
+
params = env['rubyamf.response'].result
|
94
|
+
params[1].should == "fdsa"
|
95
|
+
params[:param_1].should == "asdf"
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should save mapping scope if rendered with one" do
|
99
|
+
env = RubyAMF::Test.create_call 3, "AmfTestController.scope_test"
|
100
|
+
@app.call(env)
|
101
|
+
env['rubyamf.response'].mapping_scope.should == :test_scope
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should catch and handle raised exceptions" do
|
105
|
+
env = RubyAMF::Test.create_call 3, "AmfTestController.raise_test"
|
106
|
+
@app.call(env)
|
107
|
+
err = env['rubyamf.response'].messages[0].data
|
108
|
+
err.should be_a(RocketAMF::Values::ErrorMessage)
|
109
|
+
err.faultString.should == "exception raised"
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should catch and handle returned FaultObjects" do
|
113
|
+
env = RubyAMF::Test.create_call 3, "AmfTestController.fault_test"
|
114
|
+
@app.call(env)
|
115
|
+
err = env['rubyamf.response'].messages[0].data
|
116
|
+
err.should be_a(RocketAMF::Values::ErrorMessage)
|
117
|
+
err.faultString.should == "exception raised"
|
118
|
+
end
|
119
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
|
4
|
+
require 'rspec'
|
5
|
+
require 'rspec/autorun'
|
6
|
+
|
7
|
+
begin
|
8
|
+
# Rails 3+
|
9
|
+
require 'rails'
|
10
|
+
rescue LoadError => e
|
11
|
+
# Rails 2.3
|
12
|
+
require 'initializer'
|
13
|
+
RAILS_ROOT = File.dirname(__FILE__)
|
14
|
+
Rails.configuration = Rails::Configuration.new
|
15
|
+
end
|
16
|
+
|
17
|
+
# Active record setup
|
18
|
+
require 'active_record'
|
19
|
+
ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
|
20
|
+
ActiveRecord::Base.logger = Logger.new(STDOUT)
|
21
|
+
require 'composite_primary_keys'
|
22
|
+
|
23
|
+
ActiveRecord::Schema.define do
|
24
|
+
create_table "parents" do |t|
|
25
|
+
t.string "name"
|
26
|
+
end
|
27
|
+
create_table "homes" do |t|
|
28
|
+
t.string "address"
|
29
|
+
t.integer "parent_id"
|
30
|
+
end
|
31
|
+
create_table "children" do |t|
|
32
|
+
t.string "name"
|
33
|
+
t.integer "parent_id"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class Parent < ActiveRecord::Base
|
38
|
+
has_many :children
|
39
|
+
has_one :home
|
40
|
+
end
|
41
|
+
|
42
|
+
class Home < ActiveRecord::Base
|
43
|
+
belongs_to :parent
|
44
|
+
end
|
45
|
+
|
46
|
+
class Child < ActiveRecord::Base
|
47
|
+
belongs_to :parent
|
48
|
+
attr_accessor :meth
|
49
|
+
end
|
50
|
+
|
51
|
+
class CompositeChild < ActiveRecord::Base
|
52
|
+
set_table_name "children"
|
53
|
+
set_primary_keys :id, :name
|
54
|
+
end
|
55
|
+
|
56
|
+
# Load RubyAMF
|
57
|
+
require 'rubyamf'
|
58
|
+
RubyAMF.bootstrap
|
metadata
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rubyamf-ouvrages
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 2.0.0
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Stephen Augenstein
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2013-05-03 00:00:00 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: activesupport
|
17
|
+
prerelease: false
|
18
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
19
|
+
none: false
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "2.3"
|
24
|
+
type: :runtime
|
25
|
+
version_requirements: *id001
|
26
|
+
description: RubyAMF is an open source flash remoting gateway for Ruby on Rails and other Rack-based web frameworks.
|
27
|
+
email:
|
28
|
+
- perl.programmer@gmail.com
|
29
|
+
executables: []
|
30
|
+
|
31
|
+
extensions: []
|
32
|
+
|
33
|
+
extra_rdoc_files:
|
34
|
+
- README.rdoc
|
35
|
+
files:
|
36
|
+
- .gitignore
|
37
|
+
- Gemfile
|
38
|
+
- README.rdoc
|
39
|
+
- Rakefile
|
40
|
+
- lib/rubyamf.rb
|
41
|
+
- lib/rubyamf/class_mapping.rb
|
42
|
+
- lib/rubyamf/configuration.rb
|
43
|
+
- lib/rubyamf/envelope.rb
|
44
|
+
- lib/rubyamf/fault.rb
|
45
|
+
- lib/rubyamf/gateway.png
|
46
|
+
- lib/rubyamf/intermediate_object.rb
|
47
|
+
- lib/rubyamf/logger.rb
|
48
|
+
- lib/rubyamf/model.rb
|
49
|
+
- lib/rubyamf/rails/controller.rb
|
50
|
+
- lib/rubyamf/rails/model.rb
|
51
|
+
- lib/rubyamf/rails/rails2_bootstrap.rb
|
52
|
+
- lib/rubyamf/rails/rails3_bootstrap.rb
|
53
|
+
- lib/rubyamf/rails/request_processor.rb
|
54
|
+
- lib/rubyamf/rails/routing.rb
|
55
|
+
- lib/rubyamf/rails/time.rb
|
56
|
+
- lib/rubyamf/request_parser.rb
|
57
|
+
- lib/rubyamf/test.rb
|
58
|
+
- lib/rubyamf/version.rb
|
59
|
+
- rubyamf.gemspec
|
60
|
+
- spec/class_mapping_spec.rb
|
61
|
+
- spec/configuration_spec.rb
|
62
|
+
- spec/envelope_spec.rb
|
63
|
+
- spec/fixtures/remotingMessage.bin
|
64
|
+
- spec/fixtures/requestWithNewCredentials.bin
|
65
|
+
- spec/fixtures/requestWithOldCredentials.bin
|
66
|
+
- spec/fixtures/rubyamf_config.rb
|
67
|
+
- spec/model_spec.rb
|
68
|
+
- spec/rails_integration_spec.rb
|
69
|
+
- spec/rails_routing_spec.rb
|
70
|
+
- spec/request_parser_spec.rb
|
71
|
+
- spec/request_processor_spec.rb
|
72
|
+
- spec/spec_helper.rb
|
73
|
+
homepage: ""
|
74
|
+
licenses: []
|
75
|
+
|
76
|
+
post_install_message:
|
77
|
+
rdoc_options:
|
78
|
+
- --line-numbers
|
79
|
+
- --main
|
80
|
+
- README.rdoc
|
81
|
+
require_paths:
|
82
|
+
- lib
|
83
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
84
|
+
none: false
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: "0"
|
89
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: "0"
|
95
|
+
requirements: []
|
96
|
+
|
97
|
+
rubyforge_project: rubyamf
|
98
|
+
rubygems_version: 1.8.23
|
99
|
+
signing_key:
|
100
|
+
specification_version: 3
|
101
|
+
summary: AMF remoting for Ruby and Rails
|
102
|
+
test_files: []
|
103
|
+
|