rocketio 0.0.0.pre.alpha → 0.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.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -2
  3. data/LICENSE.txt +22 -0
  4. data/README.md +5 -22
  5. data/Rakefile +1 -7
  6. data/lib/rocketio.rb +3 -131
  7. data/lib/rocketio/version.rb +2 -2
  8. data/rocketio.gemspec +17 -21
  9. metadata +11 -146
  10. data/.travis.yml +0 -3
  11. data/bin/console +0 -14
  12. data/bin/setup +0 -7
  13. data/lib/rocketio/application.rb +0 -31
  14. data/lib/rocketio/controller.rb +0 -288
  15. data/lib/rocketio/controller/authentication.rb +0 -141
  16. data/lib/rocketio/controller/authorization.rb +0 -53
  17. data/lib/rocketio/controller/cookies.rb +0 -59
  18. data/lib/rocketio/controller/error_handlers.rb +0 -89
  19. data/lib/rocketio/controller/filters.rb +0 -119
  20. data/lib/rocketio/controller/flash.rb +0 -21
  21. data/lib/rocketio/controller/helpers.rb +0 -438
  22. data/lib/rocketio/controller/middleware.rb +0 -32
  23. data/lib/rocketio/controller/render.rb +0 -148
  24. data/lib/rocketio/controller/render/engine.rb +0 -76
  25. data/lib/rocketio/controller/render/layout.rb +0 -27
  26. data/lib/rocketio/controller/render/layouts.rb +0 -85
  27. data/lib/rocketio/controller/render/templates.rb +0 -83
  28. data/lib/rocketio/controller/request.rb +0 -115
  29. data/lib/rocketio/controller/response.rb +0 -84
  30. data/lib/rocketio/controller/sessions.rb +0 -64
  31. data/lib/rocketio/controller/token_auth.rb +0 -118
  32. data/lib/rocketio/controller/websocket.rb +0 -21
  33. data/lib/rocketio/error_templates/404.html +0 -3
  34. data/lib/rocketio/error_templates/409.html +0 -7
  35. data/lib/rocketio/error_templates/500.html +0 -3
  36. data/lib/rocketio/error_templates/501.html +0 -6
  37. data/lib/rocketio/error_templates/layout.html +0 -1
  38. data/lib/rocketio/exceptions.rb +0 -4
  39. data/lib/rocketio/router.rb +0 -65
  40. data/lib/rocketio/util.rb +0 -122
  41. data/test/aliases_test.rb +0 -54
  42. data/test/authentication_test.rb +0 -307
  43. data/test/authorization_test.rb +0 -91
  44. data/test/cache_control_test.rb +0 -268
  45. data/test/content_type_test.rb +0 -124
  46. data/test/cookies_test.rb +0 -49
  47. data/test/error_handlers_test.rb +0 -125
  48. data/test/etag_test.rb +0 -445
  49. data/test/filters_test.rb +0 -177
  50. data/test/halt_test.rb +0 -73
  51. data/test/helpers_test.rb +0 -171
  52. data/test/middleware_test.rb +0 -57
  53. data/test/redirect_test.rb +0 -135
  54. data/test/render/engine_test.rb +0 -71
  55. data/test/render/get.erb +0 -1
  56. data/test/render/items.erb +0 -1
  57. data/test/render/layout.erb +0 -1
  58. data/test/render/layout_test.rb +0 -104
  59. data/test/render/layouts/master.erb +0 -1
  60. data/test/render/layouts_test.rb +0 -145
  61. data/test/render/master.erb +0 -1
  62. data/test/render/post.erb +0 -1
  63. data/test/render/put.erb +0 -1
  64. data/test/render/render_test.rb +0 -101
  65. data/test/render/setup.rb +0 -14
  66. data/test/render/templates/a/get.erb +0 -1
  67. data/test/render/templates/master.erb +0 -1
  68. data/test/render/templates_test.rb +0 -146
  69. data/test/request_test.rb +0 -105
  70. data/test/response_test.rb +0 -119
  71. data/test/routes_test.rb +0 -70
  72. data/test/sendfile_test.rb +0 -209
  73. data/test/sessions_test.rb +0 -176
  74. data/test/setup.rb +0 -59
@@ -1,32 +0,0 @@
1
- module RocketIO
2
- class Controller
3
-
4
- # storing Rack middleware to be called when a request handled by controller
5
- #
6
- # @note middleware is inheritable
7
- #
8
- # @example add a middleware to be used in current controller
9
- # and any controllers that inherits from it
10
- #
11
- # class Users < RocketIO::Controller
12
- # use Rack::CommonLogger
13
- # end
14
- #
15
- # @param w [Class, Proc] a valid Rack middleware that responds to `call`
16
- # @param *a [Array] any args to be passed at middleware initialization
17
- # @param &b [Proc] a block to be yielded at middleware initialization
18
- #
19
- def self.use w = nil, *a, &b
20
- (@__middleware__ ||= []).push(proc {|app| w.new(app, *a, &b)})
21
- define_middleware_methods
22
- end
23
-
24
- def self.define_middleware_methods source = self
25
- middleware = ((source.instance_variable_get(:@__middleware__) || []) + allocate.middleware).uniq.freeze
26
- return if middleware.empty?
27
- define_method(:middleware) {middleware}
28
- end
29
-
30
- def middleware; RocketIO::EMPTY_ARRAY end
31
- end
32
- end
@@ -1,148 +0,0 @@
1
- module RocketIO
2
- class Controller
3
-
4
- # if called without arguments render a template with lowercased name of current request method, e.g. get for GET, post for POST etc.
5
- # at first it will look between defined templates.
6
- # then it will search a file.
7
- # it will try each extension the effective engine has registered, e.g. .erb, .rhtml for ERB.
8
- # it will search in the folder the controller was defined in(NOT in path_to_templates, which is used for defined templates only).
9
- # so put each controller in a separate folder to avoid templates clash.
10
- #
11
- # if no file found a TemplateError will be raised.
12
- # if a block given it will use the the string returned by the block as template
13
- # and wont search for defined nor file templates.
14
- #
15
- # by default ERB engine will be used (@see engine).
16
- #
17
- # for layout it will take one given through options or one defined at class level.
18
- # if none given, it will render without layout.
19
- # to use a layout path_to_layouts should be defined at class level.
20
- #
21
- # by default it will use current instance as scope.
22
- # to render in a isolated scope, set it via :scope option
23
- #
24
- # to pass some local variables use :locals option
25
- #
26
- # @example render ./get.erb without layout
27
- # class Pages < RocketIO::Controller
28
- #
29
- # def get
30
- # render
31
- # end
32
- # end
33
- #
34
- # @example render ./get.erb with :master layout
35
- # class Pages < RocketIO::Controller
36
- # layout :master
37
- #
38
- # def get
39
- # render
40
- # end
41
- # end
42
- #
43
- # @example render ./get.erb with explicit :master layout
44
- # class Pages < RocketIO::Controller
45
- #
46
- # def get
47
- # render(layout: :master)
48
- # end
49
- # end
50
- #
51
- # @example render within isolated scope
52
- # class Pages < RocketIO::Controller
53
- #
54
- # def get
55
- # render(scope: Object.new)
56
- # end
57
- # end
58
- #
59
- # @example render with custom locals
60
- # class Pages < RocketIO::Controller
61
- #
62
- # def get
63
- # render(locals: {x: 'y'})
64
- # end
65
- # end
66
- #
67
- def render template = nil, opts = {}
68
- opts, template = template, nil if template.is_a?(::Hash)
69
- engine, engine_opts = resolve_engine(opts)
70
- template = block_given? ? yield : resolve_template(template, engine)
71
- scope = opts.fetch(:scope, self)
72
- locals = opts.fetch(:locals, RocketIO::EMPTY_HASH).freeze
73
- layout = opts.fetch(:layout, self.layout)
74
- template = compile_template(template, engine, engine_opts).render(scope, locals)
75
- layout ? render_layout(layout, opts) {template} : template
76
- end
77
-
78
- # render a template that yields the given block.
79
- # that's it, a layout is a template that yields given string.
80
- # if no layout name given, it will use the one set at class level.
81
- # if no layout set at class level and no layout given, it will raise a RuntimeError.
82
- # it will firstly search for given layout between defined ones.
83
- # if none found, it will search a file in `path_to_layouts` folder.
84
- # it will try each extension registered with effective engine.
85
- # if no file found it will raise a TemplateError.
86
- #
87
- # block is required and should return the string to be yielded.
88
- #
89
- def render_layout template = nil, opts = {}, &block
90
- opts, template = template, nil if template.is_a?(::Hash)
91
- template ||= self.layout
92
- template || raise(RocketIO::LayoutError, 'No default layout set and no explicit layout given')
93
- engine, engine_opts = resolve_engine(opts)
94
- template = resolve_layout(template, engine)
95
- scope = opts.fetch(:scope, self)
96
- locals = opts.fetch(:locals, RocketIO::EMPTY_HASH).freeze
97
- compile_template(template, engine, engine_opts)
98
- .render(scope, locals, &(block || RocketIO::EMPTY_STRING_PROC))
99
- end
100
-
101
- private
102
- def resolve_template template, engine
103
- template ||= requested_method
104
- return __send__(templates[template]) if templates[template]
105
- read_template(find_template(dirname, template, engine))
106
- end
107
-
108
- def resolve_layout layout, engine
109
- return __send__(layouts[layout]) if layouts[layout]
110
- read_template(find_template(dirname, layout, engine))
111
- end
112
-
113
- def resolve_engine opts = nil
114
- return engine_const(engine_class(opts[:engine])) if opts && opts[:engine]
115
- [engine_const(engine[0]), engine[1]]
116
- end
117
-
118
- def read_template file
119
- RocketIO::READ_TEMPLATES[[file, ::File.mtime(file).to_i]] ||= ::File.read(file)
120
- end
121
-
122
- def find_template path, template, engine
123
- RocketIO::FOUND_TEMPLATES[[path, template, engine]] ||= begin
124
- extensions = ::Tilt.default_mapping.extensions_for(engine)
125
- file = nil
126
- extensions.each do |ext|
127
- try = RocketIO::TEMPLATE_PATH_FORMAT % [path, template, ext]
128
- next unless File.exists?(try)
129
- file = try
130
- break
131
- end
132
- file || raise(RocketIO::TemplateError, '"%s" template not found in "%s".
133
- Tried extensions: %s' % [template, path, extensions.join(', ')])
134
- end
135
- end
136
-
137
- def compile_template template, engine, engine_opts = nil
138
- RocketIO::COMPILED_TEMPLATES[[template.hash, engine, engine_opts]] ||= begin
139
- engine.new(0, *engine_opts) { template }
140
- end
141
- end
142
- end
143
- end
144
-
145
- require 'rocketio/controller/render/engine'
146
- require 'rocketio/controller/render/layout'
147
- require 'rocketio/controller/render/layouts'
148
- require 'rocketio/controller/render/templates'
@@ -1,76 +0,0 @@
1
- module RocketIO
2
- class Controller
3
-
4
- # if no engine set, templates will be rendered using ERB engine.
5
- # any engine supported by [Tilt](github.com/rtomayko/tilt) can be used.
6
- # to set engine use symbolized constant name, e.g. :Slim, :Haml
7
- # engine name is Case Sensitive and there should be a Tilt::{ENGINE}Template class defined
8
- # e.g. `engine :Slim` will look for Tilt::SlimTemplate
9
- # and `engine RDiscount` will look for Tilt::RDiscountTemplate
10
- #
11
- # @note if a block given it will be executed at instance level
12
- # and result used for engine. To have any options passed at engine initialization
13
- # the block should return an array having engine as first element
14
- # and options as consequent elements.
15
- #
16
- # @note if given block returns no engine, inherited engine will be used
17
- #
18
- # @example use static engine
19
- # engine :Slim
20
- #
21
- # @example use static engine with options
22
- # engine :Slim, pretty_print: true
23
- #
24
- # @example use dynamically set engine
25
- # engine do
26
- # some_condition ? :SomeEngine : AnotherEngine
27
- # end
28
- #
29
- # @example use dynamically set engine with options
30
- # engine do
31
- # some_condition ? [:SomeEngine, :opt1, :opt2] : AnotherEngine
32
- # end
33
- #
34
- # @example Search will use ERB when requested by a bot and Slim otherwise
35
- #
36
- # class BaseController < RocketIO
37
- # engine :Slim
38
- # end
39
- #
40
- # class Search < BaseController
41
- # engine do
42
- # if request.user_agent =~ /i'm a bot/
43
- # # requested by a bot, using ERB
44
- # :ERB
45
- # end
46
- # # requested by a user, returning no engine for inherited engine to be used
47
- # end
48
- # end
49
- #
50
- # @param engine engine name.
51
- # @param *engine_options any arguments to be passed at engine initialization
52
- # @param block to be executed at instance level
53
- #
54
- def self.engine engine = nil, *engine_options, &block
55
- @__engine__ = block || [RocketIO.engine_class(engine), engine_options.freeze].freeze
56
- define_engine_methods
57
- end
58
-
59
- def self.define_engine_methods source = self
60
- return unless engine = source.instance_variable_get(:@__engine__)
61
- if Proc === engine
62
- selfengine = allocate.engine
63
- define_method(:__rocketio_engine__, &engine)
64
- define_method(:engine) {
65
- engine, *engine_options = __rocketio_engine__
66
- return selfengine unless engine
67
- [RocketIO.engine_class(engine), engine_options.freeze].freeze
68
- }
69
- else
70
- define_method(:engine) {engine}
71
- end
72
- end
73
-
74
- def engine; RocketIO::DEFAULT_ENGINE end
75
- end
76
- end
@@ -1,27 +0,0 @@
1
- module RocketIO
2
- class Controller
3
-
4
- # by default templates will be rendered without layout.
5
- # to make them render inside a layout use `layout :layout_name` at class level.
6
- # to use a layout it should be defined at first (@see define_layout)
7
- #
8
- # @note to disable layout set it to false: `layout false`
9
- #
10
- # @param layout name of a defined layout
11
- #
12
- def self.layout layout
13
- @__layout__ = layout
14
- define_layout_methods
15
- end
16
-
17
- def self.define_layout_methods source = self
18
- return unless source.instance_variables.include?(:@__layout__)
19
- layout = source.instance_variable_get(:@__layout__)
20
- define_method(:layout) {layout}
21
- end
22
-
23
- # by default no layout used, so this method returns nil.
24
- # controllers that uses a layout will override this method.
25
- def layout; end
26
- end
27
- end
@@ -1,85 +0,0 @@
1
- module RocketIO
2
- class Controller
3
-
4
- # if only name given it will search for a file with same name in controller's dirname.
5
- #
6
- # if file name differs from layout name pass it as :file option.
7
- # file path should be relative to controller's dirname.
8
- # also a block accepted for :file option. the block will be executed at controllers's instance level
9
- # and should return path to layout file.
10
- # file name should NOT include extension.
11
- #
12
- # if a block given NO file will be searched and returned value will be used as layout.
13
- #
14
- # @note files will be searched relative to controller's dirname,
15
- # that's it, the folder controller was defined in and operates from.
16
- #
17
- # @note when searching for file multiple extensions will be tried,
18
- # that's it, all extensions controller's engine actually supports.
19
- #
20
- # @note controllers that inherits named layouts will always search for files in own dirname.
21
- # controllers that inherits :file layouts will search files in the original controller's dirname.
22
- #
23
- # @example define :master layout.
24
- # ./master.erb file will be used
25
- #
26
- # define_layout :master
27
- #
28
- # @example define :master layout.
29
- # ../layouts/master.erb file will be used
30
- #
31
- # define_layout :master, file: '../layouts/master'
32
- #
33
- # @example define :master layout.
34
- # ./admin file to be used when user logged in and ./user otherwise
35
- #
36
- # define_layout :master, file: -> {user? ? 'admin' : 'user'}
37
- #
38
- # @example define :master layout using a block that returns the layout string.
39
- # no file will be used.
40
- #
41
- # define_layout(:master) do
42
- # layout = Layouts.find_by(id: params[:layout_id]) || halt(400, 'Template not found')
43
- # layout.source
44
- # end
45
- #
46
- # @param name
47
- # @param file
48
- # @param block
49
- #
50
- def self.define_layout name, file: nil, &block
51
- file && block && raise(::ArgumentError, 'both file and block given, please use either one')
52
- (@__layouts__ ||= {})[name.to_sym] = {block: block, root: dirname, file: file, name: name}.freeze
53
- define_layouts_methods
54
- end
55
-
56
- def self.define_layouts_methods source = self
57
- return unless source.instance_variables.include?(:@__layouts__)
58
- layouts = source.instance_variable_get(:@__layouts__).each_with_object(allocate.layouts.dup) do |(name,setup),o|
59
- o[name] = :"__#{name}_layout__"
60
- if setup[:block]
61
- # block given, do not search for file, use returned value instead
62
- define_method(o[name], &setup[:block])
63
- elsif setup[:file]
64
- # file given, search the file in original controller dirname
65
- meth_name = :"__#{name}_layout_file__"
66
- meth_proc = setup[:file].is_a?(::Proc) ? setup[:file] : -> {setup[:file]}
67
- define_method(meth_name, &meth_proc)
68
- define_method o[name] do
69
- engine, * = resolve_engine
70
- read_template(find_template(setup[:root], __send__(meth_name), engine))
71
- end
72
- else
73
- # only name given, search for a file with same name in controller's dirname
74
- define_method o[name] do
75
- engine, * = resolve_engine
76
- read_template(find_template(self.dirname, setup[:name], engine))
77
- end
78
- end
79
- end.freeze
80
- define_method(:layouts) {layouts}
81
- end
82
-
83
- def layouts; RocketIO::EMPTY_HASH end
84
- end
85
- end
@@ -1,83 +0,0 @@
1
- module RocketIO
2
- class Controller
3
-
4
- # if only name given it will search for a file with same name in controller's dirname
5
- #
6
- # if file name differs from template name pass it as :file option.
7
- # file path should be relative to controller's dirname.
8
- # also a block accepted for :file option. the block will be executed at controllers's instance level
9
- # and should return path to template file.
10
- # file name should NOT include extension.
11
- #
12
- # if a block given NO file will be searched and returned value will be used as template.
13
- #
14
- # @note files will be searched relative to controller's dirname,
15
- # that's it, the folder controller was defined in and operates from.
16
- #
17
- # @note when searching for file multiple extensions will be tried,
18
- # that's it, all extensions controller's engine actually supports.
19
- #
20
- # @note controllers that inherits named templates will always search for files in own dirname.
21
- # controllers that inherits :file templates will search files in the original controller's dirname.
22
- #
23
- # @example define :items template.
24
- # ./items.erb file will be used
25
- # define_template :items
26
- #
27
- # @example define :items template.
28
- # ../shared_templates/items.erb file will be used
29
- # define_template :items, file: '../shared_templates/items'
30
- #
31
- # @example define :items template.
32
- # ./admin-items.erb file to be used when user logged in and ./items.erb otherwise
33
- #
34
- # define_template :items, file: -> {user? ? 'admin-items' : 'items'}
35
- #
36
- # @example define :items template using a block that returns the template string.
37
- # no file will be used.
38
- #
39
- # define_template(:items) do
40
- # template = Templates.find_by(id: params[:template_id]) || halt(400, 'Template not found')
41
- # template.source
42
- # end
43
- #
44
- # @param name
45
- # @param file
46
- # @param block
47
- #
48
- def self.define_template name, file: nil, &block
49
- file && block && raise(ArgumentError, 'both file and block given, please use either one')
50
- (@__templates__ ||= {})[name.to_sym] = {block: block, root: dirname, file: file, name: name}.freeze
51
- define_templates_methods
52
- end
53
-
54
- def self.define_templates_methods source = self
55
- return unless source.instance_variables.include?(:@__templates__)
56
- templates = source.instance_variable_get(:@__templates__).each_with_object(allocate.templates.dup) do |(name,setup),o|
57
- o[name] = :"__#{name}_template__"
58
- if setup[:block]
59
- # block given, do not search for file, use returned value instead
60
- define_method(o[name], &setup[:block])
61
- elsif setup[:file]
62
- # file given, search the file in original controller dirname
63
- meth_name = :"__#{name}_template_file__"
64
- meth_proc = setup[:file].is_a?(Proc) ? setup[:file] : -> {setup[:file]}
65
- define_method(meth_name, &meth_proc)
66
- define_method o[name] do
67
- engine, * = resolve_engine
68
- read_template(find_template(setup[:root], __send__(meth_name), engine))
69
- end
70
- else
71
- # only name given, search for a file with same name in controller's dirname
72
- define_method o[name] do
73
- engine, * = resolve_engine
74
- read_template(find_template(self.dirname, setup[:name], engine))
75
- end
76
- end
77
- end.freeze
78
- define_method(:templates) {templates}
79
- end
80
-
81
- def templates; RocketIO::EMPTY_HASH end
82
- end
83
- end