project 0.9.3 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/lib/project.rb +2 -1
- data/lib/project/core_ext.rb +0 -2
- data/lib/project/loader.rb +15 -5
- data/lib/project/lookup.rb +4 -0
- data/lib/project/runner.rb +2 -2
- data/lib/project/template.rb +9 -8
- data/lib/project/workflow.rb +1 -1
- data/project.gemspec +20 -7
- data/readme.textile +114 -0
- data/spec/fixtures/config.yml +7 -0
- data/spec/lib/core_ext_spec.rb +13 -0
- data/spec/lib/errors_spec.rb +21 -0
- data/spec/lib/loader_spec.rb +37 -0
- data/spec/lib/lookup_spec.rb +33 -6
- data/spec/lib/project_spec.rb +41 -0
- data/spec/lib/template_spec.rb +25 -0
- data/spec/lib/workflow_spec.rb +35 -0
- data/spec/spec_helper.rb +3 -0
- metadata +23 -7
- data/readme.rdoc +0 -87
data/Rakefile
CHANGED
@@ -6,7 +6,7 @@ begin
|
|
6
6
|
Jeweler::Tasks.new do |gem|
|
7
7
|
gem.name = "project"
|
8
8
|
gem.summary = "A streamlined approach to working with multiple projects and tasks."
|
9
|
-
gem.description = ""
|
9
|
+
gem.description = "Project aims to make working with multiple projects as simple as possible. By registering projects with workflows you can quickly create a set of commands that will be run against each project."
|
10
10
|
gem.email = "josh@josh-nesbitt.net"
|
11
11
|
gem.homepage = "http://github.com/joshnesbitt/project"
|
12
12
|
gem.authors = ["Josh Nesbitt"]
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
1.0.0
|
data/lib/project.rb
CHANGED
data/lib/project/core_ext.rb
CHANGED
data/lib/project/loader.rb
CHANGED
@@ -10,15 +10,25 @@ module Project
|
|
10
10
|
path ? (@config_path = path) : @config_path
|
11
11
|
end
|
12
12
|
end
|
13
|
+
attr_reader :raw_config
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
@template_path = File.join(ROOT, 'templates', 'example.yml')
|
17
|
+
end
|
13
18
|
|
14
19
|
def load!
|
15
20
|
if File.exists?(self.class.config_path)
|
16
|
-
|
17
|
-
|
18
|
-
|
21
|
+
@raw_config = YAML.load_file(self.class.config_path)
|
22
|
+
|
23
|
+
Project.load_from_hash(@raw_config[:projects]) unless @raw_config[:projects].nil?
|
24
|
+
Workflow.load_from_hash(@raw_config[:workflows]) unless @raw_config[:workflows].nil?
|
19
25
|
else
|
20
|
-
FileUtils.cp(
|
21
|
-
|
26
|
+
FileUtils.cp(@template_path, self.class.config_path)
|
27
|
+
|
28
|
+
$stdout.puts "* No YAML configuration file found!",
|
29
|
+
"+ #{self.class.config_path}",
|
30
|
+
"* One has been created for you, please edit it to your liking and try again."
|
31
|
+
|
22
32
|
Kernel.exit(1)
|
23
33
|
end
|
24
34
|
end
|
data/lib/project/lookup.rb
CHANGED
data/lib/project/runner.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Project
|
2
2
|
class Runner
|
3
3
|
attr_accessor :key, :project, :workflow
|
4
|
-
|
4
|
+
|
5
5
|
def initialize(key)
|
6
6
|
exit_with "No project key given" if key.nil?
|
7
7
|
self.key = key.chomp.to_sym
|
@@ -19,7 +19,7 @@ module Project
|
|
19
19
|
say "* Opening project '#{self.key}' using workflow '#{self.project.workflow}'"
|
20
20
|
|
21
21
|
self.workflow.each_with_index do |command, index|
|
22
|
-
command = Template.new(command, self.project).parse
|
22
|
+
command = Template.new(command, self.project).parse!
|
23
23
|
output = %x[ #{command} ].chomp
|
24
24
|
|
25
25
|
unless output.empty?
|
data/lib/project/template.rb
CHANGED
@@ -1,22 +1,23 @@
|
|
1
1
|
module Project
|
2
2
|
class Template
|
3
3
|
attr_accessor :subject, :replacements
|
4
|
-
REGEX = /%([a-z|A-Z]*)?/
|
5
|
-
|
4
|
+
REGEX = /%([a-z|A-Z|_]*)?/
|
5
|
+
|
6
6
|
def initialize(subject, replacements)
|
7
7
|
self.subject = subject
|
8
8
|
self.replacements = replacements
|
9
9
|
end
|
10
|
-
|
11
|
-
def parse
|
10
|
+
|
11
|
+
def parse!
|
12
12
|
matches = self.subject.scan(REGEX)
|
13
13
|
matches.flatten!
|
14
|
-
|
14
|
+
|
15
15
|
matches.each do |match|
|
16
|
-
|
17
|
-
|
16
|
+
replacement = replacements[match.to_sym]
|
17
|
+
raise MissingTemplateVariable, "No variable named %#{match} was found on the specified project." if replacement.nil?
|
18
|
+
self.subject.gsub!("%#{match}", replacement)
|
18
19
|
end
|
19
|
-
|
20
|
+
|
20
21
|
self.subject
|
21
22
|
end
|
22
23
|
end
|
data/lib/project/workflow.rb
CHANGED
data/project.gemspec
CHANGED
@@ -5,12 +5,12 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{project}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "1.0.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Josh Nesbitt"]
|
12
|
-
s.date = %q{2010-08-
|
13
|
-
s.description = %q{}
|
12
|
+
s.date = %q{2010-08-21}
|
13
|
+
s.description = %q{Project aims to make working with multiple projects as simple as possible. By registering projects with workflows you can quickly create a set of commands that will be run against each project.}
|
14
14
|
s.email = %q{josh@josh-nesbitt.net}
|
15
15
|
s.executables = ["project", "project"]
|
16
16
|
s.extra_rdoc_files = [
|
@@ -32,8 +32,15 @@ Gem::Specification.new do |s|
|
|
32
32
|
"lib/project/template.rb",
|
33
33
|
"lib/project/workflow.rb",
|
34
34
|
"project.gemspec",
|
35
|
-
"readme.
|
35
|
+
"readme.textile",
|
36
|
+
"spec/fixtures/config.yml",
|
37
|
+
"spec/lib/core_ext_spec.rb",
|
38
|
+
"spec/lib/errors_spec.rb",
|
39
|
+
"spec/lib/loader_spec.rb",
|
36
40
|
"spec/lib/lookup_spec.rb",
|
41
|
+
"spec/lib/project_spec.rb",
|
42
|
+
"spec/lib/template_spec.rb",
|
43
|
+
"spec/lib/workflow_spec.rb",
|
37
44
|
"spec/spec_helper.rb",
|
38
45
|
"spec/watch.rb",
|
39
46
|
"templates/example.yml"
|
@@ -41,10 +48,16 @@ Gem::Specification.new do |s|
|
|
41
48
|
s.homepage = %q{http://github.com/joshnesbitt/project}
|
42
49
|
s.rdoc_options = ["--charset=UTF-8"]
|
43
50
|
s.require_paths = ["lib"]
|
44
|
-
s.rubygems_version = %q{1.3.
|
51
|
+
s.rubygems_version = %q{1.3.7}
|
45
52
|
s.summary = %q{A streamlined approach to working with multiple projects and tasks.}
|
46
53
|
s.test_files = [
|
47
|
-
"spec/lib/
|
54
|
+
"spec/lib/core_ext_spec.rb",
|
55
|
+
"spec/lib/errors_spec.rb",
|
56
|
+
"spec/lib/loader_spec.rb",
|
57
|
+
"spec/lib/lookup_spec.rb",
|
58
|
+
"spec/lib/project_spec.rb",
|
59
|
+
"spec/lib/template_spec.rb",
|
60
|
+
"spec/lib/workflow_spec.rb",
|
48
61
|
"spec/spec_helper.rb",
|
49
62
|
"spec/watch.rb"
|
50
63
|
]
|
@@ -53,7 +66,7 @@ Gem::Specification.new do |s|
|
|
53
66
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
54
67
|
s.specification_version = 3
|
55
68
|
|
56
|
-
if Gem::Version.new(Gem::
|
69
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
57
70
|
s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
|
58
71
|
else
|
59
72
|
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
data/readme.textile
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
h1. Project
|
2
|
+
|
3
|
+
* Overview
|
4
|
+
* Installation
|
5
|
+
* Usage
|
6
|
+
* Bugs
|
7
|
+
* Note on Patches/Pull Requests
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
h2. Overview
|
12
|
+
|
13
|
+
Project aims to make working with multiple projects as simple as possible. By registering projects with workflows you can quickly create a set of commands that will be run against each project.
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
h2. Installation
|
18
|
+
|
19
|
+
The project is hosted on "rubygems.org":http://rubygems.org. Getting it is simple:
|
20
|
+
|
21
|
+
pre. gem install project
|
22
|
+
|
23
|
+
Once the gem is installed run:
|
24
|
+
|
25
|
+
pre. project install
|
26
|
+
|
27
|
+
Assuming you haven't already had the gem installed this will create a file at @~/.project@. This is the main configuration file used to drive project.
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
h2. Usage
|
32
|
+
|
33
|
+
Project uses a YAML file for its configuration. Edit the file located in at @~/.project@ to you liking.
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
h3. Projects
|
38
|
+
|
39
|
+
A project can be anything revolving around a particular context. A typical use case would be opening your default environment for a project. An example project configuration might look like this:
|
40
|
+
|
41
|
+
pre. :name:
|
42
|
+
:path: /path/to/project
|
43
|
+
:workflow: default
|
44
|
+
|
45
|
+
The only required key within a project is *workflow*. This is important as you need to tell the @project@ binary which workflow to apply against the project. Any other variables specified here will be passed through to a workflow (more on this below).
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
h3. Workflows
|
50
|
+
|
51
|
+
A workflow is a set of commands you want run against a particular project. An example workflow might look something like this:
|
52
|
+
|
53
|
+
pre. :default:
|
54
|
+
- mate %path
|
55
|
+
- cd %path && gitx
|
56
|
+
|
57
|
+
Which translates to:
|
58
|
+
|
59
|
+
* @mate /path/to/project@
|
60
|
+
* @cd /path/to/project && gitx@
|
61
|
+
|
62
|
+
A workflow is just a YAML array of templated commands. Any variable used in a workflow will get looked up on the project that's running it. In the example above the @%path@ variable is replaced by the path specified within the project. Using this method you can quickly build up a set of common workflows to use against many projects.
|
63
|
+
|
64
|
+
At the moment each command within a workflow is run inside it's own sub shell. This means that *every command is isolated from other commands within the same workflow*, so instead of doing two commands as @cd /some/path@ and @rake@ you would do @cd /some/path && rake@.
|
65
|
+
|
66
|
+
My default workflow looks something like this:
|
67
|
+
|
68
|
+
pre. :default:
|
69
|
+
- mate %path
|
70
|
+
- cd %path && gitx
|
71
|
+
- open 'http://%basecamp_url'
|
72
|
+
- open 'http://%app'
|
73
|
+
- cd %path && rails server
|
74
|
+
|
75
|
+
Which:
|
76
|
+
|
77
|
+
* opens a project in Textmate
|
78
|
+
* opens it's Git history
|
79
|
+
* opens the Basecamp project for the app
|
80
|
+
* starts the Rails server (and opens it up in the default browser)
|
81
|
+
|
82
|
+
*Note:* at the moment commands do not support being daemonised, hence why the call to @rails server@ is the last command executed.
|
83
|
+
|
84
|
+
|
85
|
+
|
86
|
+
h3. Running a project
|
87
|
+
|
88
|
+
Running a project is simple, just specify the name of the project you want to load and the workflow will run for it:
|
89
|
+
|
90
|
+
pre. project name
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
h2. Bugs
|
95
|
+
|
96
|
+
If you have any problems with Project, please file an "issue":http://github.com/joshnesbitt/project/issues.
|
97
|
+
|
98
|
+
|
99
|
+
|
100
|
+
h2. Note on Patches/Pull Requests
|
101
|
+
|
102
|
+
* Fork the project.
|
103
|
+
* Make your feature addition or bug fix.
|
104
|
+
* Add tests for it. This is important so I don't break it in a
|
105
|
+
future version unintentionally.
|
106
|
+
* Commit, do not mess with rakefile, version, or history.
|
107
|
+
(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)
|
108
|
+
* Send me a pull request. Bonus points for topic branches.
|
109
|
+
|
110
|
+
|
111
|
+
|
112
|
+
h2. Author
|
113
|
+
|
114
|
+
Josh Nesbitt / "josh@josh-nesbitt.net":mailto:josh@josh-nesbitt.net / "josh-nesbitt.net":http://josh-nesbitt.net
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Project
|
2
|
+
describe OpenStruct do
|
3
|
+
|
4
|
+
before do
|
5
|
+
@struct = OpenStruct.new(:one => "one", :two => "two", :three => "three")
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should provide [] as an interface to the OpenStructs' attributes" do
|
9
|
+
@struct[:one].should == @struct.one # one
|
10
|
+
@struct[:four].should == @struct.four # nil
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Project
|
2
|
+
describe ProjectError do
|
3
|
+
|
4
|
+
it "should have a base error class" do
|
5
|
+
error = ProjectError.new("Error data")
|
6
|
+
error.data.should == "Error data"
|
7
|
+
|
8
|
+
ProjectError.ancestors.should include(StandardError)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should have the correct error classes available" do
|
12
|
+
data = "Error Data"
|
13
|
+
|
14
|
+
[ProjectError, AbstractClassError, MissingTemplateVariable].each do |klass|
|
15
|
+
error = klass.new(data)
|
16
|
+
error.data.should == data
|
17
|
+
klass.ancestors.should include(StandardError)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Project
|
2
|
+
describe Loader do
|
3
|
+
|
4
|
+
before do
|
5
|
+
@config_path = File.join(ROOT, 'spec', 'fixtures', 'config.yml')
|
6
|
+
Loader.config_path(@config_path)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should allow a config path to be set" do
|
10
|
+
path = "/my/path/.project"
|
11
|
+
Loader.config_path(path)
|
12
|
+
Loader.config_path.should == path
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should create a configuration file on #load! if one does not exist" do
|
16
|
+
FileUtils.rm(@config_path) if File.exists?(@config_path)
|
17
|
+
File.exists?(@config_path).should == false
|
18
|
+
|
19
|
+
loader = Loader.new
|
20
|
+
lambda { loader.load! }.should raise_error(SystemExit)
|
21
|
+
|
22
|
+
File.exists?(@config_path).should == true
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should load Project and Workflow configurations if a configuration exists" do
|
26
|
+
loader = Loader.new
|
27
|
+
|
28
|
+
unless File.exists?(@config_path)
|
29
|
+
lambda { loader.load! }.should raise_error(SystemExit)
|
30
|
+
File.exists?(@config_path).should == true
|
31
|
+
end
|
32
|
+
|
33
|
+
loader.load!
|
34
|
+
loader.raw_config.should_not be_nil
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/spec/lib/lookup_spec.rb
CHANGED
@@ -2,7 +2,18 @@ module Project
|
|
2
2
|
describe Lookup do
|
3
3
|
|
4
4
|
before do
|
5
|
-
|
5
|
+
Lookup.clear_all
|
6
|
+
|
7
|
+
@data = {
|
8
|
+
:one => {
|
9
|
+
:workflow => :default,
|
10
|
+
:path => "/one/two/three"
|
11
|
+
},
|
12
|
+
:two => {
|
13
|
+
:workflow => :other,
|
14
|
+
:path => "/one/two/three/four"
|
15
|
+
}
|
16
|
+
}
|
6
17
|
end
|
7
18
|
|
8
19
|
it "should use a hash as a lookup object" do
|
@@ -10,14 +21,30 @@ module Project
|
|
10
21
|
end
|
11
22
|
|
12
23
|
it "should set a lookup key correctly" do
|
24
|
+
Lookup.set(:one, @data[:one])
|
25
|
+
Lookup.store[:one].should == @data[:one]
|
26
|
+
end
|
27
|
+
|
28
|
+
it "raise an abstract class error on trying to get a key directly from the Lookup class" do
|
29
|
+
Lookup.set(:one, @data[:one])
|
30
|
+
lambda { Lookup.get(:one) }.should raise_error(AbstractClassError)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should load a configuration from a hash" do
|
34
|
+
Lookup.load_from_hash(@data)
|
35
|
+
Lookup.store[:one].should == @data[:one]
|
13
36
|
|
14
|
-
|
15
|
-
|
37
|
+
@data[:one].each_pair do |k, v|
|
38
|
+
Lookup.store[:one][k].should == v
|
39
|
+
end
|
16
40
|
end
|
17
41
|
|
18
|
-
it "
|
19
|
-
Lookup.
|
20
|
-
|
42
|
+
it "should support wiping the entire lookups' content" do
|
43
|
+
Lookup.store.should == {}
|
44
|
+
Lookup.load_from_hash(@data)
|
45
|
+
Lookup.store.should_not be_empty
|
46
|
+
Lookup.clear_all
|
47
|
+
Lookup.store.should be_empty
|
21
48
|
end
|
22
49
|
end
|
23
50
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Project
|
2
|
+
describe Project do
|
3
|
+
|
4
|
+
before do
|
5
|
+
Project.clear_all
|
6
|
+
|
7
|
+
@data = {
|
8
|
+
:one => {
|
9
|
+
:workflow => :default,
|
10
|
+
:path => "/one/two/three"
|
11
|
+
},
|
12
|
+
:two => {
|
13
|
+
:workflow => :other,
|
14
|
+
:path => "/one/two/three/four"
|
15
|
+
}
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should set a project" do
|
20
|
+
Project.set(:one, @data[:one])
|
21
|
+
Project.store[:one].should == @data[:one]
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should get a projects data" do
|
25
|
+
Project.set(:one, @data[:one])
|
26
|
+
Project.get(:one).should == OpenStruct.new(@data[:one])
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should load a configuration from a hash" do
|
30
|
+
Project.load_from_hash(@data)
|
31
|
+
Project.get(:one).should == OpenStruct.new(@data[:one])
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should return an OpenStruct object as a keys data" do
|
35
|
+
Project.set(:one, @data[:one])
|
36
|
+
|
37
|
+
Project.get(:one).class.should == OpenStruct
|
38
|
+
Project.get(:one).should == OpenStruct.new(@data[:one])
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Project
|
2
|
+
describe Template do
|
3
|
+
|
4
|
+
it "should successfully replace a strings variables with the replacements given" do
|
5
|
+
subject = "cd %path && echo '%text' && echo '%other_var'"
|
6
|
+
replacements = {
|
7
|
+
:path => "/some/path",
|
8
|
+
:text => "hello there",
|
9
|
+
:other_var => "something"
|
10
|
+
}
|
11
|
+
|
12
|
+
template = Template.new(subject, replacements)
|
13
|
+
result = template.parse!
|
14
|
+
result.should == "cd /some/path && echo 'hello there' && echo 'something'"
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should raise an error on replacing a value that doesnt exist" do
|
18
|
+
subject = "cd %path"
|
19
|
+
replacements = {}
|
20
|
+
|
21
|
+
template = Template.new(subject, replacements)
|
22
|
+
lambda { template.parse! }.should raise_error(MissingTemplateVariable, "No variable named %path was found on the specified project.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Project
|
2
|
+
describe Workflow do
|
3
|
+
|
4
|
+
before do
|
5
|
+
Workflow.clear_all
|
6
|
+
|
7
|
+
@data = {
|
8
|
+
:one => ['one', 'two', 'three'],
|
9
|
+
:two => ['one', 'two', 'three', 'four']
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should set a workflow" do
|
14
|
+
Workflow.set(:one, @data[:one])
|
15
|
+
Workflow.store[:one].should == @data[:one]
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should get a workflows data" do
|
19
|
+
Workflow.set(:one, @data[:one])
|
20
|
+
Workflow.get(:one).should == @data[:one]
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should load a configuration from a hash" do
|
24
|
+
Workflow.load_from_hash(@data)
|
25
|
+
Workflow.get(:one).should == @data[:one]
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should return an Array object as a keys data" do
|
29
|
+
Workflow.set(:one, @data[:one])
|
30
|
+
|
31
|
+
Workflow.get(:one).class.should == Array
|
32
|
+
Workflow.get(:one).should == @data[:one]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -3,10 +3,10 @@ name: project
|
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
|
+
- 1
|
6
7
|
- 0
|
7
|
-
-
|
8
|
-
|
9
|
-
version: 0.9.3
|
8
|
+
- 0
|
9
|
+
version: 1.0.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Josh Nesbitt
|
@@ -14,13 +14,14 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-08-
|
17
|
+
date: 2010-08-21 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: rspec
|
22
22
|
prerelease: false
|
23
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
24
25
|
requirements:
|
25
26
|
- - ">="
|
26
27
|
- !ruby/object:Gem::Version
|
@@ -31,7 +32,7 @@ dependencies:
|
|
31
32
|
version: 1.2.9
|
32
33
|
type: :development
|
33
34
|
version_requirements: *id001
|
34
|
-
description:
|
35
|
+
description: Project aims to make working with multiple projects as simple as possible. By registering projects with workflows you can quickly create a set of commands that will be run against each project.
|
35
36
|
email: josh@josh-nesbitt.net
|
36
37
|
executables:
|
37
38
|
- project
|
@@ -56,8 +57,15 @@ files:
|
|
56
57
|
- lib/project/template.rb
|
57
58
|
- lib/project/workflow.rb
|
58
59
|
- project.gemspec
|
59
|
-
- readme.
|
60
|
+
- readme.textile
|
61
|
+
- spec/fixtures/config.yml
|
62
|
+
- spec/lib/core_ext_spec.rb
|
63
|
+
- spec/lib/errors_spec.rb
|
64
|
+
- spec/lib/loader_spec.rb
|
60
65
|
- spec/lib/lookup_spec.rb
|
66
|
+
- spec/lib/project_spec.rb
|
67
|
+
- spec/lib/template_spec.rb
|
68
|
+
- spec/lib/workflow_spec.rb
|
61
69
|
- spec/spec_helper.rb
|
62
70
|
- spec/watch.rb
|
63
71
|
- templates/example.yml
|
@@ -71,6 +79,7 @@ rdoc_options:
|
|
71
79
|
require_paths:
|
72
80
|
- lib
|
73
81
|
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
74
83
|
requirements:
|
75
84
|
- - ">="
|
76
85
|
- !ruby/object:Gem::Version
|
@@ -78,6 +87,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
78
87
|
- 0
|
79
88
|
version: "0"
|
80
89
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
81
91
|
requirements:
|
82
92
|
- - ">="
|
83
93
|
- !ruby/object:Gem::Version
|
@@ -87,11 +97,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
87
97
|
requirements: []
|
88
98
|
|
89
99
|
rubyforge_project:
|
90
|
-
rubygems_version: 1.3.
|
100
|
+
rubygems_version: 1.3.7
|
91
101
|
signing_key:
|
92
102
|
specification_version: 3
|
93
103
|
summary: A streamlined approach to working with multiple projects and tasks.
|
94
104
|
test_files:
|
105
|
+
- spec/lib/core_ext_spec.rb
|
106
|
+
- spec/lib/errors_spec.rb
|
107
|
+
- spec/lib/loader_spec.rb
|
95
108
|
- spec/lib/lookup_spec.rb
|
109
|
+
- spec/lib/project_spec.rb
|
110
|
+
- spec/lib/template_spec.rb
|
111
|
+
- spec/lib/workflow_spec.rb
|
96
112
|
- spec/spec_helper.rb
|
97
113
|
- spec/watch.rb
|
data/readme.rdoc
DELETED
@@ -1,87 +0,0 @@
|
|
1
|
-
= Project
|
2
|
-
|
3
|
-
* Overview
|
4
|
-
* Installation
|
5
|
-
* Usage
|
6
|
-
* Bugs
|
7
|
-
* Note on Patches/Pull Requests
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
== Overview
|
12
|
-
|
13
|
-
Project aims to make working with multiple projects as simple as possible. By registering projects with workflows you can quickly create a set of commands that will be run against each project.
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
== Installation
|
18
|
-
|
19
|
-
The project is hosted on rubygems.org. Getting it is simple:
|
20
|
-
|
21
|
-
gem install project
|
22
|
-
|
23
|
-
Once the gem is installed run:
|
24
|
-
|
25
|
-
project install
|
26
|
-
|
27
|
-
Assuming you haven't already had the gem installed this will create a file at ~/.project. This is the main configuration file used to drive project.
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
== Usage
|
32
|
-
|
33
|
-
Project uses a YAML file for its configuration. Edit the file located in at ~/.project to you liking.
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
=== Projects
|
38
|
-
|
39
|
-
A project can be anything revolving around a particular context. A typical use case would be opening your default environment surrounding a particular project. An example project configuration might look like this:
|
40
|
-
|
41
|
-
:name:
|
42
|
-
:path: /path/to/project
|
43
|
-
:workflow: default
|
44
|
-
|
45
|
-
The only required key within a project is *workflow*. This is important as you need to tell project which workflow to apply against the project. Any other variables specified here will be passed through to a workflow (more on this below).
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
==== Workflows
|
50
|
-
|
51
|
-
A workflow is a set of commands you want run against a particular project. An example workflow might look something like this:
|
52
|
-
|
53
|
-
:default:
|
54
|
-
- cd %path
|
55
|
-
|
56
|
-
A workflow is just a YAML array of templated commands. Any variable used in a workflow will get looked up on the project that is running it. In the example above the %path variable has been replaced by the path specified within the project. Using this method you can quickly build up a set of common workflows to use against any project.
|
57
|
-
|
58
|
-
|
59
|
-
=== Running a project
|
60
|
-
|
61
|
-
Running a project is simple, just specify the name of the project you want to load and the workflow will run for it:
|
62
|
-
|
63
|
-
project name
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
== Bugs
|
68
|
-
|
69
|
-
If you have any problems with Project, please file an issue at http://github.com/joshnesbitt/project/issues.
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
== Note on Patches/Pull Requests
|
74
|
-
|
75
|
-
* Fork the project.
|
76
|
-
* Make your feature addition or bug fix.
|
77
|
-
* Add tests for it. This is important so I don't break it in a
|
78
|
-
future version unintentionally.
|
79
|
-
* Commit, do not mess with rakefile, version, or history.
|
80
|
-
(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)
|
81
|
-
* Send me a pull request. Bonus points for topic branches.
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
== Copyright
|
86
|
-
|
87
|
-
Copyright (c) 2010 Josh Nesbitt <josh@josh-nesbitt.net>. See LICENSE for details.
|