circuit 0.2.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 (75) hide show
  1. data/Gemfile +34 -0
  2. data/LICENSE +20 -0
  3. data/README.md +161 -0
  4. data/Rakefile +27 -0
  5. data/config.ru +7 -0
  6. data/description.md +5 -0
  7. data/docs/COMPATIBILITY.md +14 -0
  8. data/docs/ROADMAP.md +29 -0
  9. data/lib/circuit.rb +125 -0
  10. data/lib/circuit/behavior.rb +99 -0
  11. data/lib/circuit/compatibility.rb +73 -0
  12. data/lib/circuit/middleware.rb +6 -0
  13. data/lib/circuit/middleware/rewriter.rb +43 -0
  14. data/lib/circuit/rack.rb +14 -0
  15. data/lib/circuit/rack/behavioral.rb +45 -0
  16. data/lib/circuit/rack/builder.rb +50 -0
  17. data/lib/circuit/rack/multi_site.rb +22 -0
  18. data/lib/circuit/rack/request.rb +81 -0
  19. data/lib/circuit/railtie.rb +24 -0
  20. data/lib/circuit/storage.rb +74 -0
  21. data/lib/circuit/storage/memory_model.rb +70 -0
  22. data/lib/circuit/storage/nodes.rb +56 -0
  23. data/lib/circuit/storage/nodes/memory_store.rb +63 -0
  24. data/lib/circuit/storage/nodes/model.rb +67 -0
  25. data/lib/circuit/storage/nodes/mongoid_store.rb +56 -0
  26. data/lib/circuit/storage/sites.rb +38 -0
  27. data/lib/circuit/storage/sites/memory_store.rb +53 -0
  28. data/lib/circuit/storage/sites/model.rb +29 -0
  29. data/lib/circuit/storage/sites/mongoid_store.rb +43 -0
  30. data/lib/circuit/validators.rb +74 -0
  31. data/lib/circuit/version.rb +3 -0
  32. data/spec/internal/app/behaviors/change_path.rb +7 -0
  33. data/spec/internal/app/controllers/application_controller.rb +5 -0
  34. data/spec/internal/app/helpers/application_helper.rb +2 -0
  35. data/spec/internal/config/initializers/circuit.rb +7 -0
  36. data/spec/internal/config/routes.rb +3 -0
  37. data/spec/internal/db/schema.rb +1 -0
  38. data/spec/lib/circuit/behavior_spec.rb +113 -0
  39. data/spec/lib/circuit/middleware/rewriter_spec.rb +79 -0
  40. data/spec/lib/circuit/rack/behavioral_spec.rb +60 -0
  41. data/spec/lib/circuit/rack/builder_spec.rb +125 -0
  42. data/spec/lib/circuit/rack/multi_site_spec.rb +34 -0
  43. data/spec/lib/circuit/rack/request_spec.rb +80 -0
  44. data/spec/lib/circuit/railtie_spec.rb +34 -0
  45. data/spec/lib/circuit/storage/nodes_spec.rb +62 -0
  46. data/spec/lib/circuit/storage/sites_spec.rb +60 -0
  47. data/spec/lib/circuit/storage_spec.rb +20 -0
  48. data/spec/lib/circuit/validators_spec.rb +69 -0
  49. data/spec/lib/circuit_spec.rb +139 -0
  50. data/spec/spec_helper.rb +79 -0
  51. data/spec/support/blueprints.rb +24 -0
  52. data/spec/support/matchers/be_current_time_matcher.rb +14 -0
  53. data/spec/support/matchers/extended_have_key.rb +31 -0
  54. data/spec/support/matchers/have_accessor_matcher.rb +13 -0
  55. data/spec/support/matchers/have_attribute_matcher.rb +22 -0
  56. data/spec/support/matchers/have_block_matcher.rb +14 -0
  57. data/spec/support/matchers/have_errors_on_matcher.rb +30 -0
  58. data/spec/support/matchers/have_module_matcher.rb +13 -0
  59. data/spec/support/matchers/have_reader_matcher.rb +18 -0
  60. data/spec/support/matchers/have_writer_matcher.rb +18 -0
  61. data/spec/support/matchers/set_instance_variable.rb +32 -0
  62. data/spec/support/spec_helpers/base_behaviors.rb +20 -0
  63. data/spec/support/spec_helpers/base_models.rb +64 -0
  64. data/spec/support/spec_helpers/logger_helpers.rb +58 -0
  65. data/spec/support/spec_helpers/multi_site_helper.rb +48 -0
  66. data/spec/support/spec_helpers/rack_helpers.rb +8 -0
  67. data/spec/support/spec_helpers/shared_examples/node_store.rb +87 -0
  68. data/spec/support/spec_helpers/shared_examples/site_store.rb +76 -0
  69. data/spec/support/spec_helpers/simple_machinable.rb +29 -0
  70. data/spec/support/spec_helpers/stores_cleaner.rb +46 -0
  71. data/vendor/active_support-3.2/core_ext/string/inflections.rb +53 -0
  72. data/vendor/active_support-3.2/inflector/methods.rb +65 -0
  73. data/vendor/rack-1.4/builder.rb +167 -0
  74. data/vendor/rack-1.4/urlmap.rb +96 -0
  75. metadata +238 -0
@@ -0,0 +1,96 @@
1
+ ## Copied from Rack 1.4.1 on 19 June 2012.
2
+ ## see http://github.com/rack/rack/blob/1.4.1/lib/rack/urlmap.rb
3
+
4
+ # Copyright (c) 2007, 2008, 2009, 2010 Christian Neukirchen <purl.org/net/chneukirchen>
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to
8
+ # deal in the Software without restriction, including without limitation the
9
+ # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10
+ # sell copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in
14
+ # all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19
+ # THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
20
+ # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21
+ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+
23
+ module Rack
24
+ # Rack::URLMap takes a hash mapping urls or paths to apps, and
25
+ # dispatches accordingly. Support for HTTP/1.1 host names exists if
26
+ # the URLs start with <tt>http://</tt> or <tt>https://</tt>.
27
+ #
28
+ # URLMap modifies the SCRIPT_NAME and PATH_INFO such that the part
29
+ # relevant for dispatch is in the SCRIPT_NAME, and the rest in the
30
+ # PATH_INFO. This should be taken care of when you need to
31
+ # reconstruct the URL in order to create links.
32
+ #
33
+ # URLMap dispatches in such a way that the longest paths are tried
34
+ # first, since they are most specific.
35
+
36
+ class URLMap
37
+ NEGATIVE_INFINITY = -1.0 / 0.0
38
+
39
+ def initialize(map = {})
40
+ remap(map)
41
+ end
42
+
43
+ def remap(map)
44
+ @mapping = map.map { |location, app|
45
+ if location =~ %r{\Ahttps?://(.*?)(/.*)}
46
+ host, location = $1, $2
47
+ else
48
+ host = nil
49
+ end
50
+
51
+ unless location[0] == ?/
52
+ raise ArgumentError, "paths need to start with /"
53
+ end
54
+
55
+ location = location.chomp('/')
56
+ match = Regexp.new("^#{Regexp.quote(location).gsub('/', '/+')}(.*)", nil, 'n')
57
+
58
+ [host, location, match, app]
59
+ }.sort_by do |(host, location, _, _)|
60
+ [host ? -host.size : NEGATIVE_INFINITY, -location.size]
61
+ end
62
+ end
63
+
64
+ def call(env)
65
+ path = env["PATH_INFO"]
66
+ script_name = env['SCRIPT_NAME']
67
+ hHost = env['HTTP_HOST']
68
+ sName = env['SERVER_NAME']
69
+ sPort = env['SERVER_PORT']
70
+
71
+ @mapping.each do |host, location, match, app|
72
+ unless hHost == host \
73
+ || sName == host \
74
+ || (!host && (hHost == sName || hHost == sName+':'+sPort))
75
+ next
76
+ end
77
+
78
+ next unless m = match.match(path.to_s)
79
+
80
+ rest = m[1]
81
+ next unless !rest || rest.empty? || rest[0] == ?/
82
+
83
+ env['SCRIPT_NAME'] = (script_name + location)
84
+ env['PATH_INFO'] = rest
85
+
86
+ return app.call(env)
87
+ end
88
+
89
+ [404, {"Content-Type" => "text/plain", "X-Cascade" => "pass"}, ["Not Found: #{path}"]]
90
+
91
+ ensure
92
+ env['PATH_INFO'] = path
93
+ env['SCRIPT_NAME'] = script_name
94
+ end
95
+ end
96
+ end
metadata ADDED
@@ -0,0 +1,238 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: circuit
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Maxmedia
9
+ - Blake Chambers
10
+ - Travis D. Warlick, Jr.
11
+ autorequire:
12
+ bindir: bin
13
+ cert_chain: []
14
+ date: 2012-06-28 00:00:00.000000000 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: rack
18
+ requirement: !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ~>
22
+ - !ruby/object:Gem::Version
23
+ version: '1.3'
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ none: false
28
+ requirements:
29
+ - - ~>
30
+ - !ruby/object:Gem::Version
31
+ version: '1.3'
32
+ - !ruby/object:Gem::Dependency
33
+ name: activesupport
34
+ requirement: !ruby/object:Gem::Requirement
35
+ none: false
36
+ requirements:
37
+ - - ~>
38
+ - !ruby/object:Gem::Version
39
+ version: '3.1'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '3.1'
48
+ - !ruby/object:Gem::Dependency
49
+ name: activemodel
50
+ requirement: !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ~>
54
+ - !ruby/object:Gem::Version
55
+ version: '3.1'
56
+ type: :runtime
57
+ prerelease: false
58
+ version_requirements: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ~>
62
+ - !ruby/object:Gem::Version
63
+ version: '3.1'
64
+ - !ruby/object:Gem::Dependency
65
+ name: dionysus
66
+ requirement: !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ~>
70
+ - !ruby/object:Gem::Version
71
+ version: 2.0.0
72
+ type: :runtime
73
+ prerelease: false
74
+ version_requirements: !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ~>
78
+ - !ruby/object:Gem::Version
79
+ version: 2.0.0
80
+ description: ! 'Circuit is a rack application middleware that enables dynamic request
81
+ mapping. Modeled after [Rack::Builder](https://github.com/rack/rack/blob/master/lib/rack/builder.rb),
82
+ Circuit provides for a tree of url-mappings that is walked at request time. If
83
+ you are interested in dynamically loading middleware and functionality into requests,
84
+ circuit is a viable solution to do that in a maintainable way. '
85
+ email:
86
+ - it@maxmedia.com
87
+ - chambb1@gmail.com
88
+ - twarlick@gmail.com
89
+ executables: []
90
+ extensions: []
91
+ extra_rdoc_files:
92
+ - README.md
93
+ - LICENSE
94
+ - docs/COMPATIBILITY.md
95
+ - docs/ROADMAP.md
96
+ files:
97
+ - lib/circuit/behavior.rb
98
+ - lib/circuit/compatibility.rb
99
+ - lib/circuit/middleware/rewriter.rb
100
+ - lib/circuit/middleware.rb
101
+ - lib/circuit/rack/behavioral.rb
102
+ - lib/circuit/rack/builder.rb
103
+ - lib/circuit/rack/multi_site.rb
104
+ - lib/circuit/rack/request.rb
105
+ - lib/circuit/rack.rb
106
+ - lib/circuit/railtie.rb
107
+ - lib/circuit/storage/memory_model.rb
108
+ - lib/circuit/storage/nodes/memory_store.rb
109
+ - lib/circuit/storage/nodes/model.rb
110
+ - lib/circuit/storage/nodes/mongoid_store.rb
111
+ - lib/circuit/storage/nodes.rb
112
+ - lib/circuit/storage/sites/memory_store.rb
113
+ - lib/circuit/storage/sites/model.rb
114
+ - lib/circuit/storage/sites/mongoid_store.rb
115
+ - lib/circuit/storage/sites.rb
116
+ - lib/circuit/storage.rb
117
+ - lib/circuit/validators.rb
118
+ - lib/circuit/version.rb
119
+ - lib/circuit.rb
120
+ - vendor/active_support-3.2/core_ext/string/inflections.rb
121
+ - vendor/active_support-3.2/inflector/methods.rb
122
+ - vendor/rack-1.4/builder.rb
123
+ - vendor/rack-1.4/urlmap.rb
124
+ - config.ru
125
+ - Gemfile
126
+ - Rakefile
127
+ - description.md
128
+ - README.md
129
+ - LICENSE
130
+ - docs/COMPATIBILITY.md
131
+ - docs/ROADMAP.md
132
+ - spec/internal/app/behaviors/change_path.rb
133
+ - spec/internal/app/controllers/application_controller.rb
134
+ - spec/internal/app/helpers/application_helper.rb
135
+ - spec/internal/config/initializers/circuit.rb
136
+ - spec/internal/config/routes.rb
137
+ - spec/internal/db/schema.rb
138
+ - spec/lib/circuit/behavior_spec.rb
139
+ - spec/lib/circuit/middleware/rewriter_spec.rb
140
+ - spec/lib/circuit/rack/behavioral_spec.rb
141
+ - spec/lib/circuit/rack/builder_spec.rb
142
+ - spec/lib/circuit/rack/multi_site_spec.rb
143
+ - spec/lib/circuit/rack/request_spec.rb
144
+ - spec/lib/circuit/railtie_spec.rb
145
+ - spec/lib/circuit/storage/nodes_spec.rb
146
+ - spec/lib/circuit/storage/sites_spec.rb
147
+ - spec/lib/circuit/storage_spec.rb
148
+ - spec/lib/circuit/validators_spec.rb
149
+ - spec/lib/circuit_spec.rb
150
+ - spec/spec_helper.rb
151
+ - spec/support/blueprints.rb
152
+ - spec/support/matchers/be_current_time_matcher.rb
153
+ - spec/support/matchers/extended_have_key.rb
154
+ - spec/support/matchers/have_accessor_matcher.rb
155
+ - spec/support/matchers/have_attribute_matcher.rb
156
+ - spec/support/matchers/have_block_matcher.rb
157
+ - spec/support/matchers/have_errors_on_matcher.rb
158
+ - spec/support/matchers/have_module_matcher.rb
159
+ - spec/support/matchers/have_reader_matcher.rb
160
+ - spec/support/matchers/have_writer_matcher.rb
161
+ - spec/support/matchers/set_instance_variable.rb
162
+ - spec/support/spec_helpers/base_behaviors.rb
163
+ - spec/support/spec_helpers/base_models.rb
164
+ - spec/support/spec_helpers/logger_helpers.rb
165
+ - spec/support/spec_helpers/multi_site_helper.rb
166
+ - spec/support/spec_helpers/rack_helpers.rb
167
+ - spec/support/spec_helpers/shared_examples/node_store.rb
168
+ - spec/support/spec_helpers/shared_examples/site_store.rb
169
+ - spec/support/spec_helpers/simple_machinable.rb
170
+ - spec/support/spec_helpers/stores_cleaner.rb
171
+ homepage: http://github.com/maxmedia/circuit
172
+ licenses:
173
+ - MIT
174
+ post_install_message:
175
+ rdoc_options:
176
+ - --main
177
+ - README.md
178
+ require_paths:
179
+ - lib
180
+ required_ruby_version: !ruby/object:Gem::Requirement
181
+ none: false
182
+ requirements:
183
+ - - ! '>='
184
+ - !ruby/object:Gem::Version
185
+ version: 1.8.7
186
+ required_rubygems_version: !ruby/object:Gem::Requirement
187
+ none: false
188
+ requirements:
189
+ - - ! '>='
190
+ - !ruby/object:Gem::Version
191
+ version: '0'
192
+ requirements: []
193
+ rubyforge_project:
194
+ rubygems_version: 1.8.24
195
+ signing_key:
196
+ specification_version: 3
197
+ summary: Dynamic (backend-driven) request routing for Rack
198
+ test_files:
199
+ - spec/internal/app/behaviors/change_path.rb
200
+ - spec/internal/app/controllers/application_controller.rb
201
+ - spec/internal/app/helpers/application_helper.rb
202
+ - spec/internal/config/initializers/circuit.rb
203
+ - spec/internal/config/routes.rb
204
+ - spec/internal/db/schema.rb
205
+ - spec/lib/circuit/behavior_spec.rb
206
+ - spec/lib/circuit/middleware/rewriter_spec.rb
207
+ - spec/lib/circuit/rack/behavioral_spec.rb
208
+ - spec/lib/circuit/rack/builder_spec.rb
209
+ - spec/lib/circuit/rack/multi_site_spec.rb
210
+ - spec/lib/circuit/rack/request_spec.rb
211
+ - spec/lib/circuit/railtie_spec.rb
212
+ - spec/lib/circuit/storage/nodes_spec.rb
213
+ - spec/lib/circuit/storage/sites_spec.rb
214
+ - spec/lib/circuit/storage_spec.rb
215
+ - spec/lib/circuit/validators_spec.rb
216
+ - spec/lib/circuit_spec.rb
217
+ - spec/spec_helper.rb
218
+ - spec/support/blueprints.rb
219
+ - spec/support/matchers/be_current_time_matcher.rb
220
+ - spec/support/matchers/extended_have_key.rb
221
+ - spec/support/matchers/have_accessor_matcher.rb
222
+ - spec/support/matchers/have_attribute_matcher.rb
223
+ - spec/support/matchers/have_block_matcher.rb
224
+ - spec/support/matchers/have_errors_on_matcher.rb
225
+ - spec/support/matchers/have_module_matcher.rb
226
+ - spec/support/matchers/have_reader_matcher.rb
227
+ - spec/support/matchers/have_writer_matcher.rb
228
+ - spec/support/matchers/set_instance_variable.rb
229
+ - spec/support/spec_helpers/base_behaviors.rb
230
+ - spec/support/spec_helpers/base_models.rb
231
+ - spec/support/spec_helpers/logger_helpers.rb
232
+ - spec/support/spec_helpers/multi_site_helper.rb
233
+ - spec/support/spec_helpers/rack_helpers.rb
234
+ - spec/support/spec_helpers/shared_examples/node_store.rb
235
+ - spec/support/spec_helpers/shared_examples/site_store.rb
236
+ - spec/support/spec_helpers/simple_machinable.rb
237
+ - spec/support/spec_helpers/stores_cleaner.rb
238
+ has_rdoc: