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.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +20 -0
- data/README.rdoc +81 -0
- data/Rakefile +46 -0
- data/VERSION.yml +4 -0
- data/lib/assemblies/IronPython.Modules.dll +0 -0
- data/lib/assemblies/IronPython.dll +0 -0
- data/lib/assemblies/IronRuby.Libraries.dll +0 -0
- data/lib/assemblies/IronRuby.dll +0 -0
- data/lib/assemblies/Microsoft.Dynamic.dll +0 -0
- data/lib/assemblies/Microsoft.Scripting.Core.dll +0 -0
- data/lib/assemblies/Microsoft.Scripting.Debugging.dll +0 -0
- data/lib/assemblies/Microsoft.Scripting.ExtensionAttribute.dll +0 -0
- data/lib/assemblies/Microsoft.Scripting.Silverlight.dll +0 -0
- data/lib/assemblies/Microsoft.Scripting.dll +0 -0
- data/lib/rack/xapper.rb +301 -0
- data/rack-xapper.gemspec +68 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/xapper_spec.rb +7 -0
- metadata +96 -0
data/.document
ADDED
data/.gitignore
ADDED
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.
|
data/README.rdoc
ADDED
@@ -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.
|
data/Rakefile
ADDED
@@ -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
|
data/VERSION.yml
ADDED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/lib/rack/xapper.rb
ADDED
@@ -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
|
data/rack-xapper.gemspec
ADDED
@@ -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
|
+
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/spec/spec_helper.rb
ADDED
data/spec/xapper_spec.rb
ADDED
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
|