perobs 0.0.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.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +113 -0
- data/Rakefile +22 -0
- data/lib/perobs/Array.rb +173 -0
- data/lib/perobs/BlockDB.rb +242 -0
- data/lib/perobs/Cache.rb +201 -0
- data/lib/perobs/DataBase.rb +115 -0
- data/lib/perobs/FileSystemDB.rb +171 -0
- data/lib/perobs/Hash.rb +175 -0
- data/lib/perobs/HashedBlocksDB.rb +153 -0
- data/lib/perobs/Object.rb +189 -0
- data/lib/perobs/ObjectBase.rb +159 -0
- data/lib/perobs/Store.rb +290 -0
- data/lib/perobs/version.rb +4 -0
- data/lib/perobs.rb +29 -0
- data/perobs.gemspec +23 -0
- data/spec/Array_spec.rb +94 -0
- data/spec/FileSystemDB_spec.rb +107 -0
- data/spec/Hash_spec.rb +96 -0
- data/spec/Object_spec.rb +108 -0
- data/spec/Store_spec.rb +412 -0
- data/spec/perobs_spec.rb +155 -0
- data/tasks/changelog.rake +169 -0
- data/tasks/gem.rake +50 -0
- data/tasks/rdoc.rake +14 -0
- data/tasks/test.rake +7 -0
- metadata +121 -0
@@ -0,0 +1,169 @@
|
|
1
|
+
require 'time'
|
2
|
+
|
3
|
+
desc 'Generate the CHANGELOG file'
|
4
|
+
task :changelog do
|
5
|
+
|
6
|
+
class Entry
|
7
|
+
|
8
|
+
attr_reader :type
|
9
|
+
|
10
|
+
def initialize(ref, author, time, message)
|
11
|
+
@ref = ref
|
12
|
+
@author = author
|
13
|
+
@time = time
|
14
|
+
@message = message
|
15
|
+
if (m = /New: (.*)/.match(@message))
|
16
|
+
@type = :feature
|
17
|
+
@message = m[1]
|
18
|
+
elsif (m = /Fix: (.*)/.match(@message))
|
19
|
+
@type = :bugfix
|
20
|
+
@message = m[1]
|
21
|
+
else
|
22
|
+
@type = :other
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_s
|
27
|
+
" * #{@message}\n"
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
class Release
|
33
|
+
|
34
|
+
attr_reader :date, :version, :tag
|
35
|
+
|
36
|
+
def initialize(tag, predecessor)
|
37
|
+
@tag = tag
|
38
|
+
# We only support release tags in the form X.X.X
|
39
|
+
@version = /\d+\.\d+\.\d+/.match(tag)
|
40
|
+
|
41
|
+
# Construct a Git range.
|
42
|
+
interval = predecessor ? "#{predecessor.tag}..#{@tag}" : @tag
|
43
|
+
|
44
|
+
# Get the date of the release
|
45
|
+
date = Time.parse(/Date: (.*)/.match(`git show #{tag}`)[1]).utc
|
46
|
+
@date = date.strftime("%Y-%m-%d")
|
47
|
+
|
48
|
+
@entries = []
|
49
|
+
# Use -z option for git-log to get 0 bytes as separators.
|
50
|
+
`git log -z #{interval}`.split("\0").each do |commit|
|
51
|
+
# We ignore merges.
|
52
|
+
next if commit =~ /^Merge: \d*/
|
53
|
+
|
54
|
+
ref, author, time, _, message = commit.split("\n", 5)
|
55
|
+
ref = ref[/commit ([0-9a-f]+)/, 1]
|
56
|
+
author = author[/Author: (.*)/, 1].strip
|
57
|
+
time = Time.parse(time[/Date: (.*)/, 1]).utc
|
58
|
+
# Eleminate git-svn-id: lines
|
59
|
+
message.gsub!(/git-svn-id: .*\n/, '')
|
60
|
+
# Eliminate Signed-off-by: lines
|
61
|
+
message.gsub!(/Signed-off-by: .*\n/, '')
|
62
|
+
message.strip!
|
63
|
+
@entries << Entry.new(ref, author, time, message)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def empty?
|
68
|
+
@entries.empty?
|
69
|
+
end
|
70
|
+
|
71
|
+
def to_s
|
72
|
+
s = ''
|
73
|
+
if hasFeatures? || hasFixes?
|
74
|
+
if hasFeatures?
|
75
|
+
s << "== New Features\n\n"
|
76
|
+
@entries.each do |entry|
|
77
|
+
s << entry.to_s if entry.type == :feature
|
78
|
+
end
|
79
|
+
s << "\n"
|
80
|
+
end
|
81
|
+
if hasFixes?
|
82
|
+
s << "== Bug Fixes\n\n"
|
83
|
+
@entries.each do |entry|
|
84
|
+
s << entry.to_s if entry.type == :bugfix
|
85
|
+
end
|
86
|
+
s << "\n"
|
87
|
+
end
|
88
|
+
else
|
89
|
+
@entries.each do |entry|
|
90
|
+
s << entry.to_s
|
91
|
+
end
|
92
|
+
end
|
93
|
+
s
|
94
|
+
end
|
95
|
+
|
96
|
+
private
|
97
|
+
|
98
|
+
def hasFeatures?
|
99
|
+
@entries.each do |entry|
|
100
|
+
return true if entry.type == :feature
|
101
|
+
end
|
102
|
+
false
|
103
|
+
end
|
104
|
+
|
105
|
+
def hasFixes?
|
106
|
+
@entries.each do |entry|
|
107
|
+
return true if entry.type == :bugfix
|
108
|
+
end
|
109
|
+
false
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
class ChangeLog
|
115
|
+
|
116
|
+
def initialize
|
117
|
+
@releases = []
|
118
|
+
predecessor = nil
|
119
|
+
getReleaseVersions.each do |version|
|
120
|
+
@releases << (predecessor = Release.new(version, predecessor))
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def to_s
|
125
|
+
s = ''
|
126
|
+
@releases.reverse.each do |release|
|
127
|
+
next if release.empty?
|
128
|
+
|
129
|
+
# We use RDOC markup syntax to generate a title
|
130
|
+
if release.version
|
131
|
+
s << "= Release #{release.version} (#{release.date})\n\n"
|
132
|
+
else
|
133
|
+
s << "= Next Release (Some Day)\n\n"
|
134
|
+
end
|
135
|
+
s << release.to_s + "\n"
|
136
|
+
end
|
137
|
+
s
|
138
|
+
end
|
139
|
+
|
140
|
+
private
|
141
|
+
|
142
|
+
# 'git tag' is not sorted numerically. This function implements a
|
143
|
+
# numerical comparison for tag versions of the format 'release-X.X.X'. X
|
144
|
+
# can be a multi-digit number.
|
145
|
+
def compareTags(a, b)
|
146
|
+
|
147
|
+
def versionToComparable(v)
|
148
|
+
/\d+\.\d+\.\d+/.match(v)[0].split('.').map{ |l| sprintf("%03d", l.to_i)}.
|
149
|
+
join('.')
|
150
|
+
end
|
151
|
+
|
152
|
+
versionToComparable(a) <=> versionToComparable(b)
|
153
|
+
end
|
154
|
+
|
155
|
+
def getReleaseVersions
|
156
|
+
# Get list of release tags from Git repository
|
157
|
+
releaseVersions = `git tag`.split("\n").map { |r| r.chomp }.
|
158
|
+
delete_if { |r| ! (/release-\d+\.\d+\.\d+/ =~ r) }.
|
159
|
+
sort{ |a, b| compareTags(a, b) }
|
160
|
+
releaseVersions << 'HEAD'
|
161
|
+
end
|
162
|
+
|
163
|
+
end
|
164
|
+
|
165
|
+
File.open('CHANGELOG', 'w+') do |changelog|
|
166
|
+
changelog.puts ChangeLog.new.to_s
|
167
|
+
end
|
168
|
+
|
169
|
+
end
|
data/tasks/gem.rake
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# GEM TASK
|
2
|
+
require 'find'
|
3
|
+
require 'rubygems'
|
4
|
+
require 'rubygems/package'
|
5
|
+
|
6
|
+
# Unfortunately Rake::GemPackageTest cannot deal with files that are generated
|
7
|
+
# by Rake targets. So we have to write our own packaging task.
|
8
|
+
desc 'Build the gem package'
|
9
|
+
task :gem => [:clobber] do
|
10
|
+
Rake::Task[:changelog].invoke
|
11
|
+
Rake::Task[:permissions].invoke
|
12
|
+
|
13
|
+
# Build the gem file according to the loaded spec.
|
14
|
+
if RUBY_VERSION >= "2.0.0"
|
15
|
+
Gem::Package.build(GEM_SPEC)
|
16
|
+
else
|
17
|
+
Gem::Builder.new(GEM_SPEC).build
|
18
|
+
end
|
19
|
+
pkgBase = "#{GEM_SPEC.name}-#{GEM_SPEC.version}"
|
20
|
+
# Create a pkg directory if it doesn't exist already.
|
21
|
+
FileUtils.mkdir_p('pkg')
|
22
|
+
# Move the gem file into the pkg directory.
|
23
|
+
verbose(true) { FileUtils.mv("#{pkgBase}.gem", "pkg/#{pkgBase}.gem")}
|
24
|
+
end
|
25
|
+
|
26
|
+
desc 'Make sure all files and directories are readable'
|
27
|
+
task :permissions do
|
28
|
+
# Find the bin and test directories relative to this file.
|
29
|
+
baseDir = File.expand_path('..', File.dirname(__FILE__))
|
30
|
+
|
31
|
+
execs = Dir.glob("#{baseDir}/bin/*") +
|
32
|
+
Dir.glob("#{baseDir}/test/**/genrefs")
|
33
|
+
|
34
|
+
Find.find(baseDir) do |f|
|
35
|
+
# Ignore the whoke pkg directory as it may contain links to the other
|
36
|
+
# directories.
|
37
|
+
next if Regexp.new("#{baseDir}/pkg/*").match(f)
|
38
|
+
|
39
|
+
FileUtils.chmod_R((FileTest.directory?(f) ||
|
40
|
+
execs.include?(f) ? 0755 : 0644), f)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
desc 'Run all tests and build scripts and create the gem package'
|
45
|
+
task :release do
|
46
|
+
Rake::Task[:test].invoke
|
47
|
+
Rake::Task[:yard].invoke
|
48
|
+
Rake::Task[:gem].invoke
|
49
|
+
end
|
50
|
+
|
data/tasks/rdoc.rake
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
if RUBY_VERSION < '1.9.3'
|
2
|
+
require 'rake/rdoctask'
|
3
|
+
else
|
4
|
+
require 'rdoc/task'
|
5
|
+
end
|
6
|
+
|
7
|
+
# RDOC TASK
|
8
|
+
Rake::RDocTask.new(:rdoc) do |t|
|
9
|
+
t.rdoc_files = %w( README.rdoc COPYING CHANGELOG ) +
|
10
|
+
`git ls-files -- lib`.split("\n")
|
11
|
+
t.title = "TaskJuggler API documentation"
|
12
|
+
t.main = 'README.rdoc'
|
13
|
+
t.rdoc_dir = 'doc'
|
14
|
+
end
|
data/tasks/test.rake
ADDED
metadata
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: perobs
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Chris Schlaeger
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-05-29 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.6'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.6'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: yard
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.8.7
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.8.7
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '10.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '10.0'
|
55
|
+
description: Library to provide a persistent object store
|
56
|
+
email:
|
57
|
+
- chris@linux.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- .gitignore
|
63
|
+
- Gemfile
|
64
|
+
- LICENSE.txt
|
65
|
+
- README.md
|
66
|
+
- Rakefile
|
67
|
+
- lib/perobs.rb
|
68
|
+
- lib/perobs/Array.rb
|
69
|
+
- lib/perobs/BlockDB.rb
|
70
|
+
- lib/perobs/Cache.rb
|
71
|
+
- lib/perobs/DataBase.rb
|
72
|
+
- lib/perobs/FileSystemDB.rb
|
73
|
+
- lib/perobs/Hash.rb
|
74
|
+
- lib/perobs/HashedBlocksDB.rb
|
75
|
+
- lib/perobs/Object.rb
|
76
|
+
- lib/perobs/ObjectBase.rb
|
77
|
+
- lib/perobs/Store.rb
|
78
|
+
- lib/perobs/version.rb
|
79
|
+
- perobs.gemspec
|
80
|
+
- spec/Array_spec.rb
|
81
|
+
- spec/FileSystemDB_spec.rb
|
82
|
+
- spec/Hash_spec.rb
|
83
|
+
- spec/Object_spec.rb
|
84
|
+
- spec/Store_spec.rb
|
85
|
+
- spec/perobs_spec.rb
|
86
|
+
- tasks/changelog.rake
|
87
|
+
- tasks/gem.rake
|
88
|
+
- tasks/rdoc.rake
|
89
|
+
- tasks/test.rake
|
90
|
+
homepage: https://github.com/scrapper/perobs
|
91
|
+
licenses:
|
92
|
+
- MIT
|
93
|
+
metadata: {}
|
94
|
+
post_install_message:
|
95
|
+
rdoc_options: []
|
96
|
+
require_paths:
|
97
|
+
- lib
|
98
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
|
+
requirements:
|
105
|
+
- - '>='
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: '0'
|
108
|
+
requirements: []
|
109
|
+
rubyforge_project:
|
110
|
+
rubygems_version: 2.0.3
|
111
|
+
signing_key:
|
112
|
+
specification_version: 4
|
113
|
+
summary: Persistent Ruby Object Store
|
114
|
+
test_files:
|
115
|
+
- spec/Array_spec.rb
|
116
|
+
- spec/FileSystemDB_spec.rb
|
117
|
+
- spec/Hash_spec.rb
|
118
|
+
- spec/Object_spec.rb
|
119
|
+
- spec/Store_spec.rb
|
120
|
+
- spec/perobs_spec.rb
|
121
|
+
has_rdoc:
|