xig_installer 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog ADDED
@@ -0,0 +1,4 @@
1
+ == 0.0.1 / 2010-01-05
2
+
3
+ * initial release
4
+
data/README ADDED
@@ -0,0 +1,29 @@
1
+
2
+ = xig_installer
3
+
4
+
5
+ == Description
6
+
7
+
8
+ == Installation
9
+
10
+ === Archive Installation
11
+
12
+ rake install
13
+
14
+ === Gem Installation
15
+
16
+ gem install xig_installer
17
+
18
+
19
+ == Features/Problems
20
+
21
+
22
+ == Synopsis
23
+
24
+
25
+ == Copyright
26
+
27
+ Author:: wtnabe <wtnabe@gmail.com>
28
+ Copyright:: Copyright (c) 2010 wtnabe
29
+ License::
data/Rakefile ADDED
@@ -0,0 +1,145 @@
1
+ # -*- mode: ruby -*-
2
+ require 'rubygems'
3
+ require 'rake'
4
+ require 'rake/clean'
5
+ require 'rake/testtask'
6
+ require 'rake/packagetask'
7
+ require 'rake/gempackagetask'
8
+ require 'rake/rdoctask'
9
+ require 'rake/contrib/rubyforgepublisher'
10
+ require 'rake/contrib/sshpublisher'
11
+ require 'fileutils'
12
+ require 'lib/xig_installer'
13
+ include FileUtils
14
+
15
+ NAME = "xig_installer"
16
+ AUTHOR = "wtnabe"
17
+ EMAIL = "wtnabe@gmail.com"
18
+ DESCRIPTION = "Installer for net-irc example irc gateways"
19
+ RUBYFORGE_PROJECT = "xig_installer"
20
+ HOMEPATH = "http://github.com/wtnabe/xig_installer"
21
+ BIN_FILES = %w( xig_installer )
22
+
23
+ VERS = XigInstaller::VERSION
24
+ REV = File.read(".svn/entries")[/committed-rev="(d+)"/, 1] rescue nil
25
+ CLEAN.include ['**/.*.sw?', '*.gem', '.config']
26
+ RDOC_OPTS = [
27
+ '--title', "#{NAME} documentation",
28
+ "--charset", "utf-8",
29
+ "--opname", "index.html",
30
+ "--line-numbers",
31
+ "--main", "README",
32
+ "--inline-source",
33
+ ]
34
+
35
+ task :default => [:test]
36
+ task :package => [:clean]
37
+
38
+ Rake::TestTask.new("test") do |t|
39
+ t.libs << "test"
40
+ t.pattern = "test/**/*_test.rb"
41
+ t.verbose = true
42
+ end
43
+
44
+ spec = Gem::Specification.new do |s|
45
+ s.name = NAME
46
+ s.version = VERS
47
+ s.platform = Gem::Platform::RUBY
48
+ s.has_rdoc = true
49
+ s.extra_rdoc_files = ["README", "ChangeLog"]
50
+ s.rdoc_options += RDOC_OPTS + ['--exclude', '^(examples|extras)/']
51
+ s.summary = DESCRIPTION
52
+ s.description = DESCRIPTION
53
+ s.author = AUTHOR
54
+ s.email = EMAIL
55
+ s.homepage = HOMEPATH
56
+ s.executables = BIN_FILES
57
+ s.rubyforge_project = RUBYFORGE_PROJECT
58
+ s.bindir = "bin"
59
+ s.require_path = "lib"
60
+ #s.autorequire = ""
61
+ s.test_files = Dir["test/*_test.rb"]
62
+
63
+ s.add_dependency('net-irc')
64
+ #s.required_ruby_version = '>= 1.8.2'
65
+
66
+ s.files = %w(README ChangeLog Rakefile) +
67
+ Dir.glob("{bin,doc,test,lib,templates,generator,extras,website,script}/**/*") +
68
+ Dir.glob("ext/**/*.{h,c,rb}") +
69
+ Dir.glob("examples/**/*.rb") +
70
+ Dir.glob("tools/*.rb") +
71
+ Dir.glob("rails/*.rb")
72
+
73
+ s.extensions = FileList["ext/**/extconf.rb"].to_a
74
+ end
75
+
76
+ Rake::GemPackageTask.new(spec) do |p|
77
+ p.need_tar = true
78
+ p.gem_spec = spec
79
+ end
80
+
81
+ task :install do
82
+ name = "#{NAME}-#{VERS}.gem"
83
+ sh %{rake package}
84
+ sh %{sudo gem install pkg/#{name}}
85
+ end
86
+
87
+ task :uninstall => [:clean] do
88
+ sh %{sudo gem uninstall #{NAME}}
89
+ end
90
+
91
+
92
+ Rake::RDocTask.new do |rdoc|
93
+ rdoc.rdoc_dir = 'html'
94
+ rdoc.options += RDOC_OPTS
95
+ rdoc.template = "resh"
96
+ #rdoc.template = "#{ENV['template']}.rb" if ENV['template']
97
+ if ENV['DOC_FILES']
98
+ rdoc.rdoc_files.include(ENV['DOC_FILES'].split(/,\s*/))
99
+ else
100
+ rdoc.rdoc_files.include('README', 'ChangeLog')
101
+ rdoc.rdoc_files.include('lib/**/*.rb')
102
+ rdoc.rdoc_files.include('ext/**/*.c')
103
+ end
104
+ end
105
+
106
+ desc "Publish to RubyForge"
107
+ task :rubyforge => [:rdoc, :package] do
108
+ require 'rubyforge'
109
+ Rake::RubyForgePublisher.new(RUBYFORGE_PROJECT, 'wtnabe').upload
110
+ end
111
+
112
+ desc 'Package and upload the release to rubyforge.'
113
+ task :release => [:clean, :package] do |t|
114
+ v = ENV["VERSION"] or abort "Must supply VERSION=x.y.z"
115
+ abort "Versions don't match #{v} vs #{VERS}" unless v == VERS
116
+ pkg = "pkg/#{NAME}-#{VERS}"
117
+
118
+ require 'rubyforge'
119
+ rf = RubyForge.new.configure
120
+ puts "Logging in"
121
+ rf.login
122
+
123
+ c = rf.userconfig
124
+ # c["release_notes"] = description if description
125
+ # c["release_changes"] = changes if changes
126
+ c["preformatted"] = true
127
+
128
+ files = [
129
+ "#{pkg}.tgz",
130
+ "#{pkg}.gem"
131
+ ].compact
132
+
133
+ puts "Releasing #{NAME} v. #{VERS}"
134
+ rf.add_release RUBYFORGE_PROJECT, NAME, VERS, *files
135
+ end
136
+
137
+ desc 'Show information about the gem.'
138
+ task :debug_gem do
139
+ puts spec.to_ruby
140
+ end
141
+
142
+ desc 'Update gem spec'
143
+ task :gemspec do
144
+ open("#{NAME}.gemspec", 'w').write spec.to_ruby
145
+ end
data/bin/xig_installer ADDED
@@ -0,0 +1,7 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ $LOAD_PATH << File.dirname( __FILE__ ) + '/../lib' if File.exist?( File.dirname( __FILE__ ) + '/../lib' )
4
+ require 'rubygems'
5
+ require 'xig_installer'
6
+
7
+ XigInstaller.new.run
@@ -0,0 +1,300 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'pathname'
3
+ require 'optparse'
4
+ require 'erb'
5
+ include FileUtils::Verbose
6
+
7
+ class XigInstaller
8
+ VERSION = '0.0.1'
9
+ TARGET_DIR = '/usr/local/bin'
10
+ XIG_GLOB = '*ig.rb'
11
+
12
+ class CommandNotExist < StandardError ; end
13
+ class DirectoryNotExist < StandardError; end
14
+ class NetIRCNotInstalled < StandardError; end
15
+ class TargetGatewayNotValid < StandardError; end
16
+ class TargetGatewayNotInstalled < StandardError; end
17
+
18
+ def initialize
19
+ @commands = nil
20
+ @gateways = nil
21
+ @gateway_dir = nil
22
+ @max_cmdname_length = nil
23
+ @target_dir = TARGET_DIR
24
+ end
25
+ attr_reader :target_dir
26
+
27
+ def run
28
+ if ( cmd = parse_args() )
29
+ if ( commands.include?( cmd ) )
30
+ exec_cmd( cmd )
31
+ elsif ( cmd == 'help' )
32
+ usage( ARGV.shift )
33
+ elsif ( cmd =~ /\A(?:--)?version\z/ )
34
+ usage( 'version' )
35
+ end
36
+ else
37
+ usage
38
+ end
39
+ end
40
+
41
+ def exec_cmd( cmd )
42
+ if commands.include?( cmd )
43
+ send( "cmd_#{cmd}", *ARGV )
44
+ else
45
+ raise CommandNotExist
46
+ end
47
+ end
48
+
49
+ def commands
50
+ if ( !@commands )
51
+ @commands = methods.grep( /\Acmd_(.*)\z/ ).map { |e|
52
+ e.sub( /\Acmd_(.*)\z/, '\1' )
53
+ }
54
+ end
55
+
56
+ return @commands
57
+ end
58
+
59
+ def installed?( name )
60
+ Dir.chdir( @target_dir ) {
61
+ Dir.glob( XIG_GLOB ).include?( name )
62
+ }
63
+ end
64
+
65
+ def different?( name )
66
+ begin
67
+ src = File.stat( File.join( gateway_dir, name ) )
68
+ begin
69
+ dest = File.stat( File.join( @target_dir, name ) )
70
+ if ( src.mtime != dest.mtime )
71
+ return true
72
+ else
73
+ return false
74
+ end
75
+ rescue Errno::ENOENT
76
+ return true
77
+ end
78
+ rescue Errno::ENOENT
79
+ raise NetIRCNotInstalled
80
+ end
81
+ end
82
+
83
+ def gateways( dir = nil )
84
+ dir ||= gateway_dir
85
+
86
+ if ( dir )
87
+ if ( File.exist?( dir ) )
88
+ Dir.chdir( dir ) {
89
+ Dir.glob( XIG_GLOB )
90
+ }
91
+ else
92
+ raise DirectoryNotExist, dir
93
+ end
94
+ else
95
+ raise NetIRCNotInstalled
96
+ end
97
+ end
98
+
99
+ def gateway_dir
100
+ if ( @gateway_dir.nil? )
101
+ net_irc = `gem which net/irc`.chomp
102
+
103
+ if ( File.exist?( net_irc ) )
104
+ @gateway_dir = (Pathname( net_irc ).
105
+ parent.parent.parent + 'examples').to_s
106
+ else
107
+ @gateway_dir = false
108
+ end
109
+ end
110
+
111
+ return @gateway_dir
112
+ end
113
+
114
+ def cmd_list( subcmd = nil )
115
+ subcmds = methods.grep( /\A_cmd_list_(.*)\z/ ).map { |c|
116
+ c.sub( /\A_cmd_list_(.*)\z/, '\1' )
117
+ }
118
+ if ( subcmd == 'help' )
119
+ subcmds
120
+ elsif ( subcmds.include?( subcmd ) )
121
+ puts send( "_cmd_list_#{subcmd}" )
122
+ else
123
+ puts _cmd_list_available
124
+ end
125
+ end
126
+
127
+ def _cmd_list_available
128
+ gateways
129
+ end
130
+
131
+ def _cmd_list_installed
132
+ gateways.reject { |e|
133
+ !installed?( e )
134
+ }
135
+ end
136
+
137
+ def _cmd_list_update
138
+ _cmd_list_installed.reject { |e|
139
+ different?( name )
140
+ }
141
+ end
142
+
143
+ def cmd_install( *targets )
144
+ available = gateways & targets
145
+ if ( targets.size == 0 )
146
+ _copy( gateways )
147
+ elsif ( available == targets )
148
+ _copy( targets )
149
+ else
150
+ raise TargetGatewayNotValid, (targets - available).join( ', ' )
151
+ end
152
+ end
153
+
154
+ def cmd_upgrade( *targets )
155
+ if ( targets.size == 0 )
156
+ _cmd_list_installed.map { |e|
157
+ different?( e ) ? cmd_install( e ).to_s : nil
158
+ }.compact
159
+ else
160
+ targets.reject { |e|
161
+ !installed?( e )
162
+ }.map { |e|
163
+ different?( e ) ? cmd_install( e ).to_s : nil
164
+ }.compact
165
+ end
166
+ end
167
+
168
+ def _copy( targets )
169
+ targets.each { |e|
170
+ cp( File.join( gateway_dir, e ), @target_dir, :preserve => true )
171
+ }
172
+ end
173
+
174
+ def cmd_uninstall( *targets )
175
+ installed = _cmd_list_installed
176
+ available = installed & targets
177
+ if ( targets.size == 0 )
178
+ _remove( installed )
179
+ elsif ( available == targets )
180
+ _remove( targets )
181
+ else
182
+ raise TargetGatewayNotInstalled, (targets - installed).join( ', ' )
183
+ end
184
+ end
185
+
186
+ def _remove( targets )
187
+ targets.each { |e|
188
+ rm( File.join( @target_dir, e ) )
189
+ }
190
+ end
191
+
192
+ def usage( cmd = nil )
193
+ puts "#{self.class} ver.#{VERSION}"
194
+ if ( commands.include?( cmd ) )
195
+ puts "\n"
196
+ puts send( "usage_#{cmd}" )
197
+ elsif ( cmd == 'version' )
198
+ ;
199
+ else
200
+ puts ERB.new( <<EOD, nil, '-' ).result( binding )
201
+
202
+ Usage: #{File.basename( $0 )} command [options] [TARGET]
203
+
204
+ Commands:
205
+ <%- commands.sort.each do |e| -%>
206
+ <%= simple_help( e ) %>
207
+ <%- end -%>
208
+
209
+ Options:
210
+ <%= parser.help.sub( /[\r\n]/, '' ) %>
211
+ EOD
212
+ end
213
+ exit
214
+ end
215
+
216
+ def usage_list( subcmd = nil )
217
+ ERB.new( <<EOD, nil, '-' ).result( binding )
218
+ show gateway list
219
+
220
+ Usage: #{File.basename( $0 )} list [subcommand]
221
+
222
+ Subcommands:
223
+ <%- cmd_list( 'help' ).sort.each do |cmd| -%>
224
+ <%= cmd %>
225
+ <%- end -%>
226
+ EOD
227
+ end
228
+
229
+ def usage_install
230
+ ERB.new( <<EOD ).result( binding )
231
+ install specified or all gateways
232
+ EOD
233
+ end
234
+
235
+ def usage_upgrade
236
+ ERB.new( <<EOD ).result( binding )
237
+ upgrade specified or all gateways if need
238
+ EOD
239
+ end
240
+
241
+ def usage_uninstall
242
+ ERB.new( <<EOD ).result( binding )
243
+ uninstall specified or all gateways
244
+ EOD
245
+ end
246
+
247
+ def simple_help( cmd )
248
+ if ( commands.include?( cmd ) )
249
+ return sprintf( "%-*s %s",
250
+ max_cmdname_length,
251
+ cmd,
252
+ send( "usage_#{cmd}" ).lines.first.chomp )
253
+ end
254
+ end
255
+
256
+ def max_cmdname_length
257
+ if ( !@max_cmdname_length )
258
+ @max_cmdname_length = commands.map { |e|
259
+ e.size
260
+ }.max
261
+ end
262
+
263
+ return @max_cmdname_length
264
+ end
265
+
266
+ def parse_args
267
+ parser.parse!( ARGV )
268
+ return ARGV.shift
269
+ end
270
+
271
+ def parser
272
+ return OptionParser.new { |opt|
273
+ opt.banner = ''
274
+ opt.on( '-t', '--target DIR', 'target directory' ) { |d|
275
+ dir = File.expand_path( d )
276
+ if ( File.exist?( dir ) and File.directory?( dir ) )
277
+ @target_dir = dir
278
+ else
279
+ raise DirectoryNotExist, d
280
+ end
281
+ }
282
+ opt.on( '-g', '--gateway DIR', 'gateway source directory' ) { |d|
283
+ dir = File.expand_path( d )
284
+ if ( File.exist?( dir ) and File.directory?( dir ) )
285
+ @gateway_dir = dir
286
+ else
287
+ raise DirectoryNotExist, d
288
+ end
289
+ }
290
+ }
291
+ end
292
+ end
293
+
294
+ if ( !String.respond_to?( :lines ) )
295
+ class String
296
+ def lines
297
+ self.split( /(?:\r\n|[\r\n])/ )
298
+ end
299
+ end
300
+ end
@@ -0,0 +1,3 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../lib/xig_installer'
3
+
@@ -0,0 +1,155 @@
1
+ require 'rubygems'
2
+ require File.dirname(__FILE__) + '/test_helper.rb'
3
+
4
+ require "test/unit"
5
+ class XigInstallerTest < Test::Unit::TestCase
6
+ def setup
7
+ @obj = XigInstaller.new
8
+ begin
9
+ @obj.cmd_uninstall
10
+ rescue
11
+ end
12
+ end
13
+
14
+ def teardown
15
+ @obj.cmd_uninstall
16
+ end
17
+
18
+ def test_exec_cmd
19
+ c = 'abc'
20
+ assert( !@obj.commands.include?( c ) )
21
+ begin
22
+ assert( @obj.exec_cmd( c ) )
23
+ rescue XigInstaller::CommandNotExist
24
+ assert( true )
25
+ end
26
+ end
27
+
28
+ def test_commands
29
+ cmds = @obj.commands
30
+ assert( cmds.is_a?( Array ) )
31
+ assert( cmds.size > 0 )
32
+ end
33
+
34
+ def test_installed?
35
+ assert( !@obj.installed?( 'tig.rb' ) )
36
+ @obj.cmd_install( 'tig.rb' )
37
+ assert( @obj.installed?( 'tig.rb' ) )
38
+ end
39
+
40
+ def test_gateways
41
+ begin
42
+ require 'net/irc'
43
+ gateways = @obj.gateways
44
+ assert( gateways.is_a?( Array ) )
45
+ assert( gateways.size > 0 )
46
+ gateways.each { |e|
47
+ assert( e =~ /\A.*ig\.rb\z/ )
48
+ }
49
+ rescue LoadError
50
+ assert( !@obj.gateways )
51
+ end
52
+ begin
53
+ @obj.gateways( 'target' )
54
+ rescue XigInstaller::DirectoryNotExist
55
+ assert( true )
56
+ end
57
+ end
58
+
59
+ def test_gateway_dir
60
+ begin
61
+ require 'net/irc'
62
+ assert( File.exist?( @obj.gateway_dir ) )
63
+ rescue LoadError
64
+ assert( !@obj.gateway_dir )
65
+ end
66
+ end
67
+
68
+ def test_cmd_list
69
+ subcmds = @obj.cmd_list( 'help' )
70
+ assert( subcmds.is_a?( Array ) )
71
+ assert( subcmds.size > 0 )
72
+ end
73
+
74
+ def test_cmd_list_available
75
+ availables = @obj._cmd_list_available
76
+ assert( availables.is_a?( Array ) )
77
+ assert( availables.size > 0 )
78
+ end
79
+
80
+ def test_cmd_list_installed
81
+ assert( @obj._cmd_list_installed.is_a?( Array ) )
82
+ end
83
+
84
+ def test_cmd_list_update
85
+ installed = @obj._cmd_list_installed
86
+ assert( @obj._cmd_list_update.size == installed.size )
87
+ end
88
+
89
+ def test_cmd_install
90
+ begin
91
+ @obj.cmd_install( 'foo' )
92
+ rescue XigInstaller::TargetGatewayNotValid
93
+ assert( true )
94
+ end
95
+ assert( tig = @obj.cmd_install( 'tig.rb' ) )
96
+ @obj.cmd_uninstall()
97
+ assert( all = @obj.cmd_install() )
98
+ assert( all.size > tig.size )
99
+ end
100
+
101
+ def test_cmd_upgrade
102
+ target = 'tig.rb'
103
+ @obj.cmd_install( target )
104
+ File.utime( File.stat( __FILE__ ).atime,
105
+ File.stat( __FILE__ ).mtime,
106
+ File.join( @obj.target_dir, target ) )
107
+ assert( @obj.different?( target ) )
108
+ assert( @obj.cmd_upgrade( target ) == [target] )
109
+ assert( !@obj.different?( target ) )
110
+ assert( @obj.cmd_upgrade( target ) == [] )
111
+ File.utime( File.stat( __FILE__ ).atime,
112
+ File.stat( __FILE__ ).mtime,
113
+ File.join( @obj.target_dir, target ) )
114
+ assert( @obj.cmd_upgrade() == [target] )
115
+ end
116
+
117
+ def test_cmd_uninstall
118
+ @obj.cmd_install( 'tig.rb' )
119
+ assert( tig = @obj.cmd_uninstall( 'tig.rb' ) )
120
+ @obj.cmd_install( 'tig.rb' )
121
+ assert( all = @obj.cmd_uninstall() )
122
+ assert( tig == all )
123
+ assert( @obj.cmd_uninstall() )
124
+ begin
125
+ @obj.cmd_uninstall( 'tig.rb' )
126
+ rescue XigInstaller::TargetGatewayNotInstalled
127
+ assert( true )
128
+ end
129
+ begin
130
+ @obj.cmd_uninstall( 'foo' )
131
+ rescue XigInstaller::TargetGatewayNotInstalled
132
+ assert( true )
133
+ end
134
+ end
135
+ def test_parser
136
+ assert( @obj.parser.parse( %w( help ) ) == %w( help ) )
137
+ assert( @obj.target_dir == '/usr/local/bin' )
138
+ # -t
139
+ target = (%w( /opt/local/bin /sw/local/bin ) +
140
+ [File.expand_path(File.dirname( __FILE__ ))]).find { |e|
141
+ File.exist?( e )
142
+ }
143
+ @obj.parser.parse( %w( install -t ) + [target] )
144
+ assert( @obj.target_dir == target )
145
+ begin
146
+ @obj.parser.parse( %w( install -t ) + [target] )
147
+ rescue XigInstaller::DirectoryNotExist
148
+ assert( true )
149
+ end
150
+ # -g
151
+ src = (Pathname( __FILE__ ).parent.expand_path).to_s
152
+ @obj.parser.parse( %w( install -g ) + [src] )
153
+ assert( @obj.gateway_dir == src )
154
+ end
155
+ end
metadata ADDED
@@ -0,0 +1,82 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: xig_installer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - wtnabe
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-01-05 00:00:00 +09:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: net-irc
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ description: Installer for net-irc example irc gateways
26
+ email: wtnabe@gmail.com
27
+ executables:
28
+ - xig_installer
29
+ extensions: []
30
+
31
+ extra_rdoc_files:
32
+ - README
33
+ - ChangeLog
34
+ files:
35
+ - README
36
+ - ChangeLog
37
+ - Rakefile
38
+ - bin/xig_installer
39
+ - test/xig_installer_test.rb
40
+ - test/test_helper.rb
41
+ - lib/xig_installer.rb
42
+ has_rdoc: true
43
+ homepage: http://github.com/wtnabe/xig_installer
44
+ licenses: []
45
+
46
+ post_install_message:
47
+ rdoc_options:
48
+ - --title
49
+ - xig_installer documentation
50
+ - --charset
51
+ - utf-8
52
+ - --opname
53
+ - index.html
54
+ - --line-numbers
55
+ - --main
56
+ - README
57
+ - --inline-source
58
+ - --exclude
59
+ - ^(examples|extras)/
60
+ require_paths:
61
+ - lib
62
+ required_ruby_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: "0"
67
+ version:
68
+ required_rubygems_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: "0"
73
+ version:
74
+ requirements: []
75
+
76
+ rubyforge_project: xig_installer
77
+ rubygems_version: 1.3.5
78
+ signing_key:
79
+ specification_version: 3
80
+ summary: Installer for net-irc example irc gateways
81
+ test_files:
82
+ - test/xig_installer_test.rb