sads_xml 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README +8 -0
  3. data/Rakefile +38 -0
  4. data/app/views/layouts/sads_xml.html.erb +9 -0
  5. data/app/views/sads_xml/sads.html.erb +126 -0
  6. data/lib/sads_xml/controller_additions.rb +61 -0
  7. data/lib/sads_xml/sads.rb +166 -0
  8. data/lib/sads_xml/version.rb +3 -0
  9. data/lib/sads_xml.rb +9 -0
  10. data/test/dummy/README.rdoc +261 -0
  11. data/test/dummy/Rakefile +7 -0
  12. data/test/dummy/app/assets/javascripts/application.js +15 -0
  13. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  14. data/test/dummy/app/controllers/application_controller.rb +3 -0
  15. data/test/dummy/app/controllers/ussd/default_controller.rb +9 -0
  16. data/test/dummy/app/helpers/application_helper.rb +2 -0
  17. data/test/dummy/app/helpers/ussd/default_helper.rb +2 -0
  18. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  19. data/test/dummy/config/application.rb +56 -0
  20. data/test/dummy/config/boot.rb +10 -0
  21. data/test/dummy/config/database.yml +25 -0
  22. data/test/dummy/config/environment.rb +5 -0
  23. data/test/dummy/config/environments/development.rb +37 -0
  24. data/test/dummy/config/environments/production.rb +67 -0
  25. data/test/dummy/config/environments/test.rb +37 -0
  26. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  27. data/test/dummy/config/initializers/inflections.rb +15 -0
  28. data/test/dummy/config/initializers/mime_types.rb +5 -0
  29. data/test/dummy/config/initializers/secret_token.rb +7 -0
  30. data/test/dummy/config/initializers/session_store.rb +8 -0
  31. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  32. data/test/dummy/config/locales/en.yml +5 -0
  33. data/test/dummy/config/routes.rb +62 -0
  34. data/test/dummy/config.ru +4 -0
  35. data/test/dummy/db/development.sqlite3 +0 -0
  36. data/test/dummy/db/test.sqlite3 +0 -0
  37. data/test/dummy/log/development.log +337 -0
  38. data/test/dummy/log/test.log +133 -0
  39. data/test/dummy/public/404.html +26 -0
  40. data/test/dummy/public/422.html +26 -0
  41. data/test/dummy/public/500.html +25 -0
  42. data/test/dummy/public/favicon.ico +0 -0
  43. data/test/dummy/script/rails +6 -0
  44. data/test/dummy/test/functional/ussd/default_controller_test.rb +9 -0
  45. data/test/dummy/test/unit/helpers/ussd/default_helper_test.rb +4 -0
  46. data/test/dummy/tmp/cache/assets/CB1/D30/sprockets%2F7b6a97d2209a681f2bebe34655163319 +0 -0
  47. data/test/dummy/tmp/cache/assets/CBF/3F0/sprockets%2F7bd700995054fc7f6e3dd46729840f41 +0 -0
  48. data/test/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
  49. data/test/dummy/tmp/cache/assets/CF8/240/sprockets%2Fa77e8c483f757a8dde25486509c30e49 +0 -0
  50. data/test/dummy/tmp/cache/assets/CFA/270/sprockets%2Fd02325a0101297b802b9d58bf528daad +0 -0
  51. data/test/dummy/tmp/cache/assets/D15/F00/sprockets%2Fecc50cf25fa3f5a19523f1167447499e +0 -0
  52. data/test/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  53. data/test/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
  54. data/test/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
  55. data/test/dummy/tmp/cache/assets/D87/660/sprockets%2F1ae8d4faaefc28a0e004e1363156a41f +0 -0
  56. data/test/dummy/tmp/cache/assets/D9D/DE0/sprockets%2Fa9c151cfd3ded7726c52d078c35ac71f +0 -0
  57. data/test/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
  58. data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  59. data/test/dummy/tmp/cache/assets/E43/620/sprockets%2Fa1fde4a5eaab0961220acbd9def065aa +0 -0
  60. data/test/sads_xml_test.rb +108 -0
  61. data/test/test_helper.rb +14 -0
  62. metadata +186 -0
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2012 InnoHub, Inc.
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 ADDED
@@ -0,0 +1,8 @@
1
+ SadsXml
2
+ =======
3
+
4
+ Rails plugin for Eyeline's SADS XML format.
5
+
6
+ This is a work in progress.
7
+
8
+ Copyright (c) 2012 [Andrew Angelo Ang], released under the MIT license
data/Rakefile ADDED
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ require 'rdoc/rdoc'
11
+ require 'rake/rdoctask'
12
+ RDoc::Task = Rake::RDocTask
13
+ end
14
+
15
+ RDoc::Task.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'SadsXml'
18
+ rdoc.options << '--line-numbers'
19
+ rdoc.rdoc_files.include('README.rdoc')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
22
+
23
+
24
+
25
+
26
+ Bundler::GemHelper.install_tasks
27
+
28
+ require 'rake/testtask'
29
+
30
+ Rake::TestTask.new(:test) do |t|
31
+ t.libs << 'lib'
32
+ t.libs << 'test'
33
+ t.pattern = 'test/**/*_test.rb'
34
+ t.verbose = false
35
+ end
36
+
37
+
38
+ task :default => :test
@@ -0,0 +1,9 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>SADS Emulator</title>
5
+ </head>
6
+ <body>
7
+ <%= yield %>
8
+ </body>
9
+ </html>
@@ -0,0 +1,126 @@
1
+ <style type="text/css">
2
+ #ussd-info {
3
+ margin-top: 8px;
4
+ margin-bottom: 8px;
5
+ padding: 8px;
6
+ font-family: verdana;
7
+ background: green;
8
+ color: white;
9
+ }
10
+
11
+ #screen {
12
+ font-family: Menlo, Monaco, Consolas, Monospace;
13
+ font-size: 1em;
14
+ width: 360px;
15
+ background: #AAA;
16
+ padding: 8px;
17
+ float: left;
18
+ }
19
+
20
+ #sms {
21
+ font-family: Menlo, Monaco, Consolas, Monospace;
22
+ font-size: 1em;
23
+ width: 360px;
24
+ padding: 8px;
25
+ float: left;
26
+ float: left;
27
+ background: #DDD;
28
+ }
29
+
30
+ #forms {
31
+ margin-top: 8px;
32
+ margin-bottom: 8px;
33
+ padding: 8px;
34
+ font-family: verdana;
35
+ background: green;
36
+ color: white;
37
+ }
38
+
39
+ .clear { clear: both; }
40
+ </style>
41
+
42
+ <div id="ussd-info">
43
+ <table>
44
+ <tr>
45
+ <th>Length</th>
46
+ <th>Pages</th>
47
+ </tr>
48
+ <tr>
49
+ <td><%= @sads.ussd_length %></td>
50
+ <td>Not Implemented</td>
51
+ </tr>
52
+ </table>
53
+ </div>
54
+
55
+ <div id="phone-viewport">
56
+ <div id="screen">
57
+ <% unless @sads.title.blank? %>
58
+ <%= @sads.title %>:
59
+ <br />
60
+ <% end %>
61
+
62
+ <% if @sads.banner_position == :top and @sads.banner_targets.any? -%>
63
+ {Ad=[<%= @sads.banner_targets.join(',') %>]}
64
+ <br />
65
+ <% end -%>
66
+
67
+ <% @sads.messages.each do |key, message| -%>
68
+ <% if key != :bottom -%>
69
+ <%= raw message.gsub(/\r/, '<br />') -%>
70
+ <br />
71
+ <% end -%>
72
+ <% end -%>
73
+ <% @sads.navigations.each do |key,links| %>
74
+ <% links.each do |link| %>
75
+
76
+ <% link[:pageId] = link[:pageId] %>
77
+ <% if link[:pageId].index("?") %>
78
+ <% link[:pageId].sub!("?", "?abonent=#{CGI.escape(params[:abonent])}&") %>
79
+ <% else %>
80
+ <% link[:pageId] += "?abonent=#{CGI.escape(params[:abonent])}" %>
81
+ <% end %>
82
+
83
+ <%= link_to raw("#{link[:accesskey]}&gt;#{link[:title]}"), link[:pageId] %>
84
+ <br />
85
+ <% end %>
86
+ <% end %>
87
+ <% @sads.messages.each do |key, message| %>
88
+ <% if key == :bottom %>
89
+ <%= raw message.gsub(/\r/, '<br />') %>
90
+ <br />
91
+ <% end %>
92
+ <% end %>
93
+
94
+ <% @sads.inputs.each do |input| %>
95
+ <%= input[:title] %>&gt;<br />
96
+ <% end %>
97
+
98
+ <% if @sads.banner_position == :bottom and @sads.banner_targets.any? %>
99
+ {Ad=[<%= @sads.banner_targets.join(',') %>]}
100
+ <% end %>
101
+ </div>
102
+ <div id="sms">
103
+ <% if not @sads.sms_message.blank? %>
104
+ <%= raw @sads.sms_message.gsub(/\r/, '<br />') %>
105
+ <% end %>
106
+ </div>
107
+ <div class="clear"></div>
108
+
109
+ <div id="forms">
110
+ Emulated (Not shown on Phone)
111
+ <% @sads.inputs.each do |input| %>
112
+ <% submit_page = @sads.submit_page %>
113
+ <% if submit_page.index("?") %>
114
+ <% submit_page.sub!("?", "?abonent=#{CGI.escape(params[:abonent])}&") %>
115
+ <% else %>
116
+ <% submit_page += "?abonent=#{CGI.escape(params[:abonent])}" %>
117
+ <% end %>
118
+
119
+ <%= form_tag submit_page do |f| %>
120
+ <label><%= input[:title] %>:</label> <%= text_field_tag input[:name], '' %>
121
+ <%= submit_tag 'Submit' %>
122
+ <% end %>
123
+ <hr />
124
+ <% end %>
125
+ </div>
126
+ </div>
@@ -0,0 +1,61 @@
1
+ module SadsXml
2
+ module ControllerAdditions
3
+ def self.included(base)
4
+ base.extend ClassMethods
5
+ end
6
+
7
+ module ClassMethods
8
+ def enable_sads
9
+ send :include, InstanceMethods
10
+
11
+ skip_before_filter :verify_authenticity_token
12
+ around_filter :process_sads_request
13
+ end
14
+ end
15
+
16
+ module InstanceMethods
17
+
18
+ def process_sads_request
19
+ setup_sads_request
20
+ yield
21
+
22
+ # Check ActionController::Responder
23
+ # This doesn't work for now, see how to implement this
24
+ # for DRYing the methods in the controller
25
+ # respond_with_sads
26
+ end
27
+
28
+ def setup_sads_request
29
+ # Get WHOISD Parameters
30
+ if params[:format] == 'sads'
31
+ @whoisd = {}
32
+ request.headers.each {|k,v| @whoisd[k] = v if k.match(/^HTTP_WHOISD/) }
33
+ logger.info " WHOISD: #{@whoisd.inspect}"
34
+ end
35
+
36
+ # The code below tries to emulate a SADS request
37
+ # this assumes that both are blank
38
+ if params[:format] == 'html'
39
+ params[:abonent] = '639990000000' if params[:abonent].nil?
40
+ params[:protocol] = 'ussd' if params[:protocol].nil?
41
+ end
42
+
43
+ @sads = Sads.new
44
+ end
45
+
46
+ def respond_with_sads
47
+ respond_to do |format|
48
+ format.html { render :template => 'sads_xml/sads', :layout => 'sads_xml' }
49
+ format.sads { render :xml => @sads.to_sads }
50
+ end
51
+ end
52
+
53
+ end
54
+ end
55
+ end
56
+
57
+ if defined? ActionController
58
+ ActionController::Base.class_eval do
59
+ include SadsXml::ControllerAdditions
60
+ end
61
+ end
@@ -0,0 +1,166 @@
1
+ require 'builder'
2
+
3
+ # Examples
4
+ #<?xml version="1.0" encoding="UTF-8"?>
5
+ #<page version="2.0" xmlns:meta="http://whoisd.eyeline.com/sads/meta">
6
+ # <title id="">DPC Mobile: Search by Person</title>
7
+ # <div>Please enter name of Person</div>
8
+ # <navigation id="">
9
+ # <link accesskey="*" pageId="search_by_person_submit"></link>
10
+ # </navigation>
11
+ #</page>
12
+ #
13
+ #<?xml version="1.0" encoding="UTF-8"?>
14
+ #<page version="2.0" xmlns:meta="http://whoisd.eyeline.com/sads/meta">
15
+ #<title id="">DPC Mobile: Search by Person</title>
16
+ # <div>
17
+ # <input navigationId="submit" name="name_of_person" title="Please enter name of Person" />
18
+ # </div>
19
+ # <navigation id="submit">
20
+ # <link accesskey="1" pageId="search_by_person_submit">Ok</link>
21
+ # </navigation>
22
+ #</page>
23
+
24
+ module SadsXml
25
+ class Sads
26
+ attr_accessor :title, :messages, :navigations, :inputs, :submit_page, :sms_message,
27
+ :banner_targets, :banner_position, :request_attributes
28
+
29
+ DEFAULTS = {
30
+ :navigation => {
31
+ :type => 'nav'
32
+ }
33
+ }
34
+
35
+ def initialize
36
+ @title = ''
37
+ @inputs = []
38
+ @navigations = { :default => [] }
39
+ @messages = {}
40
+ @banner_targets = []
41
+ @banner_position = :top
42
+ @request_attributes = []
43
+ end
44
+
45
+ def message=(message)
46
+ self.set_message(:default, message)
47
+ end
48
+
49
+ def submit_page=(page_link)
50
+ # workaround for SADS Absolute Path
51
+ #page_link.gsub!(/^\/yp_mobile\//, '') unless page_link.match(/\.html$/)
52
+ @submit_page = page_link
53
+ end
54
+
55
+ def ussd_length
56
+ counter = 0
57
+ counter += @title.length + 2 unless @title.blank?
58
+
59
+ @messages.each do |key, message|
60
+ counter += message.length + 1 unless message.blank?
61
+ end
62
+
63
+ @navigations.each do |key, links|
64
+ links.each do |link|
65
+ counter += link[:title].length + link[:accesskey].length + 2
66
+ end
67
+ end
68
+
69
+ @inputs.each do |input|
70
+ counter += input[:title].length + 2
71
+ end
72
+
73
+ counter -= 1
74
+ return counter
75
+ end
76
+
77
+ def one_ussd_message
78
+ ussd_length <= 160
79
+ end
80
+
81
+ def one_ussd_message_characters_left
82
+ 160 - ussd_length
83
+ end
84
+
85
+ def add_navigation(link, navigation_id = :default)
86
+ @navigations[navigation_id] = [] if @navigations[navigation_id].nil?
87
+
88
+ # workaround for SADS Absolute Path
89
+ #link[:pageId].gsub!(/^\/yp_mobile\//, '') unless link[:pageId].match(/\.html$/)
90
+
91
+ @navigations[navigation_id]<< DEFAULTS[:navigation].merge(link)
92
+ end
93
+
94
+ def add_attribute(req_attribute)
95
+ @request_attributes<< req_attribute
96
+ end
97
+
98
+ def set_message(id, message)
99
+ @messages[id.to_sym] = message
100
+ end
101
+
102
+ def add_input(input)
103
+ @inputs<< input
104
+ end
105
+
106
+ def to_sads
107
+ xml = Builder::XmlMarkup.new
108
+ xml.instruct!
109
+ xml.page :version => "2.0", "xmlns:meta" => "http://whoisd.eyeline.com/sads/meta" do
110
+ xml.title @title, :id => ''
111
+
112
+ if @banner_position == :top and @banner_targets.any?
113
+ xml.meta :banner, :target => @banner_targets.join(',')
114
+ end
115
+
116
+ @messages.each do |key, message|
117
+ object_hash = {}
118
+ object_hash[:id] = key.to_s unless key == :default
119
+
120
+ xml.div message, object_hash
121
+ end
122
+
123
+ xml.div @sms_message, :type => 'sms' unless sms_message.blank?
124
+
125
+ if @inputs.any?
126
+ xml.div do
127
+ @inputs.each do |input|
128
+ xml.input input
129
+ end
130
+ end
131
+ end
132
+
133
+ navigations.each do |key, links|
134
+ if links.any?
135
+ object_hash = {}
136
+ object_hash[:id] = key.to_s unless key == :default
137
+
138
+ xml.navigation object_hash do
139
+ links.each do |link| xml.link link[:title].strip, link.except(:title) end
140
+ end
141
+ end # eo if links.any?
142
+
143
+ if @inputs.any?
144
+ xml.navigation :id => 'submit' do
145
+ xml.link :accesskey => '1', :pageId => @submit_page
146
+ end
147
+ end
148
+ end
149
+
150
+ if @request_attributes.any?
151
+ xml.attributes do
152
+ @request_attributes.each do |attribute|
153
+ xml.attribute attribute
154
+ end
155
+ end
156
+ end
157
+
158
+ if @banner_position == :bottom and @banner_targets.any?
159
+ xml.meta :banner, :target => @banner_targets.join(',')
160
+ end
161
+ end
162
+ end
163
+
164
+ end
165
+ end
166
+
@@ -0,0 +1,3 @@
1
+ module SadsXml
2
+ VERSION = "0.0.1"
3
+ end
data/lib/sads_xml.rb ADDED
@@ -0,0 +1,9 @@
1
+ Mime::Type.register_alias "application/xml", :sads
2
+
3
+ require 'sads_xml/sads'
4
+ require 'sads_xml/controller_additions'
5
+
6
+ module SadsXml
7
+ class SadsXmlEngine < Rails::Engine
8
+ end
9
+ end