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.
@@ -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: