project 0.9.3 → 1.0.0
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/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.
|