dioxide_rails 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/README.rdoc +42 -0
- data/app/controllers/dioxide/api_controller.rb +53 -0
- data/config/routes.rb +21 -0
- data/lib/dioxide_rails/handlers/dioxide_handler.rb +27 -0
- data/lib/dioxide_rails/handlers.rb +15 -0
- data/lib/dioxide_rails/rpc_request.rb +56 -0
- data/lib/dioxide_rails/rpc_response.rb +36 -0
- data/lib/dioxide_rails.rb +21 -0
- data/lib/engine.rb +37 -0
- data/lib/rails/generators/dioxide_rails/dioxide_rails_generator.rb +27 -0
- data/lib/rails/generators/dioxide_rails/templates/initializer.rb +23 -0
- metadata +66 -0
data/README.rdoc
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
= Dioxide RPC Engine for Ruby on Rails
|
2
|
+
|
3
|
+
This is a server-side library designed for use with mobile applications built with Dioxide-Mobile ( https://github.com/developertown/dioxide-mobile ).
|
4
|
+
It provides a framework for RPC services that follow the Dioxide RPC protocol (Protocol documentation coming soon).
|
5
|
+
|
6
|
+
== Installation
|
7
|
+
|
8
|
+
1. Include the dioxide_rails gem in your Gemfile:
|
9
|
+
|
10
|
+
gem 'dioxide_rails', '~> 0.1'
|
11
|
+
|
12
|
+
2. Update the bundler managed gems:
|
13
|
+
|
14
|
+
$ bundle install
|
15
|
+
|
16
|
+
3. Generate the necessary initializer:
|
17
|
+
|
18
|
+
$ rails g dioxide_rails
|
19
|
+
create config/initializers/dioxide_rails.rb
|
20
|
+
|
21
|
+
4. Configure Dioxide via the initializer. Configuration documentation is specified within config/initializers/dioxide_rails.rb
|
22
|
+
|
23
|
+
== Service Implementation
|
24
|
+
|
25
|
+
Handlers are simply methods that take a Dioxide::RPCRequest object as a parameter, and return an instance of Dioxide::RPCResponse.
|
26
|
+
Dioxide::RPCResponse instances are automatically created by calling #new_response on an Dioxide::RPCRequest instance.
|
27
|
+
The simplest implementation would look like:
|
28
|
+
|
29
|
+
class MyHandler
|
30
|
+
def ping(req)
|
31
|
+
res = req.new_response
|
32
|
+
return res
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
Dixoide::RPCResponses default to a status_code of 200 and message of "OK", so this simple handler, in effect, implements a
|
37
|
+
ping service.
|
38
|
+
|
39
|
+
== License
|
40
|
+
|
41
|
+
Copyright 2011 Developer Town
|
42
|
+
Released under the Apache 2.0 License
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# Copyright 2011 Developer Town
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Dioxide
|
16
|
+
# require 'dioxide_rails'
|
17
|
+
class ApiController < ApplicationController
|
18
|
+
|
19
|
+
unloadable
|
20
|
+
|
21
|
+
def call
|
22
|
+
puts "Here's mount_at? #{Dioxide::Engine::config.mount_at}"
|
23
|
+
|
24
|
+
req = RPCRequest.new(request.body)
|
25
|
+
|
26
|
+
begin
|
27
|
+
#Locate the handler class
|
28
|
+
handlerClass = Dioxide::Engine::config.handlers[req.uri]
|
29
|
+
logger.debug("Loaded handler class #{handlerClass} for uri #{req.uri}")
|
30
|
+
|
31
|
+
handler = handlerClass.new
|
32
|
+
|
33
|
+
method = handler.method(req.method.to_sym)
|
34
|
+
|
35
|
+
res = method.call req
|
36
|
+
|
37
|
+
render :json => res
|
38
|
+
|
39
|
+
rescue Exception => e
|
40
|
+
logger.error("Error processing RPCRequest:\n#{req}")
|
41
|
+
logger.error e.backtrace.join("\n")
|
42
|
+
|
43
|
+
res = req.new_response
|
44
|
+
res.status_code = 500
|
45
|
+
res.message = "Server Error"
|
46
|
+
|
47
|
+
render :json => res
|
48
|
+
return
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
data/config/routes.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# Copyright 2011 Developer Town
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
Rails.application.routes.draw do |map|
|
16
|
+
|
17
|
+
mount_at = Dioxide::Engine.config.mount_at
|
18
|
+
|
19
|
+
match mount_at => 'dioxide/api#call', :via => [:post], :format => :json
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# Copyright 2011 Developer Town
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Dioxide
|
16
|
+
|
17
|
+
# A simple handler class to server as a demonstration handler,
|
18
|
+
# and to fulfill a sometimes useful ping functionality, if desired.
|
19
|
+
class DioxideHandler
|
20
|
+
|
21
|
+
# This simple creates a new response and returns it
|
22
|
+
# (new responses default to status_code 200 and message 'OK')
|
23
|
+
def ping(req)
|
24
|
+
req.new_response
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# Copyright 2011 Developer Town
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require File.dirname(__FILE__) + '/handlers/dioxide_handler'
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# Copyright 2011 Developer Town
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'dioxide_rails/rpc_response'
|
16
|
+
|
17
|
+
module Dioxide
|
18
|
+
# This class wraps up an RPC Request of the following form (represented here as a hash):
|
19
|
+
#
|
20
|
+
# {
|
21
|
+
# :request_id => 0,
|
22
|
+
# :uri => "/users",
|
23
|
+
# :method => "create",
|
24
|
+
# :device_id => "235234-2342-234-234-2342",
|
25
|
+
# :session_id => "asdf980808as0df090a9d",
|
26
|
+
# :payload => {foo: 'bar'}
|
27
|
+
# }
|
28
|
+
|
29
|
+
class RPCRequest
|
30
|
+
attr_reader :request_id, :uri, :method, :device_id, :session_id, :payload
|
31
|
+
|
32
|
+
def initialize(req)
|
33
|
+
if (req.class != Hash)
|
34
|
+
req = ActiveSupport::JSON.decode(req)
|
35
|
+
end
|
36
|
+
|
37
|
+
raise Exception.new("RPC Request is missing required parameter: uri") unless req.has_key?("uri")
|
38
|
+
raise Exception.new("RPC Request is missing required parameter: method") unless req.has_key?("method")
|
39
|
+
|
40
|
+
@request_id = req["request_id"]
|
41
|
+
@uri = req["uri"]
|
42
|
+
@method = req["method"]
|
43
|
+
@device_id = req["device_id"]
|
44
|
+
@session_id = req["session_id"]
|
45
|
+
@payload = req["payload"]
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_s
|
49
|
+
to_json
|
50
|
+
end
|
51
|
+
|
52
|
+
def new_response
|
53
|
+
RPCResponse.new(@request_id)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# Copyright 2011 Developer Town
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Dioxide
|
16
|
+
# This class wraps up an RPC Response of the following form (represented here as a hash):
|
17
|
+
#
|
18
|
+
# {
|
19
|
+
# :request_id => 0,
|
20
|
+
# :status_code => 200,
|
21
|
+
# :message => "OK",
|
22
|
+
# :payload => {foo: 'bar'}
|
23
|
+
# }
|
24
|
+
|
25
|
+
class RPCResponse
|
26
|
+
|
27
|
+
attr_accessor :request_id, :status_code, :message, :payload
|
28
|
+
|
29
|
+
def initialize(request_id)
|
30
|
+
@request_id = request_id
|
31
|
+
@status_code = 200
|
32
|
+
@message = "OK"
|
33
|
+
@payload = {}
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# Copyright 2011 Developer Town
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Dioxide
|
16
|
+
require 'engine' if defined?(Rails) && Rails::VERSION::MAJOR == 3
|
17
|
+
require 'dioxide_rails/rpc_request'
|
18
|
+
require 'dioxide_rails/rpc_response'
|
19
|
+
require 'dioxide_rails/handlers'
|
20
|
+
end
|
21
|
+
|
data/lib/engine.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# Copyright 2011 Developer Town
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'dioxide_rails'
|
16
|
+
require 'rails'
|
17
|
+
require 'action_controller'
|
18
|
+
|
19
|
+
module Dioxide
|
20
|
+
class Engine < Rails::Engine
|
21
|
+
|
22
|
+
# Config defaults
|
23
|
+
config.mount_at = '/api'
|
24
|
+
|
25
|
+
# Load rake tasks
|
26
|
+
rake_tasks do
|
27
|
+
load File.join(File.dirname(__FILE__), 'rails/railties/tasks.rake')
|
28
|
+
end
|
29
|
+
|
30
|
+
# Check the gem config
|
31
|
+
initializer "check config" do |app|
|
32
|
+
|
33
|
+
# make sure mount_at ends with trailing slash
|
34
|
+
config.mount_at += '/' unless config.mount_at.last == '/'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# Copyright 2011 Developer Town
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'rails/generators'
|
16
|
+
require 'rails/generators/migration'
|
17
|
+
|
18
|
+
class DioxideRailsGenerator < Rails::Generators::Base
|
19
|
+
|
20
|
+
def self.source_root
|
21
|
+
File.join(File.dirname(__FILE__), 'templates')
|
22
|
+
end
|
23
|
+
|
24
|
+
def copy_initializer_file
|
25
|
+
copy_file 'initializer.rb', 'config/initializers/dioxide_rails.rb'
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Dioxide
|
2
|
+
class Engine < Rails::Engine
|
3
|
+
|
4
|
+
# Step 1:
|
5
|
+
# Configure the mount point for the RPC API handler
|
6
|
+
config.mount_at = '/api'
|
7
|
+
|
8
|
+
|
9
|
+
# Step 2:
|
10
|
+
# Add any necessary require statements here to include your handler classes
|
11
|
+
# e.g., for a handler class in RAILS_ROOT/lib/users_handler.rb:
|
12
|
+
|
13
|
+
# require 'users_handler'
|
14
|
+
|
15
|
+
# Step 3:
|
16
|
+
# Map URIs to handlers
|
17
|
+
config.handlers = {
|
18
|
+
"/dioxide" => Dioxide::DioxideHandler,
|
19
|
+
#"/users" => ::UsersHandler
|
20
|
+
}
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
metadata
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dioxide_rails
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.1.0
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Jason Vasquez
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-02-10 00:00:00 -05:00
|
14
|
+
default_executable:
|
15
|
+
dependencies: []
|
16
|
+
|
17
|
+
description:
|
18
|
+
email: admin@developertown.com
|
19
|
+
executables: []
|
20
|
+
|
21
|
+
extensions: []
|
22
|
+
|
23
|
+
extra_rdoc_files:
|
24
|
+
- README.rdoc
|
25
|
+
files:
|
26
|
+
- app/controllers/dioxide/api_controller.rb
|
27
|
+
- config/routes.rb
|
28
|
+
- lib/dioxide_rails.rb
|
29
|
+
- lib/dioxide_rails/handlers.rb
|
30
|
+
- lib/dioxide_rails/handlers/dioxide_handler.rb
|
31
|
+
- lib/dioxide_rails/rpc_request.rb
|
32
|
+
- lib/dioxide_rails/rpc_response.rb
|
33
|
+
- lib/engine.rb
|
34
|
+
- lib/rails/generators/dioxide_rails/dioxide_rails_generator.rb
|
35
|
+
- lib/rails/generators/dioxide_rails/templates/initializer.rb
|
36
|
+
- README.rdoc
|
37
|
+
has_rdoc: true
|
38
|
+
homepage:
|
39
|
+
licenses: []
|
40
|
+
|
41
|
+
post_install_message:
|
42
|
+
rdoc_options: []
|
43
|
+
|
44
|
+
require_paths:
|
45
|
+
- lib
|
46
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
47
|
+
none: false
|
48
|
+
requirements:
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: "0"
|
52
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: "0"
|
58
|
+
requirements: []
|
59
|
+
|
60
|
+
rubyforge_project:
|
61
|
+
rubygems_version: 1.5.0
|
62
|
+
signing_key:
|
63
|
+
specification_version: 3
|
64
|
+
summary: Ruby On Rails implementation of the Dioxide RPC framework
|
65
|
+
test_files: []
|
66
|
+
|