codefumes 0.1.5 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,11 @@
1
+ == 0.1.7 27-MAR-2010
2
+
3
+ * Small fixes to Build support
4
+
5
+ == 0.1.6 09-MAR-2010
6
+
7
+ * Added simple Build support
8
+
1
9
  == 0.1.5 2009-09-26
2
10
 
3
11
  * Added visibility support to Claim class
data/Manifest.txt CHANGED
@@ -10,6 +10,7 @@ lib/cf_release_project/cli.rb
10
10
  lib/cf_store_credentials/cli.rb
11
11
  lib/codefumes.rb
12
12
  lib/codefumes/api.rb
13
+ lib/codefumes/build.rb
13
14
  lib/codefumes/claim.rb
14
15
  lib/codefumes/commit.rb
15
16
  lib/codefumes/config_file.rb
@@ -19,12 +20,14 @@ spec/cf_claim_project/cli_spec.rb
19
20
  spec/cf_release_project/cli_spec.rb
20
21
  spec/cf_store_credentials/cli_spec.rb
21
22
  spec/codefumes/api_spec.rb
23
+ spec/codefumes/build_spec.rb
22
24
  spec/codefumes/claim_spec.rb
23
25
  spec/codefumes/commit_spec.rb
24
26
  spec/codefumes/config_file_spec.rb
25
27
  spec/codefumes/payload_spec.rb
26
28
  spec/codefumes/project_spec.rb
27
29
  spec/codefumes_service_helpers.rb
30
+ spec/fixtures/build.xml
28
31
  spec/fixtures/commit.xml
29
32
  spec/fixtures/commit_with_custom_attrs.xml
30
33
  spec/fixtures/multiple_commits.xml
@@ -34,5 +37,3 @@ spec/fixtures/project_update.xml
34
37
  spec/spec.opts
35
38
  spec/spec_helper.rb
36
39
  tasks/rspec.rake
37
- website/index.html
38
- website/stylesheets/screen.css
data/Rakefile CHANGED
@@ -24,7 +24,7 @@ $hoe = Hoe.spec('codefumes') do
24
24
  ['rubigen', ">= 1.5.2"],
25
25
  ['fakeweb', ">= 1.2.6"]
26
26
  ]
27
- self.extra_deps = [['httparty','>= 0.4.3']]
27
+ self.extra_deps = [['httparty','>= 0.4.3'], ['mojombo-chronic', '>= 0.3.0']]
28
28
  developer('Tom Kersten', 'tom.kersten@cosyntech.com')
29
29
  developer('Joe Banks', 'freemarmoset@gmail.com')
30
30
  end
@@ -0,0 +1,131 @@
1
+ module CodeFumes
2
+ # A Build represents a specific instance of tests running on
3
+ # a continuous integration server. Builds have a name and are
4
+ # associated with # a specific Commit of a Project and can track
5
+ # the current status (running, failed, success) and the
6
+ # start & end times of the Build process.
7
+ class Build < CodeFumes::API
8
+ attr_reader :project_public_key, :project_private_key, :created_at, :api_uri, :identifier, :commit_identifier
9
+ attr_accessor :started_at, :ended_at, :state, :name
10
+
11
+ # Initializes new instance of a Build.
12
+ #
13
+ # Accepts an +options+ Hash with support for the following keys:
14
+ # :public_key (*)
15
+ # :private_key (*)
16
+ # :commit_identifier (*)
17
+ # :identifier
18
+ # :name (*)
19
+ # :state
20
+ # :api_uri
21
+ # :started_at (*)
22
+ # :ended_at
23
+ #
24
+ # NOTE: (*) denotes a required key/value pair
25
+ def initialize(options = {})
26
+ @project_public_key = options[:public_key] || options['public_key']
27
+ @project_private_key = options[:private_key] || options['private_key']
28
+ @commit_identifier = options[:commit_identifier] || options['commit_identifier']
29
+ @identifier = options[:identifier] || options['identifier']
30
+ @name = options[:name] || options['name']
31
+ @state = options[:state] || options['state']
32
+ @api_uri = options[:api_uri] || options['api_uri']
33
+ @started_at = options[:started_at] || options['started_at']
34
+ @ended_at = options[:ended_at] || options['ended_at']
35
+ end
36
+
37
+ # Saves the Build instance to CodeFumes.com
38
+ #
39
+ # Returns +true+ if successful
40
+ #
41
+ # Returns +false+ if request fails
42
+ def save
43
+ response = exists? ? update : create
44
+
45
+ case response.code
46
+ when 201,200
47
+ @identifier = response['build']['identifier']
48
+ @name = response['build']['name']
49
+ @created_at = response['build']['created_at']
50
+ @started_at = response['build']['started_at']
51
+ @ended_at = response['build']['ended_at']
52
+ @state = response['build']['state']
53
+ @api_uri = response['build']['build_api_uri']
54
+ @commit_identifier = response['build']['commit_identifier']
55
+ @project_public_key = response['build']['public_key']
56
+ @project_private_key = response['build']['private_key']
57
+ true
58
+ else
59
+ false
60
+ end
61
+ end
62
+
63
+ # Searches website for Build with the supplied identifier.
64
+ #
65
+ # Returns a Build instance if the Build exists and is available,
66
+ # to the user making the request.
67
+ #
68
+ # Returns +nil+ in all other cases.
69
+ def self.find(options)
70
+ uri = "/projects/#{options[:public_key]}/commits/#{options[:commit_identifier]}/builds/#{options[:identifier]}"
71
+
72
+ response = get(uri)
73
+
74
+ case response.code
75
+ when 200
76
+ build_params = response["build"] || {}
77
+ Build.new(build_params.merge(:private_key => options[:private_key]))
78
+ else
79
+ nil
80
+ end
81
+ end
82
+
83
+
84
+ # Returns true if the request was successful
85
+ #
86
+ # Returns +false+ in all other cases.
87
+ def destroy
88
+ uri = "/projects/#{@project_public_key}/commits/#{@commit_identifier}/builds/#{@identifier}"
89
+ auth_args = {:username => @project_public_key, :password => @project_private_key}
90
+
91
+ response = self.class.delete(uri, :basic_auth => auth_args)
92
+
93
+ case response.code
94
+ when 200 : true
95
+ else false
96
+ end
97
+ end
98
+
99
+ private
100
+ # Verifies existence of Build on website.
101
+ #
102
+ # Returns +true+ if a build with the specified identifier or name is associated with
103
+ # the specified project/commit
104
+ #
105
+ # Returns +false+ if the public key of the Project is not available.
106
+ def exists?
107
+ !self.class.find(:public_key => @project_public_key,
108
+ :commit_identifier => @commit_identifier,
109
+ :identifier => @identifier || @name,
110
+ :private_key => @project_private_key).nil?
111
+ end
112
+
113
+ # Saves a new build (makes POST request)
114
+ def create
115
+ content = standard_content_hash
116
+ self.class.post("/projects/#{@project_public_key}/commits/#{@commit_identifier}/builds", :query => {:build => content}, :basic_auth => {:username => @project_public_key, :password => @project_private_key})
117
+ end
118
+
119
+ # Updates an existing build (makes PUT request)
120
+ def update
121
+ content = standard_content_hash
122
+ # HACK!
123
+ searchable_identifier = @identifier || @name
124
+ self.class.put("/projects/#{@project_public_key}/commits/#{@commit_identifier}/builds/#{searchable_identifier}", :query => {:build => content}, :basic_auth => {:username => @project_public_key, :password => @project_private_key})
125
+ end
126
+
127
+ def standard_content_hash
128
+ {:name => @name,:started_at => @started_at, :ended_at => @ended_at, :state => @state}
129
+ end
130
+ end
131
+ end
data/lib/codefumes.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  require 'httparty'
2
+ require 'chronic'
2
3
 
3
4
  require 'codefumes/api'
5
+ require 'codefumes/build'
4
6
  require 'codefumes/claim'
5
7
  require 'codefumes/commit'
6
8
  require 'codefumes/config_file'
@@ -8,5 +10,5 @@ require 'codefumes/payload'
8
10
  require 'codefumes/project'
9
11
 
10
12
  module CodeFumes
11
- VERSION = '0.1.5'
13
+ VERSION = '0.1.7' unless defined?(CodeFumes::VERSION)
12
14
  end
@@ -14,7 +14,7 @@ describe "API" do
14
14
 
15
15
  context "switching modes" do
16
16
  before(:each) do
17
- CodeFumes::API.mode(:test)
17
+ APIClass.mode(:test)
18
18
  end
19
19
 
20
20
  it "changes the base uri to the test site when switched to test mode" do
@@ -22,17 +22,17 @@ describe "API" do
22
22
  end
23
23
 
24
24
  it "changes the base uri to the production site when switched to production mode" do
25
- CodeFumes::API.mode(:production)
25
+ APIClass.mode(:production)
26
26
  APIClass.base_uri.should == 'http://codefumes.com/api/v1/xml'
27
27
  end
28
28
 
29
29
  it "ignores unrecognized modes" do
30
- CodeFumes::API.mode(:incomprehensible)
30
+ APIClass.mode(:incomprehensible)
31
31
  APIClass.base_uri.should == 'http://test.codefumes.com/api/v1/xml'
32
32
  end
33
33
 
34
34
  it "changes the base uri to 'localhost:3000' when switched to local mode (for developer testing)" do
35
- CodeFumes::API.mode(:local)
35
+ APIClass.mode(:local)
36
36
  APIClass.base_uri.should == 'http://codefumes.com.local/api/v1/xml'
37
37
  end
38
38
  end
@@ -0,0 +1,119 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper.rb'
2
+
3
+ describe "Build" do
4
+ include CodeFumesServiceHelpers::Build
5
+
6
+ after(:all) do
7
+ FakeWeb.allow_net_connect = false
8
+ FakeWeb.clean_registry
9
+ end
10
+
11
+ before(:each) do
12
+ setup_fixture_base
13
+ setup_build_fixtures
14
+ @build_params = { :public_key => @pub_key, :private_key => @priv_key,
15
+ :name => @build_name, :commit_identifier => @commit_identifier,
16
+ :started_at => @started_at, :state => @state}
17
+
18
+ @build = Build.new(@build_params)
19
+ end
20
+
21
+ describe "save" do
22
+ it "sets basic auth with the public and private key" do
23
+ @build.stub!(:exists?).and_return(false)
24
+ register_create_uri(["401", "Unauthorized"], "")
25
+
26
+ basic_auth_params = {:username => @pub_key, :password => @priv_key}
27
+
28
+ build_query = {:build => {:name => @build_name, :ended_at => nil, :started_at => @started_at, :state => @state}}
29
+ Build.should_receive(:post).with("/projects/#{@project.public_key}/commits/#{@commit_identifier}/builds", :query => build_query, :basic_auth => basic_auth_params).and_return(mock("response", :code => 401))
30
+ @build.save
31
+ end
32
+
33
+ context "when it's a new build for the specified commit" do
34
+ before(:each) do
35
+ @build.stub!(:exists?).and_return(false)
36
+ register_create_uri(["201", "Created"])
37
+ end
38
+
39
+ it "sets a value for 'created_at'" do
40
+ @build.created_at.should == nil
41
+ @build.save.should == true
42
+ @build.created_at.should_not == nil
43
+ end
44
+
45
+ it "sets a value for 'identifier'" do
46
+ @build.identifier.should == nil
47
+ @build.save.should == true
48
+ @build.identifier.should_not == nil
49
+ end
50
+ end
51
+
52
+ context "with Unauthorized response" do
53
+ before(:each) do
54
+ @build.stub!(:exists?).and_return(false)
55
+ register_create_uri(["401", "Unauthorized"], "")
56
+ end
57
+
58
+ it "does not set 'created_at'" do
59
+ @build.created_at.should == nil
60
+ @build.save.should == false
61
+ @build.created_at.should == nil
62
+ end
63
+ end
64
+
65
+ context "when the build already exists on the server" do
66
+ before(:each) do
67
+ register_update_uri(["200", "OK"])
68
+ @build = Build.new(@build_params.merge(:identifier => @build_identifier))
69
+ Build.stub!(:find).and_return(@build)
70
+ end
71
+
72
+ it "updates the existing build" do
73
+ mock_response = mock("Response", :code => 200).as_null_object
74
+ @build.should_receive(:update).and_return(mock_response)
75
+ @build.save
76
+ end
77
+ end
78
+ end
79
+
80
+ describe "find" do
81
+ before(:each) do
82
+ setup_fixture_base
83
+ setup_build_fixtures
84
+ @find_params = {:public_key => @pub_key,
85
+ :commit_identifier => @commit_identifier,
86
+ :identifier => @build_identifier}
87
+ end
88
+
89
+ it "returns an instance of Build when found" do
90
+ register_show_uri(["200", "OK"])
91
+ returned_object = Build.find(@find_params)
92
+ returned_object.should be_instance_of(Build)
93
+ returned_object.state.should_not be_nil
94
+ end
95
+
96
+ it "returns nil when not found" do
97
+ register_show_uri(["404", "Not found"])
98
+ Build.find(@find_params).should be_nil
99
+ end
100
+ end
101
+
102
+ describe "destroy" do
103
+ before(:each) do
104
+ setup_fixture_base
105
+ setup_build_fixtures
106
+ @build = Build.new(@build_params.merge(:identifier => @build_identifier))
107
+ end
108
+
109
+ it "returns true when the request returns a status of '200 Ok'" do
110
+ register_delete_uri(["200", "OK"])
111
+ @build.destroy.should be_true
112
+ end
113
+
114
+ it "returns false if the status is not '200 Ok'" do
115
+ register_delete_uri(["500", "Internal Server Error"], "")
116
+ @build.destroy.should be_false
117
+ end
118
+ end
119
+ end
@@ -42,12 +42,10 @@ describe "Payload" do
42
42
  register_create_uri(["401", "Unauthorized"], "")
43
43
  end
44
44
 
45
- [:created_at].each do |method_name|
46
- it "sets the '#{method_name.to_s}'" do
47
- @payload.send(method_name).should == nil
48
- @payload.save.should == false
49
- @payload.send(method_name).should == nil
50
- end
45
+ it "does not set 'created_at'" do
46
+ @payload.created_at.should == nil
47
+ @payload.save.should == false
48
+ @payload.created_at.should == nil
51
49
  end
52
50
  end
53
51
 
@@ -14,6 +14,8 @@ module CodeFumesServiceHelpers
14
14
  @updated_name = @project_name + "_updated"
15
15
  @commit_data = "commit_data"
16
16
  @api_key = "USERS_API_KEY"
17
+ @build_name = "IE7"
18
+ @commit_identifier = "COMMIT_IDENTIFIER"
17
19
  end
18
20
 
19
21
  def fixtures
@@ -98,4 +100,34 @@ module CodeFumesServiceHelpers
98
100
  FakeWeb.register_uri(:put, request_uri, :status => status_code, :body => body_content)
99
101
  end
100
102
  end
103
+
104
+ module Build
105
+ def setup_build_fixtures
106
+ @started_at = "2009-09-26 21:18:11 UTC"
107
+ @esc_started_at = "2009-09-26%2021%3A18%3A11%20UTC"
108
+ @state = "running"
109
+ @build_identifier = "BUILD_IDENTIFIER"
110
+ end
111
+
112
+ def register_create_uri(status_code = ["201", "Created"], body_content = fixtures[:build])
113
+ FakeWeb.register_uri(:post, "#{@authd_project_api_uri}/commits/#{@commit_identifier}/builds?build[state]=#{@state}&build[started_at]=#{@esc_started_at}&build[ended_at]=&build[name]=#{@build_name}",
114
+ :status => status_code, :body => body_content)
115
+ end
116
+
117
+ def register_update_uri(status_code = ["200", "Ok"], body_content = fixtures[:build])
118
+ FakeWeb.register_uri(:put, "#{@authd_project_api_uri}/commits/#{@commit_identifier}/builds/#{@build_identifier}?build[state]=#{@state}&build[started_at]=#{@esc_started_at}&build[ended_at]=&build[name]=#{@build_name}",
119
+ :status => status_code, :body => body_content)
120
+ end
121
+
122
+ def register_show_uri(status_code = ["200", "Ok"], body_content = fixtures[:build])
123
+ FakeWeb.register_uri(:get, "#{@anon_project_api_uri}/commits/#{@commit_identifier}/builds/#{@build_identifier}",
124
+ :status => status_code, :body => body_content)
125
+ end
126
+
127
+ def register_delete_uri(status_code = ["200", "Ok"], body_content = fixtures[:project])
128
+ FakeWeb.register_uri(:delete, "#{@authd_project_api_uri}/commits/#{@commit_identifier}/builds/#{@build_identifier}",
129
+ :status => status_code,
130
+ :body => body_content)
131
+ end
132
+ end
101
133
  end
@@ -0,0 +1,10 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <build>
3
+ <identifier>BUILD_ID</identifier>
4
+ <name>IE7</name>
5
+ <state>running</state>
6
+ <ended_at></ended_at>
7
+ <started_at>2009-09-26 21:18:11 UTC</started_at>
8
+ <created_at>2009-09-26 21:19:11 UTC</created_at>
9
+ <api_uri>http://codefumes.com/api/v1/xml/projects/public_key_value/commits/COMMIT_IDENTIFIER/builds/BUILD_ID.xml</api_uri>
10
+ </build>
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: codefumes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 7
9
+ version: 0.1.7
5
10
  platform: ruby
6
11
  authors:
7
12
  - Tom Kersten
@@ -10,59 +15,93 @@ autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
17
 
13
- date: 2010-02-19 00:00:00 -06:00
18
+ date: 2010-03-27 00:00:00 -05:00
14
19
  default_executable:
15
20
  dependencies:
16
21
  - !ruby/object:Gem::Dependency
17
22
  name: httparty
18
- type: :runtime
19
- version_requirement:
20
- version_requirements: !ruby/object:Gem::Requirement
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
21
25
  requirements:
22
26
  - - ">="
23
27
  - !ruby/object:Gem::Version
28
+ segments:
29
+ - 0
30
+ - 4
31
+ - 3
24
32
  version: 0.4.3
25
- version:
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: mojombo-chronic
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ segments:
43
+ - 0
44
+ - 3
45
+ - 0
46
+ version: 0.3.0
47
+ type: :runtime
48
+ version_requirements: *id002
26
49
  - !ruby/object:Gem::Dependency
27
50
  name: jscruggs-metric_fu
28
- type: :development
29
- version_requirement:
30
- version_requirements: !ruby/object:Gem::Requirement
51
+ prerelease: false
52
+ requirement: &id003 !ruby/object:Gem::Requirement
31
53
  requirements:
32
54
  - - ">="
33
55
  - !ruby/object:Gem::Version
56
+ segments:
57
+ - 1
58
+ - 1
59
+ - 5
34
60
  version: 1.1.5
35
- version:
61
+ type: :development
62
+ version_requirements: *id003
36
63
  - !ruby/object:Gem::Dependency
37
64
  name: rubigen
38
- type: :development
39
- version_requirement:
40
- version_requirements: !ruby/object:Gem::Requirement
65
+ prerelease: false
66
+ requirement: &id004 !ruby/object:Gem::Requirement
41
67
  requirements:
42
68
  - - ">="
43
69
  - !ruby/object:Gem::Version
70
+ segments:
71
+ - 1
72
+ - 5
73
+ - 2
44
74
  version: 1.5.2
45
- version:
75
+ type: :development
76
+ version_requirements: *id004
46
77
  - !ruby/object:Gem::Dependency
47
78
  name: fakeweb
48
- type: :development
49
- version_requirement:
50
- version_requirements: !ruby/object:Gem::Requirement
79
+ prerelease: false
80
+ requirement: &id005 !ruby/object:Gem::Requirement
51
81
  requirements:
52
82
  - - ">="
53
83
  - !ruby/object:Gem::Version
84
+ segments:
85
+ - 1
86
+ - 2
87
+ - 6
54
88
  version: 1.2.6
55
- version:
89
+ type: :development
90
+ version_requirements: *id005
56
91
  - !ruby/object:Gem::Dependency
57
92
  name: hoe
58
- type: :development
59
- version_requirement:
60
- version_requirements: !ruby/object:Gem::Requirement
93
+ prerelease: false
94
+ requirement: &id006 !ruby/object:Gem::Requirement
61
95
  requirements:
62
96
  - - ">="
63
97
  - !ruby/object:Gem::Version
98
+ segments:
99
+ - 2
100
+ - 5
101
+ - 0
64
102
  version: 2.5.0
65
- version:
103
+ type: :development
104
+ version_requirements: *id006
66
105
  description: |-
67
106
  CodeFumes.com[http://codefumes.com] is a service intended to help people
68
107
  involved with software projects who are interested in tracking, sharing,
@@ -106,6 +145,7 @@ files:
106
145
  - lib/cf_store_credentials/cli.rb
107
146
  - lib/codefumes.rb
108
147
  - lib/codefumes/api.rb
148
+ - lib/codefumes/build.rb
109
149
  - lib/codefumes/claim.rb
110
150
  - lib/codefumes/commit.rb
111
151
  - lib/codefumes/config_file.rb
@@ -115,12 +155,14 @@ files:
115
155
  - spec/cf_release_project/cli_spec.rb
116
156
  - spec/cf_store_credentials/cli_spec.rb
117
157
  - spec/codefumes/api_spec.rb
158
+ - spec/codefumes/build_spec.rb
118
159
  - spec/codefumes/claim_spec.rb
119
160
  - spec/codefumes/commit_spec.rb
120
161
  - spec/codefumes/config_file_spec.rb
121
162
  - spec/codefumes/payload_spec.rb
122
163
  - spec/codefumes/project_spec.rb
123
164
  - spec/codefumes_service_helpers.rb
165
+ - spec/fixtures/build.xml
124
166
  - spec/fixtures/commit.xml
125
167
  - spec/fixtures/commit_with_custom_attrs.xml
126
168
  - spec/fixtures/multiple_commits.xml
@@ -130,8 +172,6 @@ files:
130
172
  - spec/spec.opts
131
173
  - spec/spec_helper.rb
132
174
  - tasks/rspec.rake
133
- - website/index.html
134
- - website/stylesheets/screen.css
135
175
  has_rdoc: true
136
176
  homepage: http://codefumes.rubyforge.org/codefumes
137
177
  licenses: []
@@ -146,18 +186,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
146
186
  requirements:
147
187
  - - ">="
148
188
  - !ruby/object:Gem::Version
189
+ segments:
190
+ - 0
149
191
  version: "0"
150
- version:
151
192
  required_rubygems_version: !ruby/object:Gem::Requirement
152
193
  requirements:
153
194
  - - ">="
154
195
  - !ruby/object:Gem::Version
196
+ segments:
197
+ - 0
155
198
  version: "0"
156
- version:
157
199
  requirements: []
158
200
 
159
201
  rubyforge_project: codefumes
160
- rubygems_version: 1.3.5
202
+ rubygems_version: 1.3.6
161
203
  signing_key:
162
204
  specification_version: 3
163
205
  summary: A client-side implementation of the CodeFumes.com API.
data/website/index.html DELETED
@@ -1,98 +0,0 @@
1
- <html>
2
- <head>
3
- <meta http-equiv="Content-type" content="text/html; charset=utf-8">
4
- <title>codefumes</title>
5
- <link href="stylesheets/screen.css" rel="stylesheet" type="text/css">
6
- </head>
7
- <body>
8
- <div id="page">
9
- <h1>Official CodeFumes.com Ruby Gems</h1>
10
- <p>
11
- <a href="http://codefumes.com">CodeFumes.com</a> is a site intended to simplify the process of gathering metrics and associating them with a particular revision of code. The gems described below integrate with this website and are intended to simplify the process of "fleshing out" the pictures you want to draw around your codebase.
12
- </p>
13
- <h2>Gems</h2>
14
- <ul>
15
- <li>
16
- <ul>
17
- <li class="name">codefumes</li>
18
- <li>
19
- <a href="http://github.com/cosyn/codefumes/wikis">[wiki]</a>
20
- </li>
21
- <li>
22
- <a href="http://codefumes.rubyforge.org/codefumes">[rdoc]</a>
23
- </li>
24
- <li>
25
- <a href="http://github.com/cosyn/codefumes">[repo]</a>
26
- </li>
27
- <li>
28
- <a href="http://github.com/cosyn/codefumes/issues">[bugs/requests]</a>
29
- </li>
30
- <li>
31
- <a href="http://groups.google.com/group/codefumes">[mailing list]</a>
32
- </li>
33
- </ul>
34
- <p class="overview">
35
- The 'codefumes' gem is an implementation of the
36
- <a href="http://codefumes.com">CodeFumes.com</a> API.
37
- The intention of the gem is to simplify integration with CodeFumes.com
38
- for developers of other libraries & and applications.
39
- </p>
40
- </li>
41
- <li>
42
- <ul>
43
- <li class="name">codefumes_harvester</li>
44
- <li>
45
- <a href="http://github.com/cosyn/codefumes_harvester/wikis">[wiki]</a>
46
- </li>
47
- <li>
48
- <a href="http://codefumes.rubyforge.org/codefumes_harvester">[rdoc]</a>
49
- </li>
50
- <li>
51
- <a href="http://github.com/cosyn/codefumes_harvester">[repo]</a>
52
- </li>
53
- <li>
54
- <a href="http://github.com/cosyn/codefumes_harvester/issues">[bugs/requests]</a>
55
- </li>
56
- <li>
57
- <a href="http://groups.google.com/group/codefumes">[mailing list]</a>
58
- </li>
59
- </ul>
60
- <p class="overview">
61
- The codefumes_harvester gem provides a set of high-level tools for gathering
62
- history and common metrics from a local repository and sending them to
63
- <a href="http://codefumes.com">CodeFumes.com</a>.
64
- </p>
65
- </li>
66
- </ul>
67
-
68
- <h2>Contributing</h2>
69
- <p>
70
- Improvements in the code and/or documentation are always
71
- welcome. The gems each have a wiki on the Github page
72
- (see gem links above). You can contribute to the code by
73
- forking a repository and sending a pull request to Tom
74
- Kersten (github handle: tomkersten).
75
- </p>
76
-
77
- <h2>Community Discussion/Mailing Lists</h2>
78
- <p>
79
- General discussion around CodeFumes.com and associated
80
- tools/content is welcome on the
81
- <a href="http://groups.google.com/group/codefumes">codefumes Google Group</a>
82
- </p>
83
-
84
- <h2>Bug reports, Feature Requests</h2>
85
- <p>
86
- Feel free to use the "Issues" area of the Github repository for
87
- this project. The link for each gem is provided above.
88
- </p>
89
- <div id="footer">
90
- <ul>
91
- <li>License</li>
92
- <li>(The MIT License)</li>
93
- <li>Copyright (C) Tom Kersten, Cosyn Technologies, Inc.</li>
94
- </ul>
95
- </div>
96
- </div>
97
- </body>
98
- </html>
@@ -1,67 +0,0 @@
1
- body {
2
- font-family: "Georgia", sans-serif;
3
- font-size: 16px;
4
- line-height: 1.6em;
5
- padding: 1.6em 0 .9em .9em;
6
- color: #333;
7
- }
8
-
9
- #page {
10
- width: 942px;
11
- }
12
-
13
- h1, h2, h3, h4, h5, h6 {
14
- color: #444;
15
- }
16
-
17
- h1 {
18
- font-family: sans-serif;
19
- font-weight: normal;
20
- font-size: 3em;
21
- line-height: 0.8em;
22
- letter-spacing: -0.1ex;
23
- margin: 5px;
24
- }
25
-
26
- ul {
27
- padding-left: 2em;
28
- }
29
-
30
- ul li {
31
- padding-bottom: 4em;
32
- margin: 0;
33
- list-style-type: none;
34
- }
35
-
36
-
37
- ul li ul {
38
- padding: 0;
39
- text-align: right;
40
- }
41
-
42
- ul li ul li {
43
- display: inline-block;
44
- list-style-type: none;
45
- margin: 0;
46
- padding: 0;
47
- }
48
-
49
- ul li.name {
50
- font-weight: bold;
51
- width: 200px;
52
- text-align: left;
53
- float: left;
54
- }
55
-
56
- div#footer ul {
57
- text-align: right;
58
- }
59
-
60
- div#footer ul li {
61
- font-size: .8em;
62
- color: #AAA;
63
- display: inline-block;
64
- list-style-type: none;
65
- margin: 0;
66
- padding: 0;
67
- }