makura 2009.05.27
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +340 -0
- data/COPYING +18 -0
- data/MANIFEST +42 -0
- data/README.md +41 -0
- data/Rakefile +32 -0
- data/bin/makura +12 -0
- data/example/blog.rb +50 -0
- data/example/couch/map/author_all.js +5 -0
- data/example/couch/map/author_posts.js +5 -0
- data/example/couch/map/post_all.js +5 -0
- data/example/couch/map/post_comments.js +5 -0
- data/example/couch/reduce/sum_length.js +7 -0
- data/lib/makura.rb +66 -0
- data/lib/makura/database.rb +216 -0
- data/lib/makura/design.rb +37 -0
- data/lib/makura/error.rb +14 -0
- data/lib/makura/http_methods.rb +19 -0
- data/lib/makura/layout.rb +64 -0
- data/lib/makura/model.rb +370 -0
- data/lib/makura/plugin/localize.rb +68 -0
- data/lib/makura/plugin/pager.rb +56 -0
- data/lib/makura/server.rb +203 -0
- data/lib/makura/uuid_cache.rb +23 -0
- data/lib/makura/version.rb +3 -0
- data/makura.gemspec +31 -0
- data/tasks/authors.rake +30 -0
- data/tasks/bacon.rake +66 -0
- data/tasks/changelog.rake +18 -0
- data/tasks/copyright.rake +21 -0
- data/tasks/gem.rake +22 -0
- data/tasks/gem_installer.rake +76 -0
- data/tasks/git.rake +46 -0
- data/tasks/grancher.rake +12 -0
- data/tasks/manifest.rake +4 -0
- data/tasks/metric_changes.rake +32 -0
- data/tasks/rcov.rake +23 -0
- data/tasks/release.rake +69 -0
- data/tasks/reversion.rake +8 -0
- data/tasks/todo.rake +27 -0
- data/tasks/traits.rake +21 -0
- data/tasks/yard.rake +4 -0
- data/tasks/ycov.rake +22 -0
- metadata +105 -0
data/tasks/gem.rake
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'rake/gempackagetask'
|
2
|
+
|
3
|
+
task :gemspec => [:manifest, :changelog] do
|
4
|
+
gemspec_file = "#{GEMSPEC.name}.gemspec"
|
5
|
+
File.open(gemspec_file, 'w+'){|gs| gs.puts(GEMSPEC.to_ruby) }
|
6
|
+
end
|
7
|
+
|
8
|
+
desc "package and install from gemspec"
|
9
|
+
task :install => [:gemspec] do
|
10
|
+
sh "gem build #{GEMSPEC.name}.gemspec"
|
11
|
+
sh "gem install #{GEMSPEC.name}-#{GEMSPEC.version}.gem"
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "uninstall the gem"
|
15
|
+
task :uninstall => [:clean] do
|
16
|
+
sh %{gem uninstall -x #{GEMSPEC.name}}
|
17
|
+
end
|
18
|
+
|
19
|
+
Rake::GemPackageTask.new(GEMSPEC) do |p|
|
20
|
+
p.need_tar = true
|
21
|
+
p.need_zip = true
|
22
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
task :gem_installer do
|
2
|
+
class GemInstaller
|
3
|
+
def initialize(options = {}, &block)
|
4
|
+
@gems = []
|
5
|
+
@options = options
|
6
|
+
|
7
|
+
run(&block)
|
8
|
+
end
|
9
|
+
|
10
|
+
def run(&block)
|
11
|
+
instance_eval(&block) if block_given?
|
12
|
+
end
|
13
|
+
|
14
|
+
def gem(name, version = nil, options = {})
|
15
|
+
if version.respond_to?(:merge!)
|
16
|
+
options = version
|
17
|
+
else
|
18
|
+
options[:version] = version
|
19
|
+
end
|
20
|
+
|
21
|
+
@gems << [name, options]
|
22
|
+
end
|
23
|
+
|
24
|
+
def setup_gemspec(gemspec)
|
25
|
+
gemspec.dependencies.each do |dependency|
|
26
|
+
dependency.version_requirements.as_list.each do |version|
|
27
|
+
gem(dependency.name, version)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
setup
|
32
|
+
end
|
33
|
+
|
34
|
+
def setup
|
35
|
+
require 'rubygems'
|
36
|
+
require 'rubygems/dependency_installer'
|
37
|
+
|
38
|
+
@gems.each do |name, options|
|
39
|
+
setup_gem(name, options)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def setup_gem(name, options, try_install = true)
|
44
|
+
print "activating #{name} ... "
|
45
|
+
Gem.activate(name, *[options[:version]].compact)
|
46
|
+
require(options[:lib] || name)
|
47
|
+
puts "success."
|
48
|
+
rescue LoadError => error
|
49
|
+
puts error
|
50
|
+
install_gem(name, options) if try_install
|
51
|
+
setup_gem(name, options, try_install = false)
|
52
|
+
end
|
53
|
+
|
54
|
+
def install_gem(name, options)
|
55
|
+
installer = Gem::DependencyInstaller.new(options)
|
56
|
+
|
57
|
+
temp_argv(options[:extconf]) do
|
58
|
+
print "Installing #{name} ... "
|
59
|
+
installer.install(name, options[:version])
|
60
|
+
puts "done."
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def temp_argv(extconf)
|
65
|
+
if extconf ||= @options[:extconf]
|
66
|
+
old_argv = ARGV.clone
|
67
|
+
ARGV.replace(extconf.split(' '))
|
68
|
+
end
|
69
|
+
|
70
|
+
yield
|
71
|
+
|
72
|
+
ensure
|
73
|
+
ARGV.replace(old_argv) if extconf
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
data/tasks/git.rake
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
namespace :git do
|
2
|
+
task :anon do
|
3
|
+
sh 'git config remote.origin.url git://github.com/manveru/ramaze'
|
4
|
+
puts "You're now accessing ramaze anonymous"
|
5
|
+
end
|
6
|
+
|
7
|
+
task :committer do
|
8
|
+
sh 'git config remote.origin.url git@github.com:manveru/ramaze'
|
9
|
+
puts "You're now accessing ramaze as committer"
|
10
|
+
end
|
11
|
+
|
12
|
+
desc 'Update from repository'
|
13
|
+
task :update do
|
14
|
+
puts "Putting your changes on stash"
|
15
|
+
sh 'git stash'
|
16
|
+
|
17
|
+
branch = `git branch`[/^\*\s+(.*)/, 1]
|
18
|
+
puts "Current branch is #{branch}"
|
19
|
+
|
20
|
+
if switch = branch != 'master'
|
21
|
+
puts "Switching to master branch"
|
22
|
+
sh 'git checkout master'
|
23
|
+
end
|
24
|
+
|
25
|
+
if switch
|
26
|
+
puts "Switching to #{branch} branch"
|
27
|
+
sh "git checkout '#{branch}'"
|
28
|
+
end
|
29
|
+
|
30
|
+
sh 'git stash apply'
|
31
|
+
end
|
32
|
+
|
33
|
+
desc 'Create patch files to send'
|
34
|
+
task :send do
|
35
|
+
sh 'git format-patch ^HEAD'
|
36
|
+
end
|
37
|
+
|
38
|
+
desc "show some stats about patches"
|
39
|
+
task :patchflow do
|
40
|
+
patches = `git rev-list HEAD | wc -l`.to_i
|
41
|
+
puts "currently we have #{patches} patches"
|
42
|
+
init = Time.parse("Sat Oct 14 04:22:49 JST 2006")
|
43
|
+
days = (Time.now - init) / (3600 * 24)
|
44
|
+
puts "%d days since init, avg %4.2f patches per day" % [days, patches/days]
|
45
|
+
end
|
46
|
+
end
|
data/tasks/grancher.rake
ADDED
data/tasks/manifest.rake
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
namespace :metric do
|
2
|
+
desc 'committed changes per file according to git'
|
3
|
+
task 'changes' do
|
4
|
+
$stdout.sync = true
|
5
|
+
out = lambda{|changes, rb| puts("%4d %s" % [changes, rb]) }
|
6
|
+
changes = {}
|
7
|
+
|
8
|
+
print 'counting changes '
|
9
|
+
|
10
|
+
Dir.glob 'lib/**/*.rb' do |rb|
|
11
|
+
count = `git log --pretty=oneline '#{rb}'`.count("\n")
|
12
|
+
print '.'
|
13
|
+
# out[changes, rb]
|
14
|
+
changes[rb] = count
|
15
|
+
end
|
16
|
+
puts ' done.'
|
17
|
+
|
18
|
+
sorted = changes.sort_by{|r,c| c }.reverse
|
19
|
+
|
20
|
+
top = sorted.first(20)
|
21
|
+
unless top.empty?
|
22
|
+
puts "Top 20:"
|
23
|
+
top.each{|(r,c)| out[c,r] }
|
24
|
+
end
|
25
|
+
|
26
|
+
bottom = sorted.last(20) - top
|
27
|
+
unless bottom.empty?
|
28
|
+
puts "Bottom 20:"
|
29
|
+
bottom.each{|(r,c)| out[c,r] }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/tasks/rcov.rake
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
desc 'code coverage'
|
2
|
+
task :rcov => :clean do
|
3
|
+
specs = PROJECT_SPECS
|
4
|
+
|
5
|
+
ignore = %w[ gem rack bacon innate hpricot nagoro/lib/nagoro ]
|
6
|
+
|
7
|
+
if RUBY_VERSION >= '1.8.7'
|
8
|
+
ignore << 'begin_with' << 'end_with'
|
9
|
+
end
|
10
|
+
if RUBY_VERSION < '1.9'
|
11
|
+
ignore << 'fiber'
|
12
|
+
end
|
13
|
+
|
14
|
+
ignored = ignore.join(',')
|
15
|
+
|
16
|
+
cmd = "rcov --aggregate coverage.data --sort coverage -t --%s -x '#{ignored}' %s"
|
17
|
+
|
18
|
+
while spec = specs.shift
|
19
|
+
puts '', "Gather coverage for #{spec} ..."
|
20
|
+
html = specs.empty? ? 'html' : 'no-html'
|
21
|
+
sh(cmd % [html, spec])
|
22
|
+
end
|
23
|
+
end
|
data/tasks/release.rake
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
namespace :release do
|
2
|
+
task :all => [:release_github, :release_rubyforge]
|
3
|
+
|
4
|
+
desc 'Display instructions to release on github'
|
5
|
+
task :github => [:reversion, :gemspec] do
|
6
|
+
name, version = GEMSPEC.name, GEMSPEC.version
|
7
|
+
|
8
|
+
puts <<INSTRUCTIONS
|
9
|
+
First add the relevant files:
|
10
|
+
|
11
|
+
git add MANIFEST CHANGELOG #{name}.gemspec lib/#{name}/version.rb
|
12
|
+
|
13
|
+
Then commit them, tag the commit, and push:
|
14
|
+
|
15
|
+
git commit -m 'Version #{version}'
|
16
|
+
git tag -a -m '#{version}' '#{version}'
|
17
|
+
git push
|
18
|
+
|
19
|
+
INSTRUCTIONS
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
# TODO: Not tested
|
24
|
+
desc 'Display instructions to release on rubyforge'
|
25
|
+
task :rubyforge => [:reversion, :gemspec, :package] do
|
26
|
+
name, version = GEMSPEC.name, GEMSPEC.version
|
27
|
+
|
28
|
+
puts <<INSTRUCTIONS
|
29
|
+
To publish to rubyforge do following:
|
30
|
+
|
31
|
+
rubyforge login
|
32
|
+
rubyforge add_release #{name} #{name} #{version} pkg/#{name}-#{version}.gem
|
33
|
+
|
34
|
+
After you have done these steps, see:
|
35
|
+
|
36
|
+
rake release:rubyforge_archives
|
37
|
+
|
38
|
+
INSTRUCTIONS
|
39
|
+
end
|
40
|
+
|
41
|
+
desc 'Display instructions to add archives after release:rubyforge'
|
42
|
+
task :rubyforge_archives do
|
43
|
+
release_id = latest_release_id
|
44
|
+
|
45
|
+
puts "Adding archives for distro packagers is:", ""
|
46
|
+
|
47
|
+
Dir["pkg/#{name}-#{version}.{gz,zip}"].each do |file|
|
48
|
+
puts "rubyforge add_file #{name} #{name} #{release_id} '#{file}'"
|
49
|
+
end
|
50
|
+
|
51
|
+
puts
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Use URI and proper XPATH, something along these lines:
|
56
|
+
#
|
57
|
+
# a = doc.at('a[@href=~"release_id"]')[:href]
|
58
|
+
# release_id = URI(a).query[/release_id=(\w+)/, 1]
|
59
|
+
def latest_release_id
|
60
|
+
require 'open-uri'
|
61
|
+
require 'hpricot'
|
62
|
+
|
63
|
+
url = "http://rubyforge.org/frs/?group_id=#{PROJECT_RUBYFORGE_GROUP_ID}"
|
64
|
+
doc = Hpricot(open(url))
|
65
|
+
a = (doc/:a).find{|a| a[:href] =~ /release_id/}
|
66
|
+
|
67
|
+
version = a.inner_html
|
68
|
+
release_id = Hash[*a[:href].split('?').last.split('=').flatten]['release_id']
|
69
|
+
end
|
data/tasks/todo.rake
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
desc "show a todolist from all the TODO tags in the source"
|
2
|
+
task :todo do
|
3
|
+
Dir.glob '{lib,spec}/**/*.rb' do |file|
|
4
|
+
lastline = todo = comment = long_comment = false
|
5
|
+
|
6
|
+
File.readlines(file).each_with_index do |line, lineno|
|
7
|
+
lineno += 1
|
8
|
+
comment = line =~ /^\s*?#.*?$/
|
9
|
+
long_comment = line =~ /^=begin/
|
10
|
+
long_comment = line =~ /^=end/
|
11
|
+
todo = true if line =~ /TODO/ and (long_comment or comment)
|
12
|
+
todo = false if line.gsub('#', '').strip.empty?
|
13
|
+
todo = false unless comment or long_comment
|
14
|
+
if todo
|
15
|
+
unless lastline and lastline + 1 == lineno
|
16
|
+
puts
|
17
|
+
puts "vim #{file} +#{lineno}"
|
18
|
+
end
|
19
|
+
|
20
|
+
l = line.strip.gsub(/^#\s*/, '')
|
21
|
+
print ' ' unless l =~ /^-/
|
22
|
+
puts l
|
23
|
+
lastline = lineno
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/tasks/traits.rake
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
desc 'listing of available traits per class/module'
|
2
|
+
task 'traits' do
|
3
|
+
nodes = Hash.new{|h,k| h[k] = []}
|
4
|
+
Dir['lib/**/*.rb'].each do |file|
|
5
|
+
content = File.read(file)
|
6
|
+
traits = content.grep(/^\s*trait\s*:/)
|
7
|
+
traits.each do |trait|
|
8
|
+
space = content[0..content.index(trait)].scan(/^\s*(?:class|module)\s+(.*)$/)
|
9
|
+
space = space.flatten.join('::')
|
10
|
+
nodes[space] << trait.strip
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
nodes.each do |space, traits|
|
15
|
+
puts space
|
16
|
+
traits.each do |trait|
|
17
|
+
print ' ', trait, "\n"
|
18
|
+
end
|
19
|
+
puts
|
20
|
+
end
|
21
|
+
end
|
data/tasks/yard.rake
ADDED
data/tasks/ycov.rake
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
begin
|
2
|
+
require 'yard'
|
3
|
+
|
4
|
+
task :ycov => ['.yardoc'] do
|
5
|
+
YARD::Registry.load_yardoc
|
6
|
+
code_objects = YARD::Registry.paths.map{|path| YARD::Registry.at(path) }
|
7
|
+
without_doc, with_doc = code_objects.partition{|obj| obj.docstring.empty? }
|
8
|
+
|
9
|
+
documented = with_doc.size
|
10
|
+
undocumented = without_doc.size
|
11
|
+
total = documented + undocumented
|
12
|
+
percentage = (documented / 0.01) / total
|
13
|
+
|
14
|
+
puts "Documentation coverage is %d/%d (%3.1f%%)" % [documented, total, percentage]
|
15
|
+
end
|
16
|
+
|
17
|
+
file '.yardoc' => FileList['lib/**/*.rb'] do
|
18
|
+
files = ['lib/**/*.rb']
|
19
|
+
options = ['--no-output', '--private']
|
20
|
+
YARD::CLI::Yardoc.run(*(options + files))
|
21
|
+
end
|
22
|
+
end
|
metadata
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: makura
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2009.05.27
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Michael 'manveru' Fellinger
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-05-27 00:00:00 +09:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rest-client
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.8.1
|
24
|
+
version:
|
25
|
+
description:
|
26
|
+
email: m.fellinger@gmail.com
|
27
|
+
executables:
|
28
|
+
- makura
|
29
|
+
extensions: []
|
30
|
+
|
31
|
+
extra_rdoc_files: []
|
32
|
+
|
33
|
+
files:
|
34
|
+
- CHANGELOG
|
35
|
+
- COPYING
|
36
|
+
- MANIFEST
|
37
|
+
- README.md
|
38
|
+
- Rakefile
|
39
|
+
- bin/makura
|
40
|
+
- example/blog.rb
|
41
|
+
- example/couch/map/author_all.js
|
42
|
+
- example/couch/map/author_posts.js
|
43
|
+
- example/couch/map/post_all.js
|
44
|
+
- example/couch/map/post_comments.js
|
45
|
+
- example/couch/reduce/sum_length.js
|
46
|
+
- lib/makura.rb
|
47
|
+
- lib/makura/database.rb
|
48
|
+
- lib/makura/design.rb
|
49
|
+
- lib/makura/error.rb
|
50
|
+
- lib/makura/http_methods.rb
|
51
|
+
- lib/makura/layout.rb
|
52
|
+
- lib/makura/model.rb
|
53
|
+
- lib/makura/plugin/localize.rb
|
54
|
+
- lib/makura/plugin/pager.rb
|
55
|
+
- lib/makura/server.rb
|
56
|
+
- lib/makura/uuid_cache.rb
|
57
|
+
- lib/makura/version.rb
|
58
|
+
- makura.gemspec
|
59
|
+
- tasks/authors.rake
|
60
|
+
- tasks/bacon.rake
|
61
|
+
- tasks/changelog.rake
|
62
|
+
- tasks/copyright.rake
|
63
|
+
- tasks/gem.rake
|
64
|
+
- tasks/gem_installer.rake
|
65
|
+
- tasks/git.rake
|
66
|
+
- tasks/grancher.rake
|
67
|
+
- tasks/manifest.rake
|
68
|
+
- tasks/metric_changes.rake
|
69
|
+
- tasks/rcov.rake
|
70
|
+
- tasks/release.rake
|
71
|
+
- tasks/reversion.rake
|
72
|
+
- tasks/todo.rake
|
73
|
+
- tasks/traits.rake
|
74
|
+
- tasks/yard.rake
|
75
|
+
- tasks/ycov.rake
|
76
|
+
has_rdoc: true
|
77
|
+
homepage: http://github.com/manveru/makura
|
78
|
+
licenses: []
|
79
|
+
|
80
|
+
post_install_message:
|
81
|
+
rdoc_options: []
|
82
|
+
|
83
|
+
require_paths:
|
84
|
+
- lib
|
85
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: "0"
|
90
|
+
version:
|
91
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: "0"
|
96
|
+
version:
|
97
|
+
requirements: []
|
98
|
+
|
99
|
+
rubyforge_project:
|
100
|
+
rubygems_version: 1.3.3
|
101
|
+
signing_key:
|
102
|
+
specification_version: 3
|
103
|
+
summary: Ruby wrapper around the CouchDB REST API.
|
104
|
+
test_files: []
|
105
|
+
|