rack-xapper 0.0.1

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.
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
@@ -0,0 +1,21 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Ivan Porto Carrero
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.
@@ -0,0 +1,81 @@
1
+ = Rack Xapper
2
+
3
+ This is a Rack Middleware which will generate Silverlight xap files for DLR projects.
4
+ It mimics the functionality of Chiron the development server for working with Silverlight and the DLR.
5
+ This enables integration of Silverlight in any framework that supports Rack (Merb/Rails/Sinatra/...).
6
+
7
+ === Configuration options
8
+
9
+ By default the middleware makes some decisions on how it thinks your application is structured.
10
+
11
+ DEFAULT_OPTIONS= {
12
+ :assembly_path => ::File.dirname(__FILE__) + '/../assemblies',
13
+ :xap_path => "sl",
14
+ :source_path => 'app/silverlight',
15
+ :extra_app_files => [],
16
+ :xap_name => 'app',
17
+ :external_url_prefix => "/dlr-slvx",
18
+ :root => 'public',
19
+ :sl_version => :clr2,
20
+ :languages => LANGUAGES,
21
+ :app_manifest => APP_MANIFEST_TEMPLATE
22
+ }
23
+
24
+ You can override any of these settings and I'll explain them first:
25
+
26
+ * <tt>:assembly_path</tt>: the place to look for the silverlight and DLR assemblies
27
+ * <tt>:xap_path</tt>: the folder under the root where the xap will be saved
28
+ * <tt>:source_path</tt>: the folder containing the application entry point and source files
29
+ * <tt>:extra_app_files</tt>: extra folders that should be included in the xap file
30
+ * <tt>:xap_name</tt>: the name of the xap file
31
+ * <tt>:root</tt>: the root folder for the xap path
32
+ * <tt>:sl_version</tt>: the silverlight version to use (currently :clr2, :clr3)
33
+ * <tt>:languages</tt>: the supported languages
34
+ * <tt>:app_manifest</tt>: the template used to generate the AppManifest.xaml file
35
+
36
+ === Frameworks support
37
+
38
+ Rack is supported by many frameworks but some are configured differently.
39
+ Here are some examples to get you started
40
+
41
+ ==== Rails configuration
42
+
43
+ # in environment.rb
44
+ config.gem "rack-xapper", :lib => "rack/xapper", :source => "http://gemcutter.org"
45
+ config.middleware.use "Rack::Xapper", :source_path => "app/silverlight"
46
+
47
+ ==== Sinatra configuration
48
+
49
+ require 'rack/xapper'
50
+
51
+ class Application < Sinatra::Application
52
+ use Rack::Xapper, :source_path => "silverlight"
53
+ end
54
+
55
+ ==== Rack configuration
56
+
57
+ # in config.ru
58
+ require 'rack/xapper'
59
+
60
+ use Rack::Xapper, :source_path => "silverlight"
61
+
62
+ == Note
63
+
64
+ * This is the result of a late night hacking session so the library is a little light on tests.
65
+
66
+ * This middleware has a dependency on rubyzip2 but unfortunately the gemspec of rubyzip2 is faulty.
67
+ It's missing the version.rb file. I've sent a pull request to the owner of that gem so hopefully it will be fixed soon.
68
+
69
+ == Note on Patches/Pull Requests
70
+
71
+ * Fork the project.
72
+ * Make your feature addition or bug fix.
73
+ * Add tests for it. This is important so I don't break it in a
74
+ future version unintentionally.
75
+ * Commit, do not mess with rakefile, version, or history.
76
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
77
+ * Send me a pull request. Bonus points for topic branches.
78
+
79
+ == Copyright
80
+
81
+ Copyright (c) 2009 Ivan Porto Carrero. See LICENSE for details.
@@ -0,0 +1,46 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "rack-xapper"
8
+ gem.summary = %Q{Rack middleware for generating xap files}
9
+ gem.description = %Q{Rack middleware for generating xapfiles that know about the DLR}
10
+ gem.email = "ivan@flanders.co.nz"
11
+ gem.homepage = "http://github.com/casualjim/rack-xapper"
12
+ gem.authors = ["casualjim"]
13
+ gem.add_development_dependency "rspec", ">= 1.2.9"
14
+ gem.add_dependency "rubyzip2", ">= 2.0.0"
15
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
16
+ end
17
+ Jeweler::GemcutterTasks.new
18
+ rescue LoadError
19
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
20
+ end
21
+
22
+ require 'spec/rake/spectask'
23
+ Spec::Rake::SpecTask.new(:spec) do |spec|
24
+ spec.libs << 'lib' << 'spec'
25
+ spec.spec_files = FileList['spec/**/*_spec.rb']
26
+ end
27
+
28
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
29
+ spec.libs << 'lib' << 'spec'
30
+ spec.pattern = 'spec/**/*_spec.rb'
31
+ spec.rcov = true
32
+ end
33
+
34
+ task :spec => :check_dependencies
35
+
36
+ task :default => :spec
37
+
38
+ require 'rake/rdoctask'
39
+ Rake::RDocTask.new do |rdoc|
40
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
41
+
42
+ rdoc.rdoc_dir = 'rdoc'
43
+ rdoc.title = "rack-xapper #{version}"
44
+ rdoc.rdoc_files.include('README*')
45
+ rdoc.rdoc_files.include('lib/**/*.rb')
46
+ end
@@ -0,0 +1,4 @@
1
+ ---
2
+ :patch: 1
3
+ :major: 0
4
+ :minor: 0
@@ -0,0 +1,301 @@
1
+ require "zip/zip"
2
+ require "time" # for Time.httpdate
3
+ require 'rack/utils'
4
+ require 'rack/mime'
5
+ require 'rexml/document'
6
+
7
+ module Rack
8
+
9
+ class XapBuilder
10
+
11
+ F = ::File
12
+ X = ::REXML
13
+
14
+ class << self
15
+
16
+ def xap_to_memory(root)
17
+
18
+ end
19
+
20
+ def xap_to_disk(options, xap_file="")
21
+ xap_file = options[:xap_name] if xap_file.to_s.empty?
22
+ xap_file = "#{xap_file}.xap" if xap_file !~ /\.xap$/
23
+
24
+ collect_metadata(options) unless options.key?(:application_files)
25
+
26
+ Zip::ZipFile.open(F.join(options[:root], options[:xap_path], xap_file), Zip::ZipFile::CREATE) do |zipfile|
27
+ xap_files(zipfile, options)
28
+ end
29
+ end
30
+
31
+ def collect_metadata(options)
32
+ options[:application_files] = collect_application_files options
33
+ options[:extra_app_files] = collect_extra_app_files options
34
+ options[:assembly_files] = Dir.glob(F.join(options[:assembly_path],"**","*"))
35
+ options[:languages_in_use] = find_languages_in_use options
36
+ end
37
+
38
+ private
39
+ def xap_files(archive, options)
40
+ add_dlr_assemblies archive, options
41
+ add_languages archive, options
42
+ add_extra_directories archive, options
43
+ add_application_files archive, options
44
+ generate_languages_config archive, options
45
+ generate_app_manifest archive, options
46
+ end
47
+
48
+ def generate_app_manifest(archive, options)
49
+ archive.get_output_stream("AppManifest.xaml") do |f|
50
+ doc = X::Document.new(options[:app_manifest]||Xapper::APP_MANIFEST_TEMPLATE)
51
+ options[:added_assemblies].each do |assembly|
52
+ ele = X::Element.new "AssemblyPart"
53
+ ele.attributes['Source'] = assembly
54
+ doc.root.elements['Deployment.Parts'] << ele
55
+ end
56
+ f.puts doc.to_s
57
+ end
58
+ end
59
+
60
+ def generate_languages_config(archive, options)
61
+ archive.get_output_stream("languages.config") do |f|
62
+ doc = X::Document.new("<Languages></Languages>")
63
+ options[:languages_in_use].each do |language|
64
+ ele = X::Element.new "Language"
65
+ ele.attributes['names'] = language[:names].join(",")
66
+ ele.attributes['extensions'] = language[:extensions].join(",")
67
+ ele.attributes['languageContext'] = language[:context]
68
+ ele.attributes['assemblies'] = language[:assemblies].join(";")
69
+ ele.attributes['external'] = language[:external]
70
+ doc.root << ele
71
+ end
72
+ f.puts doc.to_s
73
+ end
74
+ end
75
+
76
+ def add_dlr_assemblies(archive, options)
77
+ add_dlr_assembly archive, options, "Microsoft.Dynamic"
78
+ add_dlr_assembly archive, options, "Microsoft.Scripting"
79
+ if [:clr2, :clr3, :sl2, :sl3].include?(options[:sl_version].to_sym)
80
+ add_dlr_assembly archive, options, "Microsoft.Scripting.Core"
81
+ add_dlr_assembly archive, options, "Microsoft.Scripting.ExtensionAttribute"
82
+ end
83
+ add_dlr_assembly archive, options, "Microsoft.Scripting.Silverlight" if (ENV['RACK_ENV']||'development') != 'production'
84
+ end
85
+
86
+ def add_languages(archive, options)
87
+ options[:languages_in_use].each do |language|
88
+ language[:assemblies].each do |assembly|
89
+ add_dlr_assembly archive, options, assembly
90
+ end
91
+ end
92
+ end
93
+
94
+ def add_dlr_assembly(archive, options, name)
95
+ options[:added_assemblies] ||= []
96
+ pth = assembly_path(options, name)
97
+ if F.file?(pth)
98
+ nm = F.basename pth
99
+ archive.add nm, pth
100
+ options[:added_assemblies] << nm
101
+ end
102
+ end
103
+
104
+ def assembly_path(options, name)
105
+ name = "#{name}.dll" unless /\.dll$/ =~ name
106
+ F.join(options[:assembly_path], name)
107
+ end
108
+
109
+ def find_languages_in_use(options)
110
+ (options[:application_files] + options[:extra_app_files]).inject([]) do |langs, candidate|
111
+ lang = options[:languages].find { |lang| lang[:extensions].include?(F.extname(candidate)) }
112
+ langs << lang if lang
113
+ langs
114
+ end
115
+ end
116
+
117
+ def collect_application_files(options)
118
+ Dir.glob(F.join(options[:source_path], "**", "*"))
119
+ end
120
+
121
+ def collect_extra_app_files(options)
122
+ options[:extra_app_files].collect do |pth|
123
+ Dir.glob(F.join(pth, "**", "*"))
124
+ end.flatten
125
+ end
126
+
127
+ def add_extra_directories(archive, options)
128
+ options[:extra_app_files].collect do |pth|
129
+ archive.add F.basename(path), path if F.file?(path)
130
+ end
131
+ end
132
+
133
+ def add_application_files(archive, options)
134
+ options[:application_files].each do |en|
135
+ archive.add F.basename(en), en if F.file?(en)
136
+ end
137
+ end
138
+ end
139
+
140
+ end
141
+
142
+ class Xapper
143
+
144
+ Rack::Mime::MIME_TYPES.merge!({
145
+ ".js" => "application/x-javascript",
146
+ ".py" => "application/python",
147
+ ".rb" => "application/ruby",
148
+ ".zip" => "application/x-zip-compressed",
149
+ ".slvx" => "application/x-zip-compressed",
150
+ ".xaml" => "application/xaml+xml",
151
+ ".xap" => "application/x-zip-compressed"
152
+ })
153
+
154
+ APP_MANIFEST_TEMPLATE = <<-TEMPLEND
155
+
156
+ <Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" RuntimeVersion="2.0.31005.0" EntryPointAssembly="Microsoft.Scripting.Silverlight" EntryPointType="Microsoft.Scripting.Silverlight.DynamicApplication" ExternalCallersFromCrossDomain="ScriptableOnly">
157
+ <!-- Add assembly references here -->
158
+ <Deployment.Parts>
159
+ <!-- In the XAP -->
160
+ <!-- <AssemblyPart Source="Foo.dll" /> -->
161
+ <!-- Outside the XAP, same domain -->
162
+ <!-- <AssemblyPart Source="/Foo.dll" /> -->
163
+ <!-- Outside the XAP, different domain -->
164
+ <!-- <AssemblyPart Source="http://bar.com/Foo.dll" /> -->
165
+
166
+ </Deployment.Parts>
167
+ <!-- Add transparent platform extensions (.slvx) references here -->
168
+ <Deployment.ExternalParts>
169
+ <!-- Example -->
170
+ <!-- <ExtensionPart Source="http://bar.com/v1/Foo.slvx" /> -->
171
+ </Deployment.ExternalParts>
172
+ </Deployment>
173
+
174
+ TEMPLEND
175
+
176
+ LANGUAGES=[
177
+ {
178
+ :names => %w(IronPython Python py),
179
+ :extensions => %w(.py),
180
+ :context => "IronPython.Runtime.PythonContext",
181
+ :assemblies => %w(IronPython.dll IronPython.Modules.dll),
182
+ :external => "IronPython.slvx"
183
+ },
184
+ {
185
+ :names => %w(IronRuby Ruby rb),
186
+ :extensions => %w(.rb),
187
+ :context => "IronRuby.Runtime.RubyContext",
188
+ :assemblies => %w(IronRuby.dll IronRuby.Libraries.dll),
189
+ :external => "IronRuby.slvx"
190
+ }
191
+ ]
192
+
193
+ DEFAULT_OPTIONS= {
194
+ :assembly_path => ::File.dirname(__FILE__) + '/../assemblies',
195
+ :xap_path => "sl",
196
+ :source_path => 'app/silverlight',
197
+ :extra_app_files => [],
198
+ :xap_name => 'app',
199
+ :external_url_prefix => "/dlr-slvx",
200
+ :root => 'public',
201
+ :sl_version => :clr2,
202
+ :languages => LANGUAGES,
203
+ :app_manifest => APP_MANIFEST_TEMPLATE
204
+ }
205
+
206
+
207
+
208
+ def initialize(app, options={})
209
+ @xap_options = DEFAULT_OPTIONS.merge(options)
210
+ @app = app
211
+ end
212
+
213
+ def call(env)
214
+ path = env['PATH_INFO']
215
+ can_serve = /#{@xap_options[:xap_name]}\.xap/ =~ path
216
+
217
+ if can_serve
218
+ file_server = XapFile.new(@xap_options)
219
+ file_server.call(env)
220
+ else
221
+ @app.call(env)
222
+ end
223
+ end
224
+ end
225
+
226
+ class XapFile
227
+
228
+ def initialize(options)
229
+ @options = options.dup
230
+ xap_name = "#{@options[:xap_name]}"
231
+ xap_name = "#{xap_name}.xap" if xap_name !~ /\.xap$/
232
+ @xap_path = @options[:root] + "/" + @options[:xap_path] + "/" + xap_name
233
+ end
234
+
235
+ def call(env)
236
+ dup._call(env)
237
+ end
238
+
239
+ F = ::File
240
+
241
+ def _call(env)
242
+ @path_info = Utils.unescape(env["PATH_INFO"])
243
+ return forbidden if @path_info.include? ".."
244
+
245
+ if dev_env? or xap_changed?
246
+ FileUtils.rm(@xap_path) if F.exist?(@xap_path)
247
+ XapBuilder.xap_to_disk @options
248
+ end
249
+
250
+ begin
251
+ if F.file?(@xap_path) && F.readable?(@xap_path)
252
+ [200, {
253
+ "Date" => F.mtime(@xap_path).httpdate,
254
+ "Content-Type" => Mime.mime_type(F.extname(@xap_path), 'application/x-zip-compressed'),
255
+ "Cache-Control" => "no-cache",
256
+ "Expires" => "-1",
257
+ 'Pragma' => "no-cache",
258
+ "Content-Length" => F.size?(@xap_path).to_s
259
+ }, self]
260
+ else
261
+ raise Errno::EPERM
262
+ end
263
+ rescue SystemCallError
264
+ not_found
265
+ end
266
+ end
267
+
268
+ def dev_env?
269
+ (ENV['RACK_ENV'] || 'development').to_sym != :production
270
+ end
271
+
272
+ def xap_changed?
273
+ XapBuilder.collect_metadata(@options)
274
+ files = @options[:application_files] + @options[:extra_app_files] + @options[:assembly_files]
275
+ xap_mtime = File.mtime(@xap_path)
276
+ files.any?{ |f| File.mtime(f) > xap_mtime }
277
+ end
278
+
279
+ def forbidden
280
+ body = "Forbidden\n"
281
+ [403, {"Content-Type" => "text/plain",
282
+ "Content-Length" => body.size.to_s},
283
+ [body]]
284
+ end
285
+
286
+ def not_found
287
+ body = "File not found: #{@path_info}\n"
288
+ [404, {"Content-Type" => "text/plain",
289
+ "Content-Length" => body.size.to_s},
290
+ [body]]
291
+ end
292
+
293
+ def each
294
+ F.open(@xap_path, "rb") { |file|
295
+ while part = file.read(8192)
296
+ yield part
297
+ end
298
+ }
299
+ end
300
+ end
301
+ end
@@ -0,0 +1,68 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{rack-xapper}
8
+ s.version = "0.0.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["casualjim"]
12
+ s.date = %q{2009-11-28}
13
+ s.description = %q{Rack middleware for generating xapfiles that know about the DLR}
14
+ s.email = %q{ivan@flanders.co.nz}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".gitignore",
22
+ "LICENSE",
23
+ "README.rdoc",
24
+ "Rakefile",
25
+ "VERSION.yml",
26
+ "lib/assemblies/IronPython.Modules.dll",
27
+ "lib/assemblies/IronPython.dll",
28
+ "lib/assemblies/IronRuby.Libraries.dll",
29
+ "lib/assemblies/IronRuby.dll",
30
+ "lib/assemblies/Microsoft.Dynamic.dll",
31
+ "lib/assemblies/Microsoft.Scripting.Core.dll",
32
+ "lib/assemblies/Microsoft.Scripting.Debugging.dll",
33
+ "lib/assemblies/Microsoft.Scripting.ExtensionAttribute.dll",
34
+ "lib/assemblies/Microsoft.Scripting.Silverlight.dll",
35
+ "lib/assemblies/Microsoft.Scripting.dll",
36
+ "lib/rack/xapper.rb",
37
+ "rack-xapper.gemspec",
38
+ "spec/spec.opts",
39
+ "spec/spec_helper.rb",
40
+ "spec/xapper_spec.rb"
41
+ ]
42
+ s.homepage = %q{http://github.com/casualjim/rack-xapper}
43
+ s.rdoc_options = ["--charset=UTF-8"]
44
+ s.require_paths = ["lib"]
45
+ s.rubygems_version = %q{1.3.5}
46
+ s.summary = %q{Rack middleware for generating xap files}
47
+ s.test_files = [
48
+ "spec/spec_helper.rb",
49
+ "spec/xapper_spec.rb"
50
+ ]
51
+
52
+ if s.respond_to? :specification_version then
53
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
54
+ s.specification_version = 3
55
+
56
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
57
+ s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
58
+ s.add_runtime_dependency(%q<rubyzip2>, [">= 2.0.0"])
59
+ else
60
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
61
+ s.add_dependency(%q<rubyzip2>, [">= 2.0.0"])
62
+ end
63
+ else
64
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
65
+ s.add_dependency(%q<rubyzip2>, [">= 2.0.0"])
66
+ end
67
+ end
68
+
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,9 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+ require 'rack-xapper'
4
+ require 'spec'
5
+ require 'spec/autorun'
6
+
7
+ Spec::Runner.configure do |config|
8
+
9
+ end
@@ -0,0 +1,7 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "RackXapper" do
4
+ it "fails" do
5
+ fail "hey buddy, you should probably rename this file and start specing for real"
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,96 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rack-xapper
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - casualjim
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-11-28 00:00:00 +01:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rspec
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.2.9
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: rubyzip2
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 2.0.0
34
+ version:
35
+ description: Rack middleware for generating xapfiles that know about the DLR
36
+ email: ivan@flanders.co.nz
37
+ executables: []
38
+
39
+ extensions: []
40
+
41
+ extra_rdoc_files:
42
+ - LICENSE
43
+ - README.rdoc
44
+ files:
45
+ - .document
46
+ - .gitignore
47
+ - LICENSE
48
+ - README.rdoc
49
+ - Rakefile
50
+ - VERSION.yml
51
+ - lib/assemblies/IronPython.Modules.dll
52
+ - lib/assemblies/IronPython.dll
53
+ - lib/assemblies/IronRuby.Libraries.dll
54
+ - lib/assemblies/IronRuby.dll
55
+ - lib/assemblies/Microsoft.Dynamic.dll
56
+ - lib/assemblies/Microsoft.Scripting.Core.dll
57
+ - lib/assemblies/Microsoft.Scripting.Debugging.dll
58
+ - lib/assemblies/Microsoft.Scripting.ExtensionAttribute.dll
59
+ - lib/assemblies/Microsoft.Scripting.Silverlight.dll
60
+ - lib/assemblies/Microsoft.Scripting.dll
61
+ - lib/rack/xapper.rb
62
+ - rack-xapper.gemspec
63
+ - spec/spec.opts
64
+ - spec/spec_helper.rb
65
+ - spec/xapper_spec.rb
66
+ has_rdoc: true
67
+ homepage: http://github.com/casualjim/rack-xapper
68
+ licenses: []
69
+
70
+ post_install_message:
71
+ rdoc_options:
72
+ - --charset=UTF-8
73
+ require_paths:
74
+ - lib
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: "0"
80
+ version:
81
+ required_rubygems_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: "0"
86
+ version:
87
+ requirements: []
88
+
89
+ rubyforge_project:
90
+ rubygems_version: 1.3.5
91
+ signing_key:
92
+ specification_version: 3
93
+ summary: Rack middleware for generating xap files
94
+ test_files:
95
+ - spec/spec_helper.rb
96
+ - spec/xapper_spec.rb