instigator 0.9

Sign up to get free protection for your applications and to get access to all the features.
data/.bundle/config ADDED
@@ -0,0 +1,2 @@
1
+ ---
2
+ BUNDLE_DISABLE_SHARED_GEMS: "1"
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ *.gem
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source :gemcutter
2
+
3
+ # Specify your gem's dependencies in instigator.gemspec
4
+ gemspec
5
+ # need the fix
6
+ # gem 'octokit', :git => 'git://github.com/pengwynn/octokit.git'
data/Gemfile.lock ADDED
@@ -0,0 +1,38 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ instigator (0.9)
5
+ activesupport
6
+ awesome_print
7
+ i18n
8
+ open4
9
+ thor
10
+ uuid
11
+ watchr
12
+
13
+ GEM
14
+ remote: http://rubygems.org/
15
+ specs:
16
+ activesupport (3.0.6)
17
+ awesome_print (0.3.2)
18
+ i18n (0.5.0)
19
+ macaddr (1.0.0)
20
+ open4 (1.0.1)
21
+ thor (0.14.6)
22
+ uuid (2.3.1)
23
+ macaddr (~> 1.0)
24
+ watchr (0.7)
25
+
26
+ PLATFORMS
27
+ ruby
28
+
29
+ DEPENDENCIES
30
+ activesupport
31
+ awesome_print
32
+ bundler (>= 1.0.0.rc.6)
33
+ i18n
34
+ instigator!
35
+ open4
36
+ thor
37
+ uuid
38
+ watchr
data/LICENSE ADDED
@@ -0,0 +1,30 @@
1
+ Copyright (c)2011, Mark Wotton
2
+
3
+ All rights reserved.
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ * Redistributions of source code must retain the above copyright
9
+ notice, this list of conditions and the following disclaimer.
10
+
11
+ * Redistributions in binary form must reproduce the above
12
+ copyright notice, this list of conditions and the following
13
+ disclaimer in the documentation and/or other materials provided
14
+ with the distribution.
15
+
16
+ * Neither the name of Mark Wotton nor the names of other
17
+ contributors may be used to endorse or promote products derived
18
+ from this software without specific prior written permission.
19
+
20
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,22 @@
1
+ Instigator is a template for starting new projects, intended to make it
2
+ easier to start a project with all of the goodies like testing, github
3
+ repo and optionally Jenkins integration set up.
4
+
5
+ Currently there are recipes for Sinatra apps running on heroku, and
6
+ Haskell apps and libraries.
7
+
8
+ Getting started:
9
+
10
+ bundle
11
+ # only needs to be done once per machine - substitue your CI server here.
12
+ jenkins nodes --host ci.shimweasel.com --port 80
13
+ git config --global github.token YOURTOKEN
14
+ git config --global github.user YOURLOGIN
15
+ git config --global jenkins.user YOURJENKINSUSER
16
+ git config --global jenkins.password YOURJENKINSPASSWORD
17
+
18
+
19
+ # a haskell library
20
+ instigate MYAPPNAME --project_type=haskell --lib
21
+ # or a sinatra project on heroku
22
+ instigate MYAPPNAME --project_type=sinatra
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
data/TODO ADDED
@@ -0,0 +1 @@
1
+ add local recipes/templates
data/bin/instigate ADDED
@@ -0,0 +1,5 @@
1
+ #! /usr/bin/env ruby
2
+ require 'thor'
3
+ require 'app'
4
+ ARGV.unshift 'setup'
5
+ App.start
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path("../lib/instigator/version", __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "instigator"
6
+ s.version = Instigator::VERSION
7
+ s.platform = Gem::Platform::RUBY
8
+ s.authors = ["Mark Wotton"]
9
+ s.email = ['mwotton@gmail.com']
10
+ s.homepage = "http://rubygems.org/gems/instigator"
11
+ s.summary = "Project starter for Haskell"
12
+ s.description = "Project starter for Haskell: sets up CI & github integration, along with best-practice stuff like tests and hlint"
13
+
14
+ s.required_rubygems_version = ">= 1.3.6"
15
+ s.rubyforge_project = "instigator"
16
+
17
+ s.add_development_dependency "bundler", ">= 1.0.0.rc.6"
18
+ s.add_dependency 'thor'
19
+ s.add_dependency 'activesupport'
20
+ s.add_dependency 'i18n'
21
+ s.add_dependency 'uuid'
22
+ s.add_dependency 'watchr'
23
+ s.add_dependency 'open4'
24
+ s.add_dependency 'awesome_print'
25
+
26
+
27
+ s.files = `git ls-files`.split("\n")
28
+ s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
29
+ s.require_path = 'lib'
30
+ end
data/lib/app.rb ADDED
@@ -0,0 +1,29 @@
1
+ # must be a nicer way of doing this
2
+ # $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
3
+ require 'github'
4
+ require 'jenkins'
5
+
6
+ class App < Thor
7
+ desc "setup", "create a new app"
8
+ argument :name # don't need it here, but still...
9
+ method_option :project_type, :type => :string, :default => "haskell"
10
+ def setup
11
+ require options.project_type rescue raise "No such project type #{options.project_type}"
12
+
13
+ [options.project_type, "github", "jenkins"].each do |task_group|
14
+ # run preflight if it exists
15
+ invoke "#{task_group}:preflight" # rescue puts "no preflight for #{task_group}"
16
+ end
17
+
18
+ invoke "#{options.project_type}:setup", [name]
19
+
20
+ invoke "github:new_project"
21
+ invoke "jenkins:new_project"
22
+ # this has to come last so that the hook set up for jenkins can be fired.
23
+ invoke "github:push"
24
+
25
+ end
26
+
27
+ end
28
+
29
+
data/lib/git_config.rb ADDED
@@ -0,0 +1,42 @@
1
+ require 'net/http'
2
+ require 'net/https'
3
+ require 'json'
4
+
5
+ module GitConfig
6
+
7
+ def email
8
+ git_attribute 'user.email', 'email'
9
+ end
10
+
11
+ def author
12
+ git_attribute 'user.name', 'author'
13
+ end
14
+
15
+ def github_token
16
+ git_attribute 'github.token', 'token'
17
+ end
18
+
19
+ def github_user
20
+ git_attribute 'github.user', 'username'
21
+ end
22
+
23
+ def jenkins_server
24
+ git_attribute 'jenkins.server', 'server'
25
+ end
26
+
27
+ def jenkins_user
28
+ git_attribute 'jenkins.user', 'user'
29
+ end
30
+
31
+ def jenkins_password
32
+ git_attribute 'jenkins.password', 'password'
33
+ end
34
+
35
+ protected
36
+ def git_attribute(tag, name)
37
+ guarded("git config --global #{tag}") do |error|
38
+ abort "please add your #{name} to ~/.gitconfig with\n git config --global #{tag} #{name.upcase}"
39
+ end.chomp
40
+ end
41
+
42
+ end
data/lib/github.rb ADDED
@@ -0,0 +1,83 @@
1
+ require 'uuid'
2
+ require 'net/https'
3
+ require 'net/http'
4
+ require 'json'
5
+ require 'git_config'
6
+
7
+ class Github < Thor
8
+ include GitConfig
9
+ argument :name
10
+
11
+ desc "preflight", "check dependencies"
12
+ def preflight
13
+ abort "you already have a #{name} project on github" unless
14
+ HTTParty.get("http://github.com/#{github_user}/#{name}").code == 404
15
+ github_user
16
+ github_token
17
+ end
18
+
19
+ desc "delete_project", "erase github project. BE VERY SURE"
20
+ method_option :confirm, :type => :boolean
21
+ def delete_project
22
+ abort "set --confirm to show you really mean it" unless options.confirm?
23
+ res = github_post("/repos/delete/#{github_user}/#{name}", :name => name)
24
+ delete_token = JSON.parse(res.body)['delete_token']
25
+ github_post("/repos/delete/#{github_user}/#{name}", :name => name, :delete_token => delete_token)
26
+ end
27
+
28
+ desc "new_project", "new project on github"
29
+ def new_project
30
+ Dir.chdir name do
31
+ guarded "git init"
32
+ guarded "git add ."
33
+ guarded "git commit -m 'initial commit'" do end
34
+ github_post('/repos/create', :name => name)
35
+ guarded "git remote add origin git@github.com:#{github_user}/#{name}"
36
+ announce "new project on github"
37
+ end
38
+ end
39
+
40
+ desc "push", "push to github"
41
+ def push
42
+ Dir.chdir(name) { guarded "git push -u origin master" }
43
+ end
44
+
45
+
46
+ desc "attach", "sync up github and jenkins"
47
+ method_option :token, :type => :string, :required => true
48
+ def attach
49
+ #ganked from https://gist.github.com/238305
50
+ github_post "/#{github_user}/#{name}/edit/postreceive_urls",
51
+ "urls[]" => "#{jenkins_server}/job/#{name}/build?token=#{options.token}",
52
+ :raw => true
53
+ announce "attached github project to jenkins"
54
+ rescue => e
55
+ puts e
56
+ abort "failed in attach"
57
+ end
58
+
59
+ no_tasks do
60
+
61
+ def github_post(path, args)
62
+ # More like NOT::HTTP, amirite?
63
+ # sadly, octokit isn't working right now.
64
+ # @client = Octokit::Client.new(:login => 'pengwynn', :token => 'OU812')
65
+ options = args.merge(:login => github_user, :token => github_token)
66
+ net = Net::HTTP.new('github.com',443)
67
+ net.use_ssl = true
68
+ url = args.delete(:raw) ? path : "/api/v2/json#{path}"
69
+ req = Net::HTTP::Post.new(url)
70
+ req.set_form_data(options)
71
+
72
+ response=net.request(req)
73
+
74
+ if not [200,302].include? response.code.to_i
75
+ error = JSON.parse(response.body)['error'] rescue "unparsable"
76
+ raise StandardError, ap(:error => :github, :parsed => error, :code => response.code, :url => url)
77
+ end
78
+ response
79
+ end
80
+
81
+ end
82
+ end
83
+
data/lib/haskell.rb ADDED
@@ -0,0 +1,83 @@
1
+ require 'active_support/inflector'
2
+ $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
3
+ require 'git_config'
4
+ require 'instigator/util'
5
+ require 'thor'
6
+
7
+ class Haskell < Thor
8
+ include GitConfig
9
+ include Thor::Actions
10
+
11
+ attr_reader :mod
12
+ argument :name
13
+
14
+ def self.source_root
15
+ File.join(File.dirname(__FILE__), '..', 'templates')
16
+ end
17
+
18
+ desc "preflight", "Check for preconditions"
19
+ def preflight
20
+ author
21
+ email
22
+ abort "#{name} already taken on hackage" unless
23
+ HTTParty.get("http://hackage.haskell.org/package/#{name}").code == 404
24
+ %x{cabal list --simple-output #{name}} == ""
25
+ abort "#{name} directory already exists!" if Dir.exists? name
26
+ end
27
+
28
+ desc "setup", "set up a haskell project"
29
+ def setup
30
+ invoke :mkdir
31
+ Dir.chdir name do
32
+ invoke :skeleton
33
+ invoke :cabal_dev
34
+ end
35
+ announce "new haskell project set up"
36
+ end
37
+
38
+ desc "mkdir","create the directory"
39
+
40
+ def mkdir
41
+ puts "creating #{Dir.getwd}/#{name}"
42
+ Dir.mkdir name
43
+ Dir.mkdir "#{name}/Tests"
44
+ end
45
+
46
+ desc "skeleton", "set up a skeleton haskell project"
47
+ # method_option :name, :option => :required, :type=>:string
48
+ method_option :category, :option => :required, :type => :string
49
+ method_option :lib, :default => true, :type => :boolean
50
+ method_options :app => false, :type => :boolean
51
+ def skeleton
52
+ @mod = name.camelize
53
+ guarded "cabal init -m -n #{name} -l BSD3 -a Mark Wotton -e mwotton@gmail.com -c #{options.category} -q"
54
+ guarded "rm #{name}.cabal" do end
55
+ # overwrite the cabal file
56
+ template 'cabal.tt', "#{name}/#{name}.cabal"
57
+ template 'test.tt', "#{name}/Tests/Test#{@mod}.hs"
58
+ template 'module.tt', "#{name}/src/#{@mod}.hs"
59
+ template 'main.tt', "#{name}/src/Main.hs" if options.app?
60
+ template 'watchr.tt', "#{name}/watchr.rb"
61
+ template 'README.tt', "#{name}/README.md"
62
+ File.open("runtests.sh", "w") do |f|
63
+ f.write "tbc -v Tests"
64
+ end
65
+ end
66
+
67
+ desc "cabal_dev", "ensure cabal-dev is present"
68
+ def cabal_dev
69
+ ["cabal-dev", "happy"].each do |prereq|
70
+ guarded "[ -x `which #{prereq}` ]" do
71
+ warn "#{prereq} not installed, attempting..."
72
+ guarded "cabal install #{prereq}" do |err|
73
+ abort "#{prereq} not installable: #{ap err}"
74
+ end
75
+ end
76
+ end
77
+
78
+ # system "cabal-dev install-deps"
79
+ guarded "cabal install -v"
80
+ end
81
+
82
+ end
83
+
@@ -0,0 +1,24 @@
1
+ require 'open4'
2
+ require 'awesome_print'
3
+
4
+ def announce(str)
5
+ puts " #{str}"
6
+ end
7
+
8
+ def guarded(task)
9
+ pid, stdin, stdout, stderr = Open4.popen4 task
10
+ ignored, status = Process.waitpid2 pid
11
+
12
+ if status == 0
13
+ stderr.read
14
+ stdout.read
15
+ else
16
+ err = { :status => status, :stdout => stdout.read, :stderr => stderr.read }
17
+ if block_given?
18
+ yield err
19
+ else
20
+ abort "bad exit:\n#{ap err}"
21
+ end
22
+ end
23
+
24
+ end
@@ -0,0 +1,3 @@
1
+ module Instigator
2
+ VERSION = "0.9"
3
+ end
data/lib/jenkins.rb ADDED
@@ -0,0 +1,47 @@
1
+ require 'uuid'
2
+ require 'httparty'
3
+ require 'git_config'
4
+ require 'thor'
5
+
6
+ class Jenkins < Thor
7
+ argument :name
8
+ include GitConfig
9
+ include Thor::Actions
10
+ attr_reader :secret
11
+
12
+ desc "preflight", "Check for dependencies"
13
+ def preflight
14
+ jenkins_password && jenkins_user
15
+ end
16
+
17
+
18
+ desc "new_project", "set up new jenkins project"
19
+ def new_project
20
+ @secret = UUID.new.generate
21
+ config = ERB.new(File.read File.join(Jenkins.source_root, 'config_xml.tt'))
22
+ jenkins_post "/createItem/api/xml?name=#{name}", config.result(binding)
23
+ announce "new project on jenkins"
24
+ invoke 'github:attach', [name], :token => @secret
25
+ end
26
+
27
+ def self.source_root
28
+ File.join(File.dirname(File.expand_path(__FILE__)), '..', 'templates')
29
+ end
30
+
31
+ no_tasks do
32
+
33
+ def jenkins_post(path,raw)
34
+ HTTParty.post jenkins_server + path,
35
+ :basic_auth => {
36
+ :username => jenkins_user,
37
+ :password => jenkins_password
38
+ },
39
+ :format => :xml,
40
+ :headers => { 'content-type' => 'application/xml' },
41
+ :body => raw
42
+ rescue => e
43
+ abort "couldn't post to jenkins: #{e.inspect}"
44
+ end
45
+
46
+ end
47
+ end
data/lib/sinatra.rb ADDED
@@ -0,0 +1,38 @@
1
+ $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
2
+ require 'instigator/util'
3
+ require 'git_config'
4
+ require 'thor'
5
+
6
+ class Sinatra < Thor
7
+ include GitConfig
8
+ include Thor::Actions
9
+
10
+ argument :name
11
+
12
+ desc "preflight", "Check for preconditions"
13
+ def preflight
14
+ # bit rough and ready, but no heroku api for querying
15
+ # app namespace
16
+ abort "#{name} is already taken on heroku" unless
17
+ HTTParty.get("http://#{name}.heroku.com").code == 404
18
+
19
+ # these will abort anyway.
20
+ author && email
21
+ end
22
+
23
+ desc "setup", "set up a sinatra-heroku project"
24
+ def setup
25
+
26
+ guarded "git clone git://github.com/mwotton/heroku-sinatra-app.git #{name}"
27
+
28
+ Dir.chdir name do
29
+ guarded "git remote rm origin" # hide the evidence
30
+ guarded "heroku create #{name}"
31
+ File.open("runtests.sh", "w") do |f|
32
+ f.write "bundle exec rspec spec"
33
+ end
34
+ end
35
+ end
36
+
37
+ end
38
+
data/tasks/app.thor ADDED
@@ -0,0 +1,5 @@
1
+ # must be a nicer way of doing this
2
+ $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
3
+ Dir['lib/*.rb'].each {|lib| load lib rescue "couldn't load #{lib}"}
4
+
5
+
@@ -0,0 +1,10 @@
1
+ This is an autogenerated README for the <%= name %> project.
2
+
3
+ Things you can do:
4
+ -- run the tests by running 'tbc'
5
+ -- have an automatic test loop by running 'watchr watchr.rb'
6
+ -- install locally with "cabal install"
7
+ -- push to hackage with "FIXME"
8
+ -- push to github with "git push"
9
+
10
+ Pushing to github should run the tests on the CI server too.
@@ -0,0 +1,23 @@
1
+ Name: <%= name %>
2
+ Version: 0.1
3
+ License: BSD3
4
+ License-file: LICENSE
5
+ Author: <%= author %>, <<%= email %>>
6
+ Maintainer: <%= author %>, <<%= email %>>
7
+ Category: Development
8
+ Build-type: Simple
9
+ Cabal-version: >=1.2
10
+
11
+ <% if options.lib? %>
12
+ Library
13
+ -- this is an awful hack, but if we don't specify QC1 here
14
+ -- tbc will grab something else. FIXME PLZ!
15
+ Build-Depends: base, QuickCheck >= 1.1 && <2, hlint, TBC
16
+ Hs-source-dirs: src
17
+ <% end %>
18
+
19
+ <% if options.app? %>
20
+ Executable <%= name %>
21
+ Main-is: src/Main.hs
22
+ Hs-source-dirs: src
23
+ <% end %>
@@ -0,0 +1,70 @@
1
+ <?xml version='1.0' encoding='UTF-8'?>
2
+ <matrix-project>
3
+ <actions/>
4
+ <description></description>
5
+ <keepDependencies>false</keepDependencies>
6
+ <properties>
7
+ <org.jvnet.hudson.plugins.shelveproject.ShelveProjectProperty/>
8
+ </properties>
9
+ <scm class="hudson.plugins.git.GitSCM">
10
+ <configVersion>1</configVersion>
11
+ <remoteRepositories>
12
+ <org.spearce.jgit.transport.RemoteConfig>
13
+ <string>origin</string>
14
+ <int>5</int>
15
+ <string>fetch</string>
16
+ <string>+refs/heads/*:refs/remotes/origin/*</string>
17
+ <string>receivepack</string>
18
+ <string>git-upload-pack</string>
19
+ <string>uploadpack</string>
20
+ <string>git-upload-pack</string>
21
+ <string>url</string>
22
+ <string>git://github.com/<%=github_user%>/<%=name%>.git</string>
23
+ <string>tagopt</string>
24
+ <string></string>
25
+ </org.spearce.jgit.transport.RemoteConfig>
26
+ </remoteRepositories>
27
+ <branches>
28
+ <hudson.plugins.git.BranchSpec>
29
+ <name>master</name>
30
+ </hudson.plugins.git.BranchSpec>
31
+ </branches>
32
+ <localBranch></localBranch>
33
+ <mergeOptions/>
34
+ <recursiveSubmodules>false</recursiveSubmodules>
35
+ <doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations>
36
+ <authorOrCommitter>false</authorOrCommitter>
37
+ <clean>false</clean>
38
+ <wipeOutWorkspace>false</wipeOutWorkspace>
39
+ <pruneBranches>false</pruneBranches>
40
+ <buildChooser class="hudson.plugins.git.util.DefaultBuildChooser"/>
41
+ <gitTool>Default</gitTool>
42
+ <submoduleCfg class="list"/>
43
+ <relativeTargetDir></relativeTargetDir>
44
+ <excludedRegions></excludedRegions>
45
+ <excludedUsers></excludedUsers>
46
+ </scm>
47
+ <canRoam>true</canRoam>
48
+ <disabled>false</disabled>
49
+ <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
50
+ <authToken><%= secret %></authToken>
51
+ <triggers class="vector"/>
52
+ <concurrentBuild>false</concurrentBuild>
53
+ <axes>
54
+ <hudson.matrix.LabelAxis>
55
+ <name>label</name>
56
+ <values>
57
+ <string>mac</string>
58
+ </values>
59
+ </hudson.matrix.LabelAxis>
60
+ </axes>
61
+ <builders>
62
+ <hudson.tasks.Shell>
63
+ <command>bash -c -l &apos;sh ./runtests.sh&apos;</command>
64
+ </hudson.tasks.Shell>
65
+ </builders>
66
+ <publishers>
67
+ </publishers>
68
+ <buildWrappers/>
69
+ <runSequentially>true</runSequentially>
70
+ </matrix-project>
@@ -0,0 +1,3 @@
1
+ module <%= mod %> where
2
+
3
+ foo = 1
data/templates/test.tt ADDED
@@ -0,0 +1,10 @@
1
+ {-# LANGUAGE ScopedTypeVariables #-}
2
+
3
+ module T where
4
+
5
+ import <%= @mod %>
6
+ import Test.QuickCheck(property)
7
+
8
+ test_failing = foo == 1
9
+ prop_trivial = property (\(x::Integer) -> 1+x > x)
10
+
@@ -0,0 +1,8 @@
1
+ # run tests when they're changed
2
+ watch('Tests/.*hs'){|md| system "tbc #{md[0]}"}
3
+ # for the moment, when anything changes, run everything
4
+ # we could be more sophisticated, but let's get it running first.
5
+ # bit of a conflict here - tbc wants test_*, which hlint doesn't like
6
+ # finesse it away for now.
7
+ watch('src/(.*).hs') {|md| system "tbc Tests; hlint Tests -i 'Use camelCase'; hlint src"}
8
+
metadata ADDED
@@ -0,0 +1,197 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: instigator
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 9
8
+ version: "0.9"
9
+ platform: ruby
10
+ authors:
11
+ - Mark Wotton
12
+ autorequire:
13
+ bindir: bin
14
+ cert_chain: []
15
+
16
+ date: 2011-05-08 00:00:00 +10:00
17
+ default_executable:
18
+ dependencies:
19
+ - !ruby/object:Gem::Dependency
20
+ name: bundler
21
+ prerelease: false
22
+ requirement: &id001 !ruby/object:Gem::Requirement
23
+ none: false
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 1
29
+ - 0
30
+ - 0
31
+ - rc
32
+ - 6
33
+ version: 1.0.0.rc.6
34
+ type: :development
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: thor
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ type: :runtime
48
+ version_requirements: *id002
49
+ - !ruby/object:Gem::Dependency
50
+ name: activesupport
51
+ prerelease: false
52
+ requirement: &id003 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ segments:
58
+ - 0
59
+ version: "0"
60
+ type: :runtime
61
+ version_requirements: *id003
62
+ - !ruby/object:Gem::Dependency
63
+ name: i18n
64
+ prerelease: false
65
+ requirement: &id004 !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ segments:
71
+ - 0
72
+ version: "0"
73
+ type: :runtime
74
+ version_requirements: *id004
75
+ - !ruby/object:Gem::Dependency
76
+ name: uuid
77
+ prerelease: false
78
+ requirement: &id005 !ruby/object:Gem::Requirement
79
+ none: false
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ segments:
84
+ - 0
85
+ version: "0"
86
+ type: :runtime
87
+ version_requirements: *id005
88
+ - !ruby/object:Gem::Dependency
89
+ name: watchr
90
+ prerelease: false
91
+ requirement: &id006 !ruby/object:Gem::Requirement
92
+ none: false
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ segments:
97
+ - 0
98
+ version: "0"
99
+ type: :runtime
100
+ version_requirements: *id006
101
+ - !ruby/object:Gem::Dependency
102
+ name: open4
103
+ prerelease: false
104
+ requirement: &id007 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ segments:
110
+ - 0
111
+ version: "0"
112
+ type: :runtime
113
+ version_requirements: *id007
114
+ - !ruby/object:Gem::Dependency
115
+ name: awesome_print
116
+ prerelease: false
117
+ requirement: &id008 !ruby/object:Gem::Requirement
118
+ none: false
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ segments:
123
+ - 0
124
+ version: "0"
125
+ type: :runtime
126
+ version_requirements: *id008
127
+ description: "Project starter for Haskell: sets up CI & github integration, along with best-practice stuff like tests and hlint"
128
+ email:
129
+ - mwotton@gmail.com
130
+ executables:
131
+ - instigate
132
+ extensions: []
133
+
134
+ extra_rdoc_files: []
135
+
136
+ files:
137
+ - .bundle/config
138
+ - .gitignore
139
+ - Gemfile
140
+ - Gemfile.lock
141
+ - LICENSE
142
+ - README.md
143
+ - Rakefile
144
+ - TODO
145
+ - bin/instigate
146
+ - instigator.gemspec
147
+ - lib/app.rb
148
+ - lib/git_config.rb
149
+ - lib/github.rb
150
+ - lib/haskell.rb
151
+ - lib/instigator/util.rb
152
+ - lib/instigator/version.rb
153
+ - lib/jenkins.rb
154
+ - lib/sinatra.rb
155
+ - tasks/app.thor
156
+ - templates/README.tt
157
+ - templates/cabal.tt
158
+ - templates/config_xml.tt
159
+ - templates/module.tt
160
+ - templates/test.tt
161
+ - templates/watchr.tt
162
+ has_rdoc: true
163
+ homepage: http://rubygems.org/gems/instigator
164
+ licenses: []
165
+
166
+ post_install_message:
167
+ rdoc_options: []
168
+
169
+ require_paths:
170
+ - lib
171
+ required_ruby_version: !ruby/object:Gem::Requirement
172
+ none: false
173
+ requirements:
174
+ - - ">="
175
+ - !ruby/object:Gem::Version
176
+ segments:
177
+ - 0
178
+ version: "0"
179
+ required_rubygems_version: !ruby/object:Gem::Requirement
180
+ none: false
181
+ requirements:
182
+ - - ">="
183
+ - !ruby/object:Gem::Version
184
+ segments:
185
+ - 1
186
+ - 3
187
+ - 6
188
+ version: 1.3.6
189
+ requirements: []
190
+
191
+ rubyforge_project: instigator
192
+ rubygems_version: 1.3.7
193
+ signing_key:
194
+ specification_version: 3
195
+ summary: Project starter for Haskell
196
+ test_files: []
197
+