ki-repo 0.1.0 → 0.1.1
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/README.md +26 -12
- data/VERSION +1 -1
- data/bin/ki +21 -0
- data/docs/backlog.md +35 -0
- data/docs/development.md +45 -0
- data/docs/development_setup.md +49 -0
- data/{lib/ki-repo.rb → docs/images/for_git.txt} +0 -0
- data/docs/ki_commands.md +202 -0
- data/docs/repository_basics.md +171 -0
- data/docs/writing_extensions.md +50 -0
- data/lib/cmd/cmd.rb +224 -0
- data/lib/cmd/user_pref_cmd.rb +122 -0
- data/lib/cmd/version_cmd.rb +483 -0
- data/lib/data_access/repository_finder.rb +200 -0
- data/lib/data_access/repository_info.rb +153 -0
- data/lib/data_access/version_helpers.rb +242 -0
- data/lib/data_access/version_iterators.rb +145 -0
- data/lib/data_access/version_operations.rb +80 -0
- data/lib/data_storage/dir_base.rb +106 -0
- data/lib/data_storage/ki_home.rb +44 -0
- data/lib/data_storage/ki_json.rb +153 -0
- data/lib/data_storage/repository.rb +91 -0
- data/lib/data_storage/version_metadata.rb +141 -0
- data/lib/ki_repo_all.rb +42 -0
- data/lib/util/attr_chain.rb +258 -0
- data/lib/util/exception_catcher.rb +118 -0
- data/lib/util/hash.rb +46 -0
- data/lib/util/hash_cache.rb +31 -0
- data/lib/util/ruby_extensions.rb +137 -0
- data/lib/util/service_registry.rb +88 -0
- data/lib/util/simple_optparse.rb +103 -0
- data/lib/util/test.rb +323 -0
- metadata +69 -13
- data/.document +0 -5
- data/.rspec +0 -1
- data/Gemfile +0 -14
- data/Gemfile.lock +0 -38
- data/Rakefile +0 -42
- data/spec/ki-repo_spec.rb +0 -6
- data/spec/spec_helper.rb +0 -12
@@ -0,0 +1,103 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
# Copyright 2012 Mikko Apo
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
|
17
|
+
module Ki
|
18
|
+
|
19
|
+
# simplified OptionParser, which supports unknown options by ignoring them
|
20
|
+
# * supports options in two formats: "-f file.txt" and "-f=file.txt"
|
21
|
+
# * supports short and long form: "--file" and "-f"
|
22
|
+
# * supports multiple parameters for options
|
23
|
+
# Does not support
|
24
|
+
# * parameters with spaces
|
25
|
+
# * type conversions
|
26
|
+
# * optional parameter values
|
27
|
+
class SimpleOptionParser
|
28
|
+
attr_chain :options_for_to_s, -> { Array.new }
|
29
|
+
attr_chain :options, -> { Array.new }
|
30
|
+
|
31
|
+
def initialize(&block)
|
32
|
+
block.call(self)
|
33
|
+
end
|
34
|
+
|
35
|
+
def on(*args, &block)
|
36
|
+
if block.nil?
|
37
|
+
raise "Option without parser block: " + args.join(", ")
|
38
|
+
end
|
39
|
+
if args.size == 3
|
40
|
+
short = args.delete_at(0)
|
41
|
+
long, *params = args.delete_at(0).split(" ")
|
42
|
+
comment = args.delete_at(0)
|
43
|
+
options_for_to_s << {short: short, long: long, comment: comment, params: params, block: block }
|
44
|
+
options << {opt: short, comment: comment, params: params, block: block }
|
45
|
+
options << {opt: long, comment: comment, params: params, block: block }
|
46
|
+
else
|
47
|
+
raise "unsupported option configuration size: " + args.join(", ")
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def parse(args)
|
52
|
+
ret = []
|
53
|
+
open = nil
|
54
|
+
collected_params = nil
|
55
|
+
collect_count = nil
|
56
|
+
args.each do |a|
|
57
|
+
if open
|
58
|
+
collected_params << a
|
59
|
+
if collect_count == collected_params.size
|
60
|
+
open[:block].call(*collected_params)
|
61
|
+
open = nil
|
62
|
+
end
|
63
|
+
else
|
64
|
+
found_option, rest_of_a = find_option(a)
|
65
|
+
if found_option
|
66
|
+
collect_count = found_option[:params].size
|
67
|
+
if collect_count == 0
|
68
|
+
# no parameters
|
69
|
+
found_option[:block].call
|
70
|
+
elsif collect_count == 1 && rest_of_a && rest_of_a.size > 0
|
71
|
+
# single parameter was defined with opt=value
|
72
|
+
found_option[:block].call rest_of_a
|
73
|
+
else
|
74
|
+
open = found_option
|
75
|
+
collected_params = []
|
76
|
+
end
|
77
|
+
else
|
78
|
+
ret << a
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
if open
|
83
|
+
raise "requires #{collect_count} parameters for '#{open[:opt]}', found only #{collected_params.size}: #{collected_params.join(", ")}"
|
84
|
+
end
|
85
|
+
ret
|
86
|
+
end
|
87
|
+
def find_option(a)
|
88
|
+
options.each do |o|
|
89
|
+
if a.start_with?(o[:opt] + "=")
|
90
|
+
return o, a[o[:opt].size+1..-1]
|
91
|
+
elsif a.start_with?(o[:opt])
|
92
|
+
return o,nil
|
93
|
+
end
|
94
|
+
end
|
95
|
+
nil
|
96
|
+
end
|
97
|
+
def to_s
|
98
|
+
options_for_to_s.map do |o|
|
99
|
+
format(" %2s%s %-29s%s",o[:short], o[:short] && o[:long]? ",": " ", o[:long], o[:comment] )
|
100
|
+
end.join("\n")
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
data/lib/util/test.rb
ADDED
@@ -0,0 +1,323 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
# Copyright 2012 Mikko Apo
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
|
17
|
+
require 'tmpdir'
|
18
|
+
|
19
|
+
module Ki
|
20
|
+
|
21
|
+
# Automatic resource cleanup that is executed when ruby is closing down
|
22
|
+
$testers = []
|
23
|
+
|
24
|
+
at_exit do
|
25
|
+
Tester.final_tester_check
|
26
|
+
end
|
27
|
+
|
28
|
+
# Modifies run time environment for tests and automatically restores original state
|
29
|
+
# * note: cleanup is triggered by calling the {#after} method
|
30
|
+
#
|
31
|
+
# @see #cleaners
|
32
|
+
# @see #tmpdir
|
33
|
+
# @see #catch_stdio
|
34
|
+
# @see #chdir
|
35
|
+
# @see #after
|
36
|
+
class Tester
|
37
|
+
# List of Procs which should be executed
|
38
|
+
# @see after
|
39
|
+
attr_reader :cleaners
|
40
|
+
|
41
|
+
# Name of the test round that uses this tester
|
42
|
+
attr_reader :test_name
|
43
|
+
|
44
|
+
# Dummy IO stream
|
45
|
+
# @see catch_stdio
|
46
|
+
attr_chain :stdin, -> { DummyIO.new }
|
47
|
+
|
48
|
+
# Dummy IO stream
|
49
|
+
# @see catch_stdio
|
50
|
+
attr_chain :stdout, -> { DummyIO.new }
|
51
|
+
|
52
|
+
# Dummy IO stream
|
53
|
+
# @see catch_stdio
|
54
|
+
attr_chain :stderr, -> { DummyIO.new }
|
55
|
+
|
56
|
+
def initialize(test_name = nil)
|
57
|
+
@test_name = test_name
|
58
|
+
@cleaners = []
|
59
|
+
$testers << self
|
60
|
+
end
|
61
|
+
|
62
|
+
# Creates a temporary directory
|
63
|
+
# * if called without a block removes directory when after is called
|
64
|
+
# @param [String] src tmpdir copies contents of src path if src is defined. note: only visible files are copied. files and directories starting with . are excluded
|
65
|
+
# @param [Proc] block if a block is defined, passes the temporary directory path to the block as parameter and removes the directory when the block ends
|
66
|
+
# @return [String, Object] If block is not defined, returns the path of the temporary directory. If block is defined, returns the value the block returns.
|
67
|
+
# @example
|
68
|
+
# tmp_source = @tester.tmpdir
|
69
|
+
# File.touch(File.join(tmp_source, "file.txt"))
|
70
|
+
# @tester.tmpdir(tmp_source).each do |dest_2|
|
71
|
+
#
|
72
|
+
# end
|
73
|
+
# @see copy_visible_files
|
74
|
+
def tmpdir(src=nil, &block)
|
75
|
+
dest = Dir.mktmpdir
|
76
|
+
cleanup = -> { FileUtils.remove_entry_secure(dest) }
|
77
|
+
if src
|
78
|
+
catcher = ExceptionCatcher.new
|
79
|
+
catcher.catch do
|
80
|
+
Tester.copy_visible_files(src, dest)
|
81
|
+
end
|
82
|
+
# if there is a problem copying files, cleanup and raise original exception
|
83
|
+
if catcher.exceptions?
|
84
|
+
catcher.catch do
|
85
|
+
cleanup.call
|
86
|
+
end
|
87
|
+
catcher.check
|
88
|
+
end
|
89
|
+
end
|
90
|
+
if block
|
91
|
+
begin
|
92
|
+
block.call(dest)
|
93
|
+
ensure
|
94
|
+
cleanup.call
|
95
|
+
end
|
96
|
+
else
|
97
|
+
@cleaners << cleanup
|
98
|
+
dest
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
# Redirects $stdin, $stdout, $stderr streams to the Tester instance
|
103
|
+
# * if called without block, streams are restored when after is called
|
104
|
+
# @param [Proc] block if block is defined, restores streams once the block ends
|
105
|
+
# @return self which is useful when catch_stdio is called with block because stdin, stdout and stderr are available after the block
|
106
|
+
# @example
|
107
|
+
# @tester.catch_stdio do
|
108
|
+
# puts "foo"
|
109
|
+
# end
|
110
|
+
# @tester.stdio.join == "foo\n"
|
111
|
+
#
|
112
|
+
# @see DummyIO, stdin, stdout, stderr
|
113
|
+
def catch_stdio(&block)
|
114
|
+
original_streams = [$stdin, $stdout, $stderr]
|
115
|
+
cleanup = -> { $stdin, $stdout, $stderr = original_streams }
|
116
|
+
stdin.clear
|
117
|
+
stdout.clear
|
118
|
+
stderr.clear
|
119
|
+
$stdin = stdin
|
120
|
+
$stdout = stdout
|
121
|
+
$stderr = stderr
|
122
|
+
if block
|
123
|
+
begin
|
124
|
+
block.call
|
125
|
+
ensure
|
126
|
+
cleanup.call
|
127
|
+
end
|
128
|
+
else
|
129
|
+
@cleaners << cleanup
|
130
|
+
end
|
131
|
+
self
|
132
|
+
end
|
133
|
+
|
134
|
+
# Changes working directory to target
|
135
|
+
# @param (String) dest target directory
|
136
|
+
# @param (Proc) block if block is defined, restores working directory after block ends
|
137
|
+
# @return (Object) if block is defined returns block's return value
|
138
|
+
# @example
|
139
|
+
# @tester.chdir(dest)
|
140
|
+
def chdir(dest, &block)
|
141
|
+
if block
|
142
|
+
Dir.chdir(dest, &block)
|
143
|
+
else
|
144
|
+
if !defined? @original_dir
|
145
|
+
@original_dir = Dir.pwd
|
146
|
+
@cleaners << -> { Dir.chdir(@original_dir); @original_dir=nil }
|
147
|
+
end
|
148
|
+
Dir.chdir(dest)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
def env(key, value)
|
153
|
+
current = ENV[key]
|
154
|
+
@cleaners << -> {ENV[key]=current}
|
155
|
+
ENV[key]=value
|
156
|
+
self
|
157
|
+
end
|
158
|
+
|
159
|
+
# Executes all pending cleanup operations
|
160
|
+
# * cleaners lists all procs that will be executed
|
161
|
+
# * all exceptions from procs are caught and raised together
|
162
|
+
# * Tester helper methods schedule cleanup operations to cleaners if needed
|
163
|
+
# @return [void]
|
164
|
+
# @example RSpec test
|
165
|
+
# describe "My tests" do
|
166
|
+
# before do
|
167
|
+
# @tester = Tester.new
|
168
|
+
# end
|
169
|
+
#
|
170
|
+
# after do
|
171
|
+
# @tester.after
|
172
|
+
# end
|
173
|
+
#
|
174
|
+
# it "should export files" do
|
175
|
+
# dest = @tester.tmpdir
|
176
|
+
# end
|
177
|
+
# end
|
178
|
+
#
|
179
|
+
# @example Tests can add their own cleanup procs. This reduces the need to write exception management in tests
|
180
|
+
# it "should combine ..." do
|
181
|
+
# dao = DAO.new
|
182
|
+
# @tester.cleaners << -> { dao.rollback }
|
183
|
+
# dao.do_something_that_does_not_cleanup_environment_and_might_raise_exception
|
184
|
+
# end
|
185
|
+
#
|
186
|
+
# @see ExceptionCatcher, cleaners
|
187
|
+
def after
|
188
|
+
catcher = ExceptionCatcher.new
|
189
|
+
@cleaners.each do |after_block|
|
190
|
+
catcher.catch do
|
191
|
+
after_block.call
|
192
|
+
end
|
193
|
+
end
|
194
|
+
@cleaners.clear
|
195
|
+
catcher.check
|
196
|
+
end
|
197
|
+
|
198
|
+
def clear?
|
199
|
+
@cleaners.empty?
|
200
|
+
end
|
201
|
+
|
202
|
+
def self.final_tester_check
|
203
|
+
catcher = ExceptionCatcher.new
|
204
|
+
$testers.each do |tester|
|
205
|
+
if !tester.clear?
|
206
|
+
puts "Tester#{tester.test_name ? " '#{tester.test_name}'" : ""} has not been cleared! Please add the missing .after() command. Clearing it automatically."
|
207
|
+
catcher.catch do
|
208
|
+
tester.after
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
catcher.check
|
213
|
+
end
|
214
|
+
|
215
|
+
# Copies contents of src to dest
|
216
|
+
# * excludes files and directories beginning with a '.'
|
217
|
+
# @param [String] src source directory path
|
218
|
+
# @param [String] dest destination directory path
|
219
|
+
# @return [String] dest directory
|
220
|
+
def self.copy_visible_files(src, dest)
|
221
|
+
Dir.glob(File.join(src, "**/*")).each do |file_src|
|
222
|
+
file_path = file_src[src.size+1..-1]
|
223
|
+
if File.file?(file_src)
|
224
|
+
FileUtils.cp(file_src, File.join(dest, file_path))
|
225
|
+
elsif File.directory?(file_src)
|
226
|
+
FileUtils.mkdir(File.join(dest, file_path))
|
227
|
+
end
|
228
|
+
end
|
229
|
+
dest
|
230
|
+
end
|
231
|
+
|
232
|
+
# Writes defined files to target directory
|
233
|
+
# * note: dest_root and target directories are automatically created
|
234
|
+
# @param [String] dest_root target directory path
|
235
|
+
# @param [Hash] files map of files and their contents
|
236
|
+
# @return [String] dest_root directory
|
237
|
+
# @example
|
238
|
+
# src = Tester.write_files(@tester.tmpdir, "file.txt" => "aa", "dir/my.txt" => "bb")
|
239
|
+
def self.write_files(dest_root, files={})
|
240
|
+
files.each_pair { |file_path, content|
|
241
|
+
dir = File.dirname(file_path)
|
242
|
+
if dir != "."
|
243
|
+
FileUtils.mkdir_p(File.join(dest_root, dir))
|
244
|
+
end
|
245
|
+
File.safe_write(File.join(dest_root, file_path), content)
|
246
|
+
}
|
247
|
+
dest_root
|
248
|
+
end
|
249
|
+
|
250
|
+
# Verifies that files exist in target directory.
|
251
|
+
# If files or directories are missing, contents are wrong, type is wrong or there are unwanted files raises an exception.
|
252
|
+
# @param [String] source_root target directory path
|
253
|
+
# @param [List] args containing check_for_extra_files and files map
|
254
|
+
# * check_for_extra_files, by default verify_files does not check if there are other files or directories. If set to true, raises an exception if there are other files
|
255
|
+
# * files, a map of file paths and contents. If file name ends with "/" or file contents are nil, path is a directory
|
256
|
+
# @return [Boolean] true if there were no errors
|
257
|
+
# @example
|
258
|
+
# @tester.verify_files(tmpdir, "file.txt" => "aa", "dir/my.txt" => "bb", "dir" => nil) # other files are ok
|
259
|
+
# @tester.verify_files(tmpdir, true, "file.txt" => "aa", "dir/my.txt" => "bb", "dir" => nil) # other files will fail
|
260
|
+
def self.verify_files(source_root, *args)
|
261
|
+
check_for_extra_files, files = args
|
262
|
+
if files.nil? && check_for_extra_files.kind_of?(Hash)
|
263
|
+
files = check_for_extra_files
|
264
|
+
check_for_extra_files = nil
|
265
|
+
end
|
266
|
+
files.each_pair do |file, contents|
|
267
|
+
file_path = File.join(source_root, file)
|
268
|
+
is_dir = file.end_with?("/") || contents.nil?
|
269
|
+
if !File.exists?(file_path)
|
270
|
+
raise "#{ is_dir ? "Directory" : "File"} '#{file_path}' is missing!"
|
271
|
+
end
|
272
|
+
if is_dir != File.directory?(file_path)
|
273
|
+
raise "Existing #{ is_dir ? "file" : "directory"} '#{file_path}' should be a #{ is_dir ? "directory" : "file"}!"
|
274
|
+
end
|
275
|
+
if !is_dir
|
276
|
+
file_contents = IO.read(file_path)
|
277
|
+
[contents].flatten.each do |o|
|
278
|
+
if o.kind_of?(Regexp)
|
279
|
+
if !file_contents.match(o)
|
280
|
+
raise "File '#{file_path}' does not match regexp #{o.inspect}, file contents: '#{file_contents}'"
|
281
|
+
end
|
282
|
+
elsif o.kind_of?(String)
|
283
|
+
if file_contents != o
|
284
|
+
raise "File '#{file_path}' is broken! Expected '#{o}' but was '#{file_contents}'"
|
285
|
+
end
|
286
|
+
elsif o.kind_of?(Proc)
|
287
|
+
if !o.call(file_contents)
|
288
|
+
raise "File '#{file_path}' did not pass test!"
|
289
|
+
end
|
290
|
+
else
|
291
|
+
raise "Unsupported checker! File '#{file_path}' object: #{o.inspect}"
|
292
|
+
end
|
293
|
+
end
|
294
|
+
end
|
295
|
+
end
|
296
|
+
if check_for_extra_files
|
297
|
+
files_and_dirs = {}
|
298
|
+
files.each_pair do |k, v|
|
299
|
+
file_arr=k.split("/")
|
300
|
+
c = file_arr.size
|
301
|
+
while c > 0
|
302
|
+
c -= 1
|
303
|
+
files_and_dirs[File.join(source_root, file_arr)]=true
|
304
|
+
file_arr.delete_at(-1)
|
305
|
+
end
|
306
|
+
end
|
307
|
+
Dir.glob(File.join(source_root, "**/*")).each do |file|
|
308
|
+
if !files_and_dirs[file]
|
309
|
+
raise "#{ File.directory?(file) ? "Directory" : "File"} '#{file}' exists, but it should not exist!"
|
310
|
+
end
|
311
|
+
end
|
312
|
+
end
|
313
|
+
end
|
314
|
+
|
315
|
+
# Dummy IO class that implements stream methods
|
316
|
+
# @see catch_stdio
|
317
|
+
class DummyIO < Array
|
318
|
+
def write(s)
|
319
|
+
self.<< s
|
320
|
+
end
|
321
|
+
end
|
322
|
+
end
|
323
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ki-repo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-12-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -91,26 +91,81 @@ dependencies:
|
|
91
91
|
- - ! '>='
|
92
92
|
- !ruby/object:Gem::Version
|
93
93
|
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: rdiscount
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: mocha
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
94
126
|
description: A generic repository for storing packages and metadata related to the
|
95
127
|
packages.
|
96
128
|
email:
|
97
|
-
executables:
|
129
|
+
executables:
|
130
|
+
- ki
|
98
131
|
extensions: []
|
99
132
|
extra_rdoc_files:
|
100
133
|
- LICENSE.txt
|
101
134
|
- README.md
|
102
135
|
files:
|
103
|
-
- .document
|
104
|
-
- .rspec
|
105
|
-
- Gemfile
|
106
|
-
- Gemfile.lock
|
107
136
|
- LICENSE.txt
|
108
137
|
- README.md
|
109
|
-
- Rakefile
|
110
138
|
- VERSION
|
111
|
-
-
|
112
|
-
-
|
113
|
-
-
|
139
|
+
- docs/backlog.md
|
140
|
+
- docs/development.md
|
141
|
+
- docs/development_setup.md
|
142
|
+
- docs/images/for_git.txt
|
143
|
+
- docs/ki_commands.md
|
144
|
+
- docs/repository_basics.md
|
145
|
+
- docs/writing_extensions.md
|
146
|
+
- lib/cmd/cmd.rb
|
147
|
+
- lib/cmd/user_pref_cmd.rb
|
148
|
+
- lib/cmd/version_cmd.rb
|
149
|
+
- lib/data_access/repository_finder.rb
|
150
|
+
- lib/data_access/repository_info.rb
|
151
|
+
- lib/data_access/version_helpers.rb
|
152
|
+
- lib/data_access/version_iterators.rb
|
153
|
+
- lib/data_access/version_operations.rb
|
154
|
+
- lib/data_storage/dir_base.rb
|
155
|
+
- lib/data_storage/ki_home.rb
|
156
|
+
- lib/data_storage/ki_json.rb
|
157
|
+
- lib/data_storage/repository.rb
|
158
|
+
- lib/data_storage/version_metadata.rb
|
159
|
+
- lib/ki_repo_all.rb
|
160
|
+
- lib/util/attr_chain.rb
|
161
|
+
- lib/util/exception_catcher.rb
|
162
|
+
- lib/util/hash.rb
|
163
|
+
- lib/util/hash_cache.rb
|
164
|
+
- lib/util/ruby_extensions.rb
|
165
|
+
- lib/util/service_registry.rb
|
166
|
+
- lib/util/simple_optparse.rb
|
167
|
+
- lib/util/test.rb
|
168
|
+
- bin/ki
|
114
169
|
homepage: http://github.com/mikko-apo/ki-repo
|
115
170
|
licenses:
|
116
171
|
- Apache License, Version 2.0
|
@@ -126,7 +181,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
126
181
|
version: '0'
|
127
182
|
segments:
|
128
183
|
- 0
|
129
|
-
hash:
|
184
|
+
hash: 1963502672638660453
|
130
185
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
131
186
|
none: false
|
132
187
|
requirements:
|
@@ -138,5 +193,6 @@ rubyforge_project:
|
|
138
193
|
rubygems_version: 1.8.24
|
139
194
|
signing_key:
|
140
195
|
specification_version: 3
|
141
|
-
summary: Repository for storing packages and metadata
|
196
|
+
summary: ! 'Repository for storing packages and metadata - note: not ready for any
|
197
|
+
kind of use'
|
142
198
|
test_files: []
|
data/.document
DELETED
data/.rspec
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
--color
|
data/Gemfile
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
source "http://rubygems.org"
|
2
|
-
# Add dependencies required to use your gem here.
|
3
|
-
# Example:
|
4
|
-
# gem "activesupport", ">= 2.3.5"
|
5
|
-
|
6
|
-
# Add dependencies to develop your gem here.
|
7
|
-
# Include everything needed to run rake, tests, features, etc.
|
8
|
-
group :development do
|
9
|
-
gem "rspec"
|
10
|
-
gem "yard"
|
11
|
-
gem "bundler"
|
12
|
-
gem "jeweler"
|
13
|
-
gem "simplecov"
|
14
|
-
end
|
data/Gemfile.lock
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
GEM
|
2
|
-
remote: http://rubygems.org/
|
3
|
-
specs:
|
4
|
-
diff-lcs (1.1.3)
|
5
|
-
git (1.2.5)
|
6
|
-
jeweler (1.8.4)
|
7
|
-
bundler (~> 1.0)
|
8
|
-
git (>= 1.2.5)
|
9
|
-
rake
|
10
|
-
rdoc
|
11
|
-
json (1.7.5)
|
12
|
-
multi_json (1.3.7)
|
13
|
-
rake (10.0.2)
|
14
|
-
rdoc (3.12)
|
15
|
-
json (~> 1.4)
|
16
|
-
rspec (2.12.0)
|
17
|
-
rspec-core (~> 2.12.0)
|
18
|
-
rspec-expectations (~> 2.12.0)
|
19
|
-
rspec-mocks (~> 2.12.0)
|
20
|
-
rspec-core (2.12.0)
|
21
|
-
rspec-expectations (2.12.0)
|
22
|
-
diff-lcs (~> 1.1.3)
|
23
|
-
rspec-mocks (2.12.0)
|
24
|
-
simplecov (0.7.1)
|
25
|
-
multi_json (~> 1.0)
|
26
|
-
simplecov-html (~> 0.7.1)
|
27
|
-
simplecov-html (0.7.1)
|
28
|
-
yard (0.8.3)
|
29
|
-
|
30
|
-
PLATFORMS
|
31
|
-
ruby
|
32
|
-
|
33
|
-
DEPENDENCIES
|
34
|
-
bundler
|
35
|
-
jeweler
|
36
|
-
rspec
|
37
|
-
simplecov
|
38
|
-
yard
|
data/Rakefile
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
require 'bundler'
|
5
|
-
begin
|
6
|
-
Bundler.setup(:default, :development)
|
7
|
-
rescue Bundler::BundlerError => e
|
8
|
-
$stderr.puts e.message
|
9
|
-
$stderr.puts "Run `bundle install` to install missing gems"
|
10
|
-
exit e.status_code
|
11
|
-
end
|
12
|
-
require 'rake'
|
13
|
-
|
14
|
-
require 'jeweler'
|
15
|
-
Jeweler::Tasks.new do |gem|
|
16
|
-
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
17
|
-
gem.name = "ki-repo"
|
18
|
-
gem.homepage = "http://github.com/mikko-apo/ki-repo"
|
19
|
-
gem.license = "Apache License, Version 2.0"
|
20
|
-
gem.summary = "Repository for storing packages and metadata."
|
21
|
-
gem.description = "A generic repository for storing packages and metadata related to the packages."
|
22
|
-
# gem.email = "mikko.apo@reaktor.fi"
|
23
|
-
gem.authors = ["Mikko Apo"]
|
24
|
-
# dependencies defined in Gemfile
|
25
|
-
end
|
26
|
-
Jeweler::RubygemsDotOrgTasks.new
|
27
|
-
|
28
|
-
require 'rspec/core'
|
29
|
-
require 'rspec/core/rake_task'
|
30
|
-
RSpec::Core::RakeTask.new(:spec) do |spec|
|
31
|
-
spec.pattern = FileList['spec/**/*_spec.rb']
|
32
|
-
end
|
33
|
-
|
34
|
-
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
35
|
-
spec.pattern = 'spec/**/*_spec.rb'
|
36
|
-
spec.rcov = true
|
37
|
-
end
|
38
|
-
|
39
|
-
task :default => :spec
|
40
|
-
|
41
|
-
require 'yard'
|
42
|
-
YARD::Rake::YardocTask.new
|
data/spec/ki-repo_spec.rb
DELETED
data/spec/spec_helper.rb
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
|
-
require 'rspec'
|
4
|
-
require 'ki-repo'
|
5
|
-
|
6
|
-
# Requires supporting files with custom matchers and macros, etc,
|
7
|
-
# in ./support/ and its subdirectories.
|
8
|
-
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
9
|
-
|
10
|
-
RSpec.configure do |config|
|
11
|
-
|
12
|
-
end
|