artifacts 2.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/.gitignore +6 -0
- data/Gemfile +4 -0
- data/Rakefile +2 -0
- data/artifacts.gemspec +25 -0
- data/bin/artifacts +3 -0
- data/lib/artifacts.rb +35 -0
- data/lib/artifacts/artifact.rb +44 -0
- data/lib/artifacts/artifact_artifact.rb +8 -0
- data/lib/artifacts/comment.rb +24 -0
- data/lib/artifacts/exception.rb +6 -0
- data/lib/artifacts/executable.rb +148 -0
- data/lib/artifacts/tag.rb +16 -0
- data/lib/artifacts/version.rb +3 -0
- metadata +138 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
data/artifacts.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "artifacts/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "artifacts"
|
7
|
+
s.version = Artifacts::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Clive Crous"]
|
10
|
+
s.email = ["clive@crous.co.za"]
|
11
|
+
s.homepage = "http://www.darkarts.co.za/artifacts"
|
12
|
+
s.summary = %q{A console based ticket (bug/feature) tracker who's data travels inside your repository}
|
13
|
+
s.description = %q{A console based ticket (bug/feature) tracker who's data travels inside your repository}
|
14
|
+
|
15
|
+
s.add_dependency "yaml-model", ">= 1.3.1"
|
16
|
+
|
17
|
+
s.add_development_dependency "bundler", ">= 1.0.0"
|
18
|
+
s.add_development_dependency "rspec", ">= 1.3.0"
|
19
|
+
s.add_development_dependency "rake", ">= 0.8.7"
|
20
|
+
|
21
|
+
s.files = `git ls-files`.split("\n")
|
22
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
23
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
24
|
+
s.require_paths = ["lib"]
|
25
|
+
end
|
data/bin/artifacts
ADDED
data/lib/artifacts.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'yaml-model'
|
2
|
+
|
3
|
+
require 'artifacts/version'
|
4
|
+
require 'artifacts/exception'
|
5
|
+
|
6
|
+
require 'artifacts/artifact'
|
7
|
+
require 'artifacts/artifact_artifact'
|
8
|
+
require 'artifacts/tag'
|
9
|
+
require 'artifacts/comment'
|
10
|
+
|
11
|
+
class Artifacts
|
12
|
+
|
13
|
+
FILENAME = '.artifacts'
|
14
|
+
REPOSITORY_DIRECTORIES = %w|.git _darcs|
|
15
|
+
|
16
|
+
def self.guess_path
|
17
|
+
directory = Dir.pwd
|
18
|
+
until directory.empty? do
|
19
|
+
path = File.join( directory, FILENAME )
|
20
|
+
return directory if File.exists?( path )
|
21
|
+
REPOSITORY_DIRECTORIES.each do |repo|
|
22
|
+
return directory if File.exists?( File.join( directory, repo ) )
|
23
|
+
end
|
24
|
+
previous_directory = directory
|
25
|
+
directory = File.join( File.split( directory )[0..-2] )
|
26
|
+
break if directory == previous_directory
|
27
|
+
end
|
28
|
+
raise UnableToLocatePath
|
29
|
+
end
|
30
|
+
|
31
|
+
def initialize( path = self.class.guess_path )
|
32
|
+
YAML_Model.filename = File.join( path, FILENAME )
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
class Artifacts
|
2
|
+
|
3
|
+
Comment ||= Class.new( YAML_Model )
|
4
|
+
Tag ||= Class.new( YAML_Model )
|
5
|
+
ArtifactArtifact ||= Class.new( YAML_Model )
|
6
|
+
class Artifact < YAML_Model
|
7
|
+
type :creator, String
|
8
|
+
type :summary, String
|
9
|
+
|
10
|
+
type :created, Time, :default => Time.now
|
11
|
+
type :closed, [NilClass,Time], :default => nil
|
12
|
+
|
13
|
+
has :dependee_references, ArtifactArtifact, ArtifactArtifact => :dependee
|
14
|
+
has :dependant_references, ArtifactArtifact, ArtifactArtifact => :dependant
|
15
|
+
|
16
|
+
has :tags, Tag, :many_to_many => true
|
17
|
+
has :comments, Comment
|
18
|
+
init :creator, :summary
|
19
|
+
|
20
|
+
def dependants
|
21
|
+
dependee_references.map{|n|n.dependant}
|
22
|
+
end
|
23
|
+
|
24
|
+
def dependees
|
25
|
+
dependant_references.map{|n|n.dependee}
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_s
|
29
|
+
"%#{YAML_Model.next_oid.to_s.length}d #{created.strftime('%Y-%m-%d')} #{creator} [#{tags.join(',')}] (#{dependants.size}:#{dependees.size})\n#{' '*YAML_Model.next_oid.to_s.length} %s"%[id,summary]
|
30
|
+
end
|
31
|
+
|
32
|
+
def inspect
|
33
|
+
spaces = YAML_Model.next_oid.to_s.length + 2
|
34
|
+
"#{to_s}\n" +
|
35
|
+
' '*spaces + 'created : ' + created.to_s + "\n" +
|
36
|
+
( closed ? (' '*spaces + 'closed : ' + closed.to_s + "\n" ) : '' ) +
|
37
|
+
( dependees.size > 0 ? (' '*spaces + 'dependees : [' + dependees.map{|n|n.id}.join(',') + "]\n" ) : '' ) +
|
38
|
+
( dependants.size > 0 ? (' '*spaces + 'dependants : [' + dependants.map{|n|n.id}.join(',') + "]\n" ) : '' ) +
|
39
|
+
( comments.size > 0 ? (' '*spaces + "comments :\n" + comments.join("\n")) : '' )
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class Artifacts
|
2
|
+
|
3
|
+
Artifact ||= Class.new( YAML_Model )
|
4
|
+
class Comment < YAML_Model
|
5
|
+
type :artifact, Artifact
|
6
|
+
type :created, Time, :default => Time.now
|
7
|
+
type :author, String
|
8
|
+
type :text, String
|
9
|
+
|
10
|
+
init :artifact, :author, :text
|
11
|
+
|
12
|
+
def to_s
|
13
|
+
spaces = ' '*(YAML_Model.next_oid.to_s.length+1)
|
14
|
+
"#{spaces}#{created.strftime('%Y-%m-%d')} #{author}\n#{spaces}#{text}"
|
15
|
+
end
|
16
|
+
|
17
|
+
def inspect
|
18
|
+
to_s
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
@@ -0,0 +1,148 @@
|
|
1
|
+
require 'artifacts'
|
2
|
+
|
3
|
+
class Artifacts
|
4
|
+
|
5
|
+
def self.username
|
6
|
+
"#{`git config user.name`.strip} <#{`git config user.email`.strip}>"
|
7
|
+
end
|
8
|
+
|
9
|
+
class Executable
|
10
|
+
|
11
|
+
def self.stub( method, default )
|
12
|
+
define_method method do |*args|
|
13
|
+
command = args.shift
|
14
|
+
command ||= default
|
15
|
+
send( "#{method}__#{command}".to_sym, *args )
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize( args )
|
20
|
+
if args.first == 'init'
|
21
|
+
args.shift
|
22
|
+
path = args.shift
|
23
|
+
Artifacts.new( path )
|
24
|
+
puts "Artifacts repository created at: #{path}"
|
25
|
+
exit 0
|
26
|
+
end
|
27
|
+
begin
|
28
|
+
Artifacts.new
|
29
|
+
rescue Artifacts::UnableToLocatePath
|
30
|
+
puts "Unable to locate artifacts data file!"
|
31
|
+
raise
|
32
|
+
end
|
33
|
+
|
34
|
+
@artifacts = []
|
35
|
+
while args.first =~ /^\d+$/
|
36
|
+
@artifacts << Artifact[ args.shift.to_i ]
|
37
|
+
end
|
38
|
+
|
39
|
+
command = args.shift
|
40
|
+
command ||= :help
|
41
|
+
|
42
|
+
send( command.to_sym, *args )
|
43
|
+
end
|
44
|
+
|
45
|
+
def method_missing( method, *args )
|
46
|
+
puts "Unknown command: #{method.to_s.gsub('__',' ')}"
|
47
|
+
end
|
48
|
+
|
49
|
+
def help_command( command, description )
|
50
|
+
puts( "%-10s : %s"%[command,description] )
|
51
|
+
end
|
52
|
+
|
53
|
+
def help__help( *args )
|
54
|
+
help_command :help, 'Display this message. For more information on a specific command use `help <command>` eg: `help tag`'
|
55
|
+
end
|
56
|
+
|
57
|
+
def help__list( *args )
|
58
|
+
help__help
|
59
|
+
help_command :tag, 'Tagging'
|
60
|
+
help_command :create, 'Create a new artifact'
|
61
|
+
help_command :list, 'List artifacts'
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.default_list_filter( list )
|
65
|
+
list.select{|a|a.closed == nil && a.dependees.size == 0}
|
66
|
+
end
|
67
|
+
|
68
|
+
def list
|
69
|
+
( @artifacts.empty? ? self.class.default_list_filter(Artifact.all) : @artifacts ).each do |artifact|
|
70
|
+
puts artifact
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def show( *args )
|
75
|
+
( @artifacts.empty? ? self.class.default_list_filter(Artifact.all) : @artifacts ).each do |artifact|
|
76
|
+
puts artifact.inspect
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def closed
|
81
|
+
@artifacts = @artifacts.select{|n|n.closed}
|
82
|
+
if @artifacts.empty?
|
83
|
+
@artifacts = Artifact.select{|a|a.closed != nil}.sort{|a,b|a.closed<=>b.closed}
|
84
|
+
end
|
85
|
+
list
|
86
|
+
end
|
87
|
+
|
88
|
+
def create( *args )
|
89
|
+
artifact = Artifact.create( Artifacts.username, args.join(' ') )
|
90
|
+
puts "Created artifact #{artifact.id}."
|
91
|
+
end
|
92
|
+
|
93
|
+
def close
|
94
|
+
@artifacts.each do |artifact|
|
95
|
+
artifact.closed = Time.now
|
96
|
+
end
|
97
|
+
puts "Closed artifacts:"
|
98
|
+
list
|
99
|
+
end
|
100
|
+
|
101
|
+
def version
|
102
|
+
puts "\nArtifacts: #{Artifacts::VERSION}"
|
103
|
+
end
|
104
|
+
|
105
|
+
stub :help, :list
|
106
|
+
|
107
|
+
def depends( *args )
|
108
|
+
args.shift if args.first == 'on' # optional syntax sugar
|
109
|
+
dependees = args.map{|id|Artifact[id.to_i]}
|
110
|
+
@artifacts.each do |artifact|
|
111
|
+
dependees.each do |dependee|
|
112
|
+
ArtifactArtifact.create( dependee, artifact )
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def tag( *args )
|
118
|
+
args.each do |tag_name|
|
119
|
+
tag = Tag.select{|n|n.name == tag_name}.first
|
120
|
+
tag ||= Tag.create( tag_name )
|
121
|
+
@artifacts.each do |artifact|
|
122
|
+
artifact.add_tag( tag )
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def tags( *args )
|
128
|
+
Tag.all.each do |tag|
|
129
|
+
puts tag.inspect
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def comment( *args )
|
134
|
+
text = args.join(' ')
|
135
|
+
author = Artifacts.username
|
136
|
+
@artifacts.each do |artifact|
|
137
|
+
Comment.create( artifact, author, text )
|
138
|
+
end
|
139
|
+
puts "Commends added to:"
|
140
|
+
list
|
141
|
+
end
|
142
|
+
|
143
|
+
def tag__create( tag )
|
144
|
+
Tag.create( tag )
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class Artifacts
|
2
|
+
|
3
|
+
Artifact ||= Class.new( YAML_Model )
|
4
|
+
class Tag < YAML_Model
|
5
|
+
type :name, String
|
6
|
+
has :artifacts, Artifact, :many_to_many => true
|
7
|
+
init :name
|
8
|
+
def to_s
|
9
|
+
name
|
10
|
+
end
|
11
|
+
def inspect
|
12
|
+
"#{to_s}: #{artifacts.map{|n|n.id}.join(',')}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
metadata
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: artifacts
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 2
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
version: 2.0.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Clive Crous
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2011-02-13 00:00:00 +02:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: yaml-model
|
22
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
23
|
+
none: false
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 1
|
29
|
+
- 3
|
30
|
+
- 1
|
31
|
+
version: 1.3.1
|
32
|
+
type: :runtime
|
33
|
+
prerelease: false
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: bundler
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
segments:
|
43
|
+
- 1
|
44
|
+
- 0
|
45
|
+
- 0
|
46
|
+
version: 1.0.0
|
47
|
+
type: :development
|
48
|
+
prerelease: false
|
49
|
+
version_requirements: *id002
|
50
|
+
- !ruby/object:Gem::Dependency
|
51
|
+
name: rspec
|
52
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
segments:
|
58
|
+
- 1
|
59
|
+
- 3
|
60
|
+
- 0
|
61
|
+
version: 1.3.0
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: *id003
|
65
|
+
- !ruby/object:Gem::Dependency
|
66
|
+
name: rake
|
67
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
68
|
+
none: false
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
segments:
|
73
|
+
- 0
|
74
|
+
- 8
|
75
|
+
- 7
|
76
|
+
version: 0.8.7
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *id004
|
80
|
+
description: A console based ticket (bug/feature) tracker who's data travels inside your repository
|
81
|
+
email:
|
82
|
+
- clive@crous.co.za
|
83
|
+
executables:
|
84
|
+
- artifacts
|
85
|
+
extensions: []
|
86
|
+
|
87
|
+
extra_rdoc_files: []
|
88
|
+
|
89
|
+
files:
|
90
|
+
- .gitignore
|
91
|
+
- Gemfile
|
92
|
+
- Rakefile
|
93
|
+
- artifacts.gemspec
|
94
|
+
- bin/artifacts
|
95
|
+
- lib/artifacts.rb
|
96
|
+
- lib/artifacts/artifact.rb
|
97
|
+
- lib/artifacts/artifact_artifact.rb
|
98
|
+
- lib/artifacts/comment.rb
|
99
|
+
- lib/artifacts/exception.rb
|
100
|
+
- lib/artifacts/executable.rb
|
101
|
+
- lib/artifacts/tag.rb
|
102
|
+
- lib/artifacts/version.rb
|
103
|
+
has_rdoc: true
|
104
|
+
homepage: http://www.darkarts.co.za/artifacts
|
105
|
+
licenses: []
|
106
|
+
|
107
|
+
post_install_message:
|
108
|
+
rdoc_options: []
|
109
|
+
|
110
|
+
require_paths:
|
111
|
+
- lib
|
112
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
hash: 678615055
|
118
|
+
segments:
|
119
|
+
- 0
|
120
|
+
version: "0"
|
121
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ">="
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
hash: 678615055
|
127
|
+
segments:
|
128
|
+
- 0
|
129
|
+
version: "0"
|
130
|
+
requirements: []
|
131
|
+
|
132
|
+
rubyforge_project:
|
133
|
+
rubygems_version: 1.3.7
|
134
|
+
signing_key:
|
135
|
+
specification_version: 3
|
136
|
+
summary: A console based ticket (bug/feature) tracker who's data travels inside your repository
|
137
|
+
test_files: []
|
138
|
+
|