rubysite 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZDQ2NzIxNDc5MDhjZjI1YzYyYmU2ZDMxMGY3NjgxZGNkNzMzMWQxYQ==
5
+ data.tar.gz: !binary |-
6
+ NDQ2NzRlY2EyNzYzYjQ5OTgyYTZiNWZmZDgwY2ViZWUxMDU5YjIxMQ==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ Y2Y4MTE4ZDk1NDgzN2JkMmU0NzFmYmVhYjgxYTQ0YzlhNDllY2VmODgyZGE3
10
+ YWViNzcxZDE0YmNhZmZkNGU2N2I3Y2U4NTMzOTJhZWQ3NDU3OWVhOTM3OGY5
11
+ NzcwMDZhNWNlNzI3ZWMxNjNlYjk2OTY2MmI3ZmU3YTQ1MDRjNjE=
12
+ data.tar.gz: !binary |-
13
+ OTJlMWU4MDQwYjA0ZTNlNjZmYTNiZTliMjQ4MWE2ZDhlNWI2ZTg4ZjU5MmVk
14
+ ZjViOGZiMmU1ZDVlMWViNmJjMDQwMmQyNDRlNTdmYTdmN2Q3ZDQwNzE0MGIy
15
+ MGQxNmM5Y2M1ZTU4YTAxZmRhOTRhY2Q5YWIwYTAwZjVhNDcxZDM=
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .idea/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rubysite.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Danny Purcell
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,22 @@
1
+ Rubysite
2
+ ---------------
3
+
4
+ © Danny Purcell 2013 | MIT license
5
+
6
+ Makes creating web service as easy as writing a function library.
7
+
8
+ Features
9
+ ---------------
10
+
11
+ Allows the user to write a properly documented module/class as a function library and convert it to a web service
12
+ by simply including Rubysite.
13
+
14
+ Usage
15
+ ---------------
16
+
17
+ Write your module of methods, document them as you normally would.
18
+ `include Rubysite`
19
+ Optionally `#!/usr/bin/env ruby` at the top.
20
+
21
+ Calling `ruby ./path/to/module.rb` will start the server.
22
+ Your module's singleton methods `def self.method_name` will be available from the web at `localhost:8080` by default.
data/Rakefile ADDED
@@ -0,0 +1,74 @@
1
+ require 'yard'
2
+ require 'rake/testtask'
3
+
4
+ task :default => [:package]
5
+
6
+ task :clean do
7
+ FileUtils.rm_rf('./doc')
8
+ FileUtils.rm_rf('./.yardoc')
9
+ FileUtils.rm_rf('./pkg')
10
+ FileUtils.rm(Dir.glob('./rubysite-*.gem'))
11
+ end
12
+
13
+ task :bundle do
14
+ system("bundle install")
15
+ end
16
+
17
+ Rake::TestTask.new do |t|
18
+ t.libs << "test"
19
+ t.test_files = FileList['test/*/*_test.rb']
20
+ t.verbose = true
21
+ end
22
+
23
+ YARD::Rake::YardocTask.new
24
+
25
+ task :package => [:clean, :bundle, :test, :yard] do
26
+ gem_specs = Dir.glob("**/*.gemspec")
27
+ gem_specs.each { |gem_spec|
28
+ system("gem build #{gem_spec}")
29
+ raise "Error during build phase" if $?.exitstatus != 0
30
+ }
31
+ end
32
+
33
+ task :install => :package do
34
+ load "#{File.expand_path(File.dirname(__FILE__))}/lib/rubysite/version.rb"
35
+ system("gem install #{File.expand_path(File.dirname(__FILE__))}/rubysite-#{Rubysite::VERSION}.gem")
36
+ end
37
+
38
+ task :upgrade => :package do
39
+ system("gem uninstall rubysite -a")
40
+ load "#{File.expand_path(File.dirname(__FILE__))}/lib/rubysite/version.rb"
41
+ system("gem install #{File.expand_path(File.dirname(__FILE__))}/rubysite-#{Rubysite::VERSION}.gem")
42
+ end
43
+
44
+ task :version_set, [:version] do |t, args|
45
+ raise "Must provide a version.\n If you called 'rake version_set 1.2.3', try 'rake version_set[1.2.3]'" if args[:version].nil? || args[:version].empty?
46
+
47
+ version_file = <<-END.gsub(/^ {4}/, '')
48
+ module Rubysite
49
+ VERSION = "#{args[:version]}"
50
+ end
51
+ END
52
+ puts "Writing version file:\n #{version_file}"
53
+ File.open("#{File.expand_path(File.dirname(__FILE__))}/lib/rubysite/version.rb", 'w+') { |file|
54
+ file.write(version_file)
55
+ }
56
+ file_text = File.read("#{File.expand_path(File.dirname(__FILE__))}/lib/rubysite/version.rb")
57
+ raise "Could not update version file" if file_text != version_file
58
+ end
59
+
60
+ task :release, [:version] => [:version_set, :package] do |t, args|
61
+ system("git clean -f")
62
+ system("git add .")
63
+ system("git commit -m\"Version to #{args[:version]}\"")
64
+ if $?.exitstatus == 0
65
+ system("git tag -a v#{args[:version]} -m\"Version #{args[:version]} Release\"")
66
+ if $?.exitstatus == 0
67
+ system("git push origin master --tags")
68
+ if $?.exitstatus == 0
69
+ load "#{File.expand_path(File.dirname(__FILE__))}/lib/rubysite/version.rb"
70
+ system("gem push #{File.expand_path(File.dirname(__FILE__))}/rubysite-#{Rubysite::VERSION}.gem")
71
+ end
72
+ end
73
+ end
74
+ end
File without changes
@@ -0,0 +1,3 @@
1
+ module Rubysite
2
+ VERSION = "0.0.3"
3
+ end
@@ -0,0 +1,6 @@
1
+ <h3>Site Map</h3>
2
+ <ul>
3
+ <%= help[:site_map].map{|route|
4
+ "<li><a href='#{route}'>#{route}</a></li>"
5
+ }.join("\n")%>
6
+ </ul>
@@ -0,0 +1,2 @@
1
+ <h4>Welcome to your Rubysite!</h4>
2
+ <h5>Click the navigation links to explore your modules.</h5>
@@ -0,0 +1,27 @@
1
+ <html>
2
+ <head>
3
+ <title><%= layout[:name] %></title>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
5
+ <link rel="stylesheet" type="text/css" media="screen" href="/css/<%= layout[:name] %>.css"/>
6
+ </head>
7
+ <body>
8
+ <div class='content_header'>
9
+ <h1><%= layout[:name] %></h1>
10
+ <%= (layout[:back_link].nil?) ? "" : "<a href='#{layout[:back_link]}'>#{layout[:back_link]}</a><br/>" %>
11
+ <h4><%= layout[:doc] %></h4>
12
+ </div>
13
+ <div class='navigation_panel'>
14
+ <ul>
15
+ <%= layout[:nav_entries].map{|entry|
16
+ "<li><a href='#{entry[:link]}' title='#{entry[:doc]}'>#{entry[:link_name]}</a></li>"
17
+ }.join("\n") %>
18
+ </ul>
19
+ </div>
20
+ <div class='content_body'>
21
+ <%= yield %>
22
+ </div>
23
+ <div class='content_footer'>
24
+ Powered by <a href='http://github.com/dannypurcell/rubysite'>Rubysite</a>!
25
+ </div>
26
+ </body>
27
+ </html>
@@ -0,0 +1,4 @@
1
+ <h1>Error in <%= error[:base] %></h1>
2
+ <br />
3
+ <h3>Error Message:</h3>
4
+ <h4><%= error[:message] %></h4>
@@ -0,0 +1,7 @@
1
+ <form name="<% form[:name] %>" action="<% form[:action] %>" method="<% form[:method] || "get" %>">
2
+ <% form[:fields].each do |field| %>
3
+ <% field[:text] %><input type='<% field[:type] %>' name='<% field[:name] %>'>
4
+ <% end %>
5
+ Username: <input type="text" name="user">
6
+ <input type="submit" value="Submit">
7
+ </form>
@@ -0,0 +1,12 @@
1
+ <div class='result_stdout'>
2
+ <h3>StdOut</h3>
3
+ <p>
4
+ <%= result[:output] %>
5
+ </p>
6
+ </div>
7
+ <div class='result_stderr'>
8
+ <h3>StdErr</h3>
9
+ <p>
10
+ <%= result[:error] %>
11
+ </p>
12
+ </div>
@@ -0,0 +1,9 @@
1
+ <h3>Commands:</h3>
2
+ <br/>
3
+ <ul>
4
+ <ul>
5
+ <%= command_list[:command_list].map{|entry|
6
+ "<li><a href='#{entry[:link]}'>#{entry[:link_name]}</a>#{entry[:doc]}</li>"
7
+ }.join("\n") %>
8
+ </ul>
9
+ </ul>
data/lib/rubysite.rb ADDED
@@ -0,0 +1,208 @@
1
+ require 'rubycom'
2
+ require 'sinatra'
3
+ require "sinatra/reloader" if development?
4
+ require 'json'
5
+ require 'yaml'
6
+
7
+ # Provides a web interface for including modules
8
+ module Rubysite
9
+ class SiteError < StandardError;
10
+ end
11
+
12
+ # Detects that Rubysite was included in another module and calls Rubysite#run
13
+ #
14
+ # @param [Module] base the module which invoked 'include Rubysite'
15
+ def self.included(base)
16
+ base_file_path = caller.first.gsub(/:\d+:.+/, '')
17
+ if base.class == Module && (base_file_path == $0 || Rubycom.is_executed_by_gem?(base_file_path))
18
+ base.module_eval {
19
+ Rubysite.run(base, ARGV)
20
+ }
21
+ end
22
+ end
23
+
24
+ # Defines routes for all commands found in the including module and starts the web server
25
+ #
26
+ # @param [Module] base the module which invoked 'include Rubysite'
27
+ # @param [Array] args a String Array representing environment settings for the web server
28
+ def self.run(base, args=[])
29
+ args = [args] if args.class == String
30
+ base = Kernel.const_get(base.to_sym) if base.class == String
31
+ begin
32
+ raise SiteError, "Invalid base class invocation: #{base}" if base.nil?
33
+ Sinatra::Base::set :port, '8080'
34
+ Sinatra::Base::set :port, args[1] if !args[0].nil? && args[0] == '--port'
35
+ Sinatra::Base::set :port, args[0].split('=').last if !args[0].nil? && args[0].include?('--port=')
36
+ Sinatra::Base::set :root, Proc.new { File.join(File.expand_path(File.dirname(__FILE__)), 'rubysite') }
37
+ Sinatra::Base::set :public_folder, Proc.new { File.join(File.expand_path(File.dirname(__FILE__)), 'rubysite', 'public') }
38
+ Sinatra::Base::set :views, Proc.new { File.join(File.expand_path(File.dirname(__FILE__)), 'rubysite', 'views') }
39
+ Sinatra::Base::set :css_files, {default: File.join(File.expand_path(File.dirname(__FILE__)), 'rubysite', 'public', 'css', 'default.css')}
40
+
41
+ Rubysite.define_routes(base)
42
+
43
+ Sinatra::Base::run!
44
+ rescue SiteError => e
45
+ $stderr.puts e
46
+ end
47
+ end
48
+
49
+ # Recursively defines routes for the web service according to the commands included in the given base Module.
50
+ # Starts at '/'. Additionally defines any default routes required by the web service.
51
+ #
52
+ # @param [Module] base the Module for which a web interface should be generated
53
+ # @return [Array] a String array listing the routes which were defined for the given base Module
54
+ def self.define_routes(base)
55
+ base = Kernel.const_get(base.to_sym) if base.class == String
56
+ site_map = ['/', '/css', '/help'] + Rubysite.define_module_route(base)
57
+
58
+ Sinatra::Base::get "/?" do
59
+ layout = {
60
+ name: "#{base}",
61
+ doc: "A Rubysite generated service",
62
+ nav_entries: [
63
+ {link: '/', link_name: 'Home', doc: 'Home'},
64
+ {link: "/#{base}", link_name: "#{base}", doc: Rubycom::Documentation.get_module_doc(base)},
65
+ {link: "/help", link_name: "Help", doc: 'Interface documentation'}
66
+ ]
67
+ }
68
+ erb(:index, locals: {layout: layout})
69
+ end
70
+
71
+ Sinatra::Base::get "/css/:css_name?" do |css_name|
72
+ css_sym = css_name.to_sym rescue :default
73
+ css_file = settings.css_files[css_sym] || settings.css_files[:default]
74
+ File.read(css_file)
75
+ end
76
+
77
+ Sinatra::Base::get "/help" do
78
+ layout = {
79
+ name: "Help",
80
+ back_link: "/",
81
+ doc: "Help page",
82
+ nav_entries: [
83
+ {link: '/', link_name: 'Home', doc: 'Home'},
84
+ {link: "/#{base}", link_name: "#{base}", doc: Rubycom::Documentation.get_module_doc(base)},
85
+ {link: "/help", link_name: "Help", doc: 'Interface documentation'}
86
+ ]
87
+ }
88
+ help = {
89
+ site_map: site_map.flatten
90
+ }
91
+ erb(:help, locals: {layout: layout, help: help})
92
+ end
93
+
94
+ site_map.flatten
95
+ end
96
+
97
+ # Recursively defines routes for the web service according to the commands included in the given base Module.
98
+ # Starts at the given route_prefix.
99
+ #
100
+ # @param [Module] base the Module for which a web interface should be generated
101
+ # @param [String] route_prefix a route pattern to prefix on routes which will be generated in response to this call
102
+ # @return [Array] a String array listing the routes which were defined for the given base Module
103
+ def self.define_module_route(base, route_prefix='/')
104
+ base = Kernel.const_get(base.to_sym) if base.class == String
105
+ defined_routes = ["#{route_prefix.chomp('/')}/#{base.to_s}"]
106
+
107
+ commands = Rubycom::Commands.get_top_level_commands(base).select { |sym| sym != :Rubysite } || []
108
+
109
+ commands = commands.map { |command_sym|
110
+ if base.included_modules.map { |mod| mod.name.to_sym }.include?(command_sym)
111
+ defined_routes << Rubysite.define_module_route(base.included_modules.select { |mod| mod.name == command_sym.to_s }.first, defined_routes[0])
112
+ else
113
+ defined_routes << Rubysite.define_method_route(base, command_sym, defined_routes[0])
114
+ end
115
+ {
116
+ link: "#{defined_routes[0]}/#{command_sym.to_s}",
117
+ link_name: "#{command_sym.to_s}",
118
+ doc: Rubycom::Documentation.get_command_summary(base, command_sym, Rubycom::Documentation.get_separator(command_sym, Rubycom::Commands.get_longest_command_name(base).length)).gsub(command_sym.to_s, '')
119
+ }
120
+ } || []
121
+
122
+ Sinatra::Base::get "#{defined_routes[0]}/?" do
123
+ layout = {
124
+ name: "#{base}",
125
+ back_link: route_prefix,
126
+ doc: Rubycom::Documentation.get_module_doc(base.to_s),
127
+ nav_entries: [
128
+ {link: route_prefix, link_name: route_prefix.split('/').last || 'Home', doc: 'Back'},
129
+ ] + commands + [ {link: "/help", link_name: "Help", doc: 'Interface documentation'} ]
130
+ }
131
+ command_list = {
132
+ command_list: commands
133
+ }
134
+ erb(:"module/command_list", locals: {layout: layout, command_list: command_list})
135
+ end
136
+
137
+ defined_routes.flatten
138
+ end
139
+
140
+ # Defines the route for the given command on the given base. The resulting route will be prefixed with the given route_prefix.
141
+ #
142
+ # @param [Module] base the Module which contains the specified command Method
143
+ # @param [Symbol] command the symbol representing the name of the command for which an interface should be generated
144
+ # @param [String] route_prefix a route pattern to prefix on routes which will be generated in response to this call
145
+ # @return [Array] a String array listing the routes which were defined for the given base Module
146
+ def self.define_method_route(base, command, route_prefix='/')
147
+ base = Kernel.const_get(base.to_sym) if base.class == String
148
+ defined_route = "#{route_prefix}/#{command.to_s}"
149
+ docs = Rubycom::Documentation.get_doc(base.public_method(command))
150
+ param_defs = Rubycom::Arguments.get_param_definitions(base.public_method(command))
151
+ route_params = param_defs.map { |key, val_hsh| (val_hsh[:type] == :opt) ? {":#{key}?" => val_hsh[:default]} : {":#{key}" => val_hsh[:default]} }.reduce(&:merge) || {}
152
+ Sinatra::Base::get "#{defined_route}/?" do
153
+ begin
154
+ rubysite_out = ''
155
+ def rubysite_out.write(data)
156
+ self << data
157
+ end
158
+ rubysite_err = ''
159
+ def rubysite_err.write(data)
160
+ self << data
161
+ end
162
+ o_stdout, $stdout = $stdout, rubysite_out
163
+ o_stderr, $stderr = $stderr, rubysite_err
164
+
165
+ puts Rubycom.call_method(base, command, params.map { |key, val| "--#{key}=#{val}" })
166
+
167
+ layout = {
168
+ name: "#{base}",
169
+ back_link: route_prefix,
170
+ nav_entries: [
171
+ {link: route_prefix, link_name: route_prefix.split('/').last || 'Home', doc: 'Parent Module'},
172
+ {link: "/help", link_name: "Help", doc: 'Interface documentation'}
173
+ ]
174
+ }
175
+ result = {
176
+ params: params,
177
+ query: request.query_string,
178
+ param_defs: param_defs,
179
+ inputs: route_params.merge(params),
180
+ docs: docs,
181
+ output: rubysite_out,
182
+ error: rubysite_err
183
+ }
184
+ erb(:"method/result", locals: {layout: layout, result: result})
185
+
186
+ rescue Exception => e
187
+ layout = {
188
+ name: "#{base}",
189
+ back_link: route_prefix,
190
+ nav_entries: [
191
+ {link: route_prefix, link_name: route_prefix.split('/').last || 'Home', doc: 'Parent Module'},
192
+ {link: "/help", link_name: "Help", doc: 'Interface documentation'}
193
+ ]
194
+ }
195
+ error = {
196
+ base: base,
197
+ message: e.message
198
+ }
199
+ erb(:"method/error", locals: {layout: layout, error: error})
200
+ ensure
201
+ $stdout = o_stdout
202
+ $stderr = o_stderr
203
+ end
204
+ end
205
+ defined_route
206
+ end
207
+
208
+ end
data/rubysite.gemspec ADDED
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rubysite/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rubysite"
8
+ spec.version = Rubysite::VERSION
9
+ spec.authors = ["Danny Purcell"]
10
+ spec.email = ["d.purcell.jr+rubysite@gmail.com"]
11
+ spec.description = %q{Provides web access for singleton methods in an including module. Allows the user to make a web service by simply including Rubysite.}
12
+ spec.summary = %q{Converts singleton methods to web service routes upon inclusion.}
13
+ spec.homepage = "http://github.com/dannypurcell/Rubysite"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "test-unit"
23
+ spec.add_development_dependency "rake"
24
+ spec.add_dependency 'rubycom'
25
+ spec.add_dependency 'sinatra'
26
+ spec.add_dependency 'sinatra-contrib'
27
+ end
@@ -0,0 +1,7 @@
1
+ require "#{File.dirname(__FILE__)}/../../lib/rubysite.rb"
2
+
3
+ require 'test/unit'
4
+
5
+ class RubysiteTest < Test::Unit::TestCase
6
+
7
+ end
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+ require "#{File.expand_path(File.dirname(__FILE__))}/../../lib/rubysite.rb"
3
+ require "#{File.expand_path(File.dirname(__FILE__))}/util_test_module.rb"
4
+ require "#{File.expand_path(File.dirname(__FILE__))}/util_test_no_singleton.rb"
5
+
6
+ module UtilTestComposite
7
+ include UtilTestModule
8
+
9
+ include UtilTestNoSingleton
10
+
11
+ # A test_command in a composite console
12
+ #
13
+ # @param [String] test_arg a test argument
14
+ # @return [String] the test arg
15
+ def self.test_composite_command(test_arg)
16
+ test_arg
17
+ end
18
+
19
+ include Rubysite
20
+ end
@@ -0,0 +1,112 @@
1
+ require "#{File.expand_path(File.dirname(__FILE__))}/../../lib/rubysite.rb"
2
+ # A command module used for testing
3
+ module UtilTestModule
4
+
5
+ # A test non-command method
6
+ def non_command
7
+ puts 'fail'
8
+ end
9
+
10
+ # A basic test command
11
+ def self.test_command
12
+ puts 'command test'
13
+ end
14
+
15
+ def self.test_command_no_docs
16
+ puts 'command test'
17
+ end
18
+
19
+ # A test_command with one arg
20
+ #
21
+ # @param [String] test_arg a test argument
22
+ def self.test_command_with_arg(test_arg)
23
+ "test_arg=#{test_arg}"
24
+ end
25
+
26
+ # A test_command with an arg named arg
27
+ #
28
+ # @param [String] arg a test argument whose parameter name is arg
29
+ def self.test_command_arg_named_arg(arg)
30
+ "arg=#{arg}"
31
+ end
32
+
33
+ # A test_command with two args
34
+ # @param [String] test_arg a test argument
35
+ # @param [String] another_test_arg another test argument
36
+ def self.test_command_with_args(test_arg, another_test_arg)
37
+ puts "test_arg=#{test_arg},another_test_arg=#{another_test_arg}"
38
+ end
39
+
40
+ # A test_command with an optional argument
41
+ # @param [String] test_arg a test argument
42
+ # @param [String] test_option an optional test argument
43
+ def self.test_command_with_options(test_arg, test_option='option_default')
44
+ puts "test_arg=#{test_arg},test_option=#{test_option}"
45
+ end
46
+
47
+ # A test_command with all optional arguments
48
+ # @param [String] test_arg an optional test argument
49
+ # @param [String] test_option another optional test argument
50
+ def self.test_command_all_options(test_arg='test_arg_default', test_option='test_option_default')
51
+ puts "Output is test_arg=#{test_arg},test_option=#{test_option}"
52
+ end
53
+
54
+ # A test_command with an options array
55
+ # @param [String] test_option an optional test argument
56
+ # @param [String] test_options an optional array of arguments
57
+ def self.test_command_options_arr (
58
+ test_option="test_option_default",
59
+ *test_options
60
+ )
61
+ puts "Output is test_option=#{test_option},test_option_arr=#{test_options}"
62
+ end
63
+
64
+ # A test_command with a return argument
65
+ #
66
+ # @param [String] test_arg a test argument
67
+ # @param [Integer] test_option_int an optional test argument which happens to be an Integer
68
+ # @return [Array] an array including both params if test_option_int != 1
69
+ # @return [String] a the first param if test_option_int == 1
70
+ def self.test_command_with_return(test_arg, test_option_int=1)
71
+ ret = [test_arg, test_option_int]
72
+ if test_option_int == 1
73
+ ret = test_arg
74
+ end
75
+ ret
76
+ end
77
+
78
+ # A test_command with a Timestamp argument and an unnecessarily long description which should overflow when
79
+ # it tries to line up with other descriptions.
80
+ # @param [Timestamp] test_time a test Timestamp argument
81
+ # @return [Hash] a hash including the given argument
82
+ def self.test_command_arg_timestamp(test_time)
83
+ {test_time: test_time}
84
+ end
85
+
86
+ # A test_command with a Boolean argument
87
+ # @param [Boolean] test_flag a test Boolean argument
88
+ # @return [Boolean] the flag passed in
89
+ def self.test_command_arg_false(test_flag=false)
90
+ test_flag
91
+ end
92
+
93
+ # A test_command with an array argument
94
+ #
95
+ # @param [Array] test_arr an Array test argument
96
+ def self.test_command_arg_arr(test_arr=[])
97
+ test_arr
98
+ end
99
+
100
+ # A test_command with an Hash argument
101
+ # @param [Hash] test_hash a Hash test argument
102
+ def self.test_command_arg_hash(test_hash={})
103
+ test_hash
104
+ end
105
+
106
+ # A test_command with several mixed options
107
+ def self.test_command_mixed_options(test_arg, test_arr=[], test_opt='test_opt_arg', test_hsh={}, test_bool=true, *test_rest)
108
+ "test_arg=#{test_arg} test_arr=#{test_arr} test_opt=#{test_opt} test_hsh=#{test_hsh} test_bool=#{test_bool} test_rest=#{test_rest}"
109
+ end
110
+
111
+ include Rubysite
112
+ end
@@ -0,0 +1,9 @@
1
+ require "#{File.expand_path(File.dirname(__FILE__))}/../../lib/rubysite.rb"
2
+
3
+ module UtilTestNoSingleton
4
+ def test_method
5
+ "TEST_NON_SINGLETON_METHOD"
6
+ end
7
+
8
+ include Rubysite
9
+ end
metadata ADDED
@@ -0,0 +1,154 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rubysite
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - Danny Purcell
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-08-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: test-unit
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubycom
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: sinatra
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: sinatra-contrib
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: Provides web access for singleton methods in an including module. Allows
98
+ the user to make a web service by simply including Rubysite.
99
+ email:
100
+ - d.purcell.jr+rubysite@gmail.com
101
+ executables: []
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - .gitignore
106
+ - Gemfile
107
+ - LICENSE.txt
108
+ - README.md
109
+ - Rakefile
110
+ - lib/rubysite.rb
111
+ - lib/rubysite/public/css/default.css
112
+ - lib/rubysite/version.rb
113
+ - lib/rubysite/views/help.erb
114
+ - lib/rubysite/views/index.erb
115
+ - lib/rubysite/views/layout.erb
116
+ - lib/rubysite/views/method/error.erb
117
+ - lib/rubysite/views/method/form.erb
118
+ - lib/rubysite/views/method/result.erb
119
+ - lib/rubysite/views/module/command_list.erb
120
+ - rubysite.gemspec
121
+ - test/rubysite/rubysite_test.rb
122
+ - test/rubysite/util_test_composite.rb
123
+ - test/rubysite/util_test_module.rb
124
+ - test/rubysite/util_test_no_singleton.rb
125
+ homepage: http://github.com/dannypurcell/Rubysite
126
+ licenses:
127
+ - MIT
128
+ metadata: {}
129
+ post_install_message:
130
+ rdoc_options: []
131
+ require_paths:
132
+ - lib
133
+ required_ruby_version: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ! '>='
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ required_rubygems_version: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ requirements: []
144
+ rubyforge_project:
145
+ rubygems_version: 2.0.3
146
+ signing_key:
147
+ specification_version: 4
148
+ summary: Converts singleton methods to web service routes upon inclusion.
149
+ test_files:
150
+ - test/rubysite/rubysite_test.rb
151
+ - test/rubysite/util_test_composite.rb
152
+ - test/rubysite/util_test_module.rb
153
+ - test/rubysite/util_test_no_singleton.rb
154
+ has_rdoc: