perobs 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -0,0 +1,7 @@
1
+ require 'rake'
2
+ require 'rspec/core/rake_task'
3
+
4
+ desc 'Run all RSpec tests in the spec directory'
5
+ RSpec::Core::RakeTask.new(:test) do |t|
6
+ t.pattern = 'test/*_spec.rb'
7
+ end
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: