couchobject 0.0.1 → 0.5.0
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/History.txt +11 -1
- data/Manifest.txt +9 -0
- data/README.txt +22 -0
- data/TODO +1 -5
- data/bin/couch_ruby_view_requestor +81 -0
- data/config/hoe.rb +2 -1
- data/lib/couch_object.rb +3 -0
- data/lib/couch_object/database.rb +18 -2
- data/lib/couch_object/proc_condition.rb +14 -0
- data/lib/couch_object/version.rb +2 -2
- data/script/txt2html +74 -0
- data/spec/database_spec.rb +29 -0
- data/spec/integration/database_integration_spec.rb +13 -0
- data/spec/proc_condition_spec.rb +26 -0
- data/tasks/website.rake +15 -7
- data/website/index.html +93 -0
- data/website/index.txt +37 -0
- data/website/javascripts/rounded_corners_lite.inc.js +285 -0
- data/website/stylesheets/screen.css +138 -0
- data/website/template.rhtml +48 -0
- metadata +23 -4
data/History.txt
CHANGED
@@ -1,4 +1,14 @@
|
|
1
|
-
== 0.0
|
1
|
+
== 0.5.0 2007-09-15
|
2
|
+
|
3
|
+
* 1 major enhancement:
|
4
|
+
* Database.filter{|doc| } for filtering the on doc, in Ruby!
|
5
|
+
* couch_ruby_view_requestor, a JsServer client for CouchDb allowing you to query in Ruby
|
6
|
+
|
7
|
+
* 1 minor enhancement:
|
8
|
+
* Added Database#store(document), the parallel of Document#save(database)
|
9
|
+
|
10
|
+
|
11
|
+
== 0.0.1 2007-09-13
|
2
12
|
|
3
13
|
* 1 major enhancement:
|
4
14
|
* Initial release
|
data/Manifest.txt
CHANGED
@@ -4,6 +4,7 @@ Manifest.txt
|
|
4
4
|
README.txt
|
5
5
|
Rakefile
|
6
6
|
TODO
|
7
|
+
bin/couch_ruby_view_requestor
|
7
8
|
config/hoe.rb
|
8
9
|
config/requirements.rb
|
9
10
|
lib/couch_object.rb
|
@@ -11,6 +12,7 @@ lib/couch_object/database.rb
|
|
11
12
|
lib/couch_object/document.rb
|
12
13
|
lib/couch_object/model.rb
|
13
14
|
lib/couch_object/persistable.rb
|
15
|
+
lib/couch_object/proc_condition.rb
|
14
16
|
lib/couch_object/response.rb
|
15
17
|
lib/couch_object/server.rb
|
16
18
|
lib/couch_object/utils.rb
|
@@ -20,6 +22,7 @@ log/debug.log
|
|
20
22
|
script/console
|
21
23
|
script/destroy
|
22
24
|
script/generate
|
25
|
+
script/txt2html
|
23
26
|
setup.rb
|
24
27
|
spec/database_spec.rb
|
25
28
|
spec/document_spec.rb
|
@@ -28,6 +31,7 @@ spec/integration/document_integration_spec.rb
|
|
28
31
|
spec/integration/integration_helper.rb
|
29
32
|
spec/model_spec.rb
|
30
33
|
spec/persistable_spec.rb
|
34
|
+
spec/proc_condition_spec.rb
|
31
35
|
spec/response_spec.rb
|
32
36
|
spec/rspec_autotest.rb
|
33
37
|
spec/server_spec.rb
|
@@ -39,3 +43,8 @@ tasks/deployment.rake
|
|
39
43
|
tasks/environment.rake
|
40
44
|
tasks/rspec.rake
|
41
45
|
tasks/website.rake
|
46
|
+
website/index.html
|
47
|
+
website/index.txt
|
48
|
+
website/javascripts/rounded_corners_lite.inc.js
|
49
|
+
website/stylesheets/screen.css
|
50
|
+
website/template.rhtml
|
data/README.txt
CHANGED
@@ -45,6 +45,28 @@ Issueing CouchObject::Database#get, CouchObject::Database#post, CouchObject::Dat
|
|
45
45
|
=> {"_rev"=>548318611, "ok"=>true}
|
46
46
|
>> db.get("_all_docs").parsed_body
|
47
47
|
=> {"rows"=>[], "view"=>"_all_docs"}
|
48
|
+
|
49
|
+
== The Couch View Requestor
|
50
|
+
|
51
|
+
couch_ruby_view_requestor is a JsServer client for CouchDb, allowing you to query documents with Ruby instead of Javascript! All you need to do is pass in a string with something that reponds to #call with one argument (the document):
|
52
|
+
|
53
|
+
>> db.post("_temp_view", "proc { |doc| doc[\"foo\"] =~ /ba/ }").parsed_body["rows"]
|
54
|
+
=> [{"_rev"=>928806717, "_id"=>"28D568C5992CBD2B4711F57225A19517", "value"=>0}, {"_rev"=>-1696868121, "_id"=>"601D858DB2E298EFC4BBA92A11760D1E", "value"=>0}, {"_rev"=>-2093091288, "_id"=>"CABCEB3F2C8B70B3FE24A03FF6AB7A1E", "value"=>0}]
|
55
|
+
>> pp db.post("_temp_view", "proc { |doc| doc[\"foo\"] =~ /ba/ }").parsed_body["rows"]
|
56
|
+
[{"_rev"=>928806717, "_id"=>"28D568C5992CBD2B4711F57225A19517", "value"=>0},
|
57
|
+
{"_rev"=>-1696868121, "_id"=>"601D858DB2E298EFC4BBA92A11760D1E", "value"=>0},
|
58
|
+
{"_rev"=>-2093091288, "_id"=>"CABCEB3F2C8B70B3FE24A03FF6AB7A1E", "value"=>0}]
|
59
|
+
|
60
|
+
But you can even do it in plain Ruby, as opposed to a string, with Database#filter:
|
61
|
+
|
62
|
+
>> db.filter do |doc|
|
63
|
+
?> if doc["foo"] == "bar"
|
64
|
+
>> return doc
|
65
|
+
>> end
|
66
|
+
>> end
|
67
|
+
=> [{"_rev"=>-1696868121, "_id"=>"601D858DB2E298EFC4BBA92A11760D1E", "value"=>{"_id"=>"601D858DB2E298EFC4BBA92A11760D1E", "_rev"=>-1696868121, "foo"=>"bar"}}, {"_rev"=>-2093091288, "_id"=>"CABCEB3F2C8B70B3FE24A03FF6AB7A1E", "value"=>{"_id"=>"CABCEB3F2C8B70B3FE24A03FF6AB7A1E", "_rev"=>-2093091288, "foo"=>"bar"}}]
|
68
|
+
|
69
|
+
It requires that you set JsServer in your couch.ini to the path of the couch_ruby_view_requestor executable
|
48
70
|
|
49
71
|
== The Document object
|
50
72
|
|
data/TODO
CHANGED
@@ -1,8 +1,4 @@
|
|
1
|
-
- flat namespace for object attributes? (instead of the "attributes" key)
|
2
|
-
- Query/View API
|
3
|
-
- better handling of document id, including setting a custom ones
|
4
|
-
- Database#filter for filtering documents with Ruby (with some ruby2js or RubyToRuby magic)
|
5
1
|
- Expand on View class
|
6
|
-
-
|
2
|
+
- Do dot notation for document attributes in Database#filter
|
7
3
|
|
8
4
|
- CouchObject::Model for more domain specific/clearer way to model Couch docs in ruby
|
@@ -0,0 +1,81 @@
|
|
1
|
+
#!/usr/bin/env ruby -wKU
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
# Highly experimental view requestor for CouchDb
|
7
|
+
#
|
8
|
+
# >> pp db.post("_temp_view", "proc{|doc| if doc['foo'] =~ /ba/; return doc;end }")
|
9
|
+
# #<CouchObject::Response:0x616944
|
10
|
+
# @parsed_body=
|
11
|
+
# {"rows"=>
|
12
|
+
# [{"_rev"=>928806717,
|
13
|
+
# "_id"=>"28D568C5992CBD2B4711F57225A19517",
|
14
|
+
# "value"=>
|
15
|
+
# {"_id"=>"28D568C5992CBD2B4711F57225A19517",
|
16
|
+
# "_rev"=>928806717,
|
17
|
+
# "foo"=>"baz"}},
|
18
|
+
# {"_rev"=>-1696868121,
|
19
|
+
# "_id"=>"601D858DB2E298EFC4BBA92A11760D1E",
|
20
|
+
# "value"=>
|
21
|
+
# {"_id"=>"601D858DB2E298EFC4BBA92A11760D1E",
|
22
|
+
# "_rev"=>-1696868121,
|
23
|
+
# "foo"=>"bar"}},
|
24
|
+
# {"_rev"=>-2093091288,
|
25
|
+
# "_id"=>"CABCEB3F2C8B70B3FE24A03FF6AB7A1E",
|
26
|
+
# "value"=>
|
27
|
+
# {"_id"=>"CABCEB3F2C8B70B3FE24A03FF6AB7A1E",
|
28
|
+
# "_rev"=>-2093091288,
|
29
|
+
# "foo"=>"bar"}}],
|
30
|
+
# "offset"=>0,
|
31
|
+
# "total_rows"=>3,
|
32
|
+
# "view"=>"_temp_view:proc{|doc| if doc['foo'] =~ /ba/; return doc;end }"},
|
33
|
+
# @response=#<Net::HTTPOK 200 OK readbody=true>>
|
34
|
+
|
35
|
+
$callables = []
|
36
|
+
|
37
|
+
while cmd = ARGF.gets
|
38
|
+
#$stderr.puts "@@@==> got: #{cmd.inspect}"
|
39
|
+
cmd = JSON.parse(cmd)
|
40
|
+
case cmd[0]
|
41
|
+
when "reset"
|
42
|
+
$callables = []
|
43
|
+
puts "true"
|
44
|
+
STDOUT.flush
|
45
|
+
when "add_map_fun"
|
46
|
+
# second arg is a string that will compile to a function
|
47
|
+
callable = eval(cmd[1])
|
48
|
+
if callable.respond_to?(:call)
|
49
|
+
$callables << callable
|
50
|
+
puts "true"
|
51
|
+
else
|
52
|
+
puts JSON.unparse(["error", "String must respond_to #call, eg proc{|doc| doc.title == 'foo' }"])
|
53
|
+
end
|
54
|
+
STDOUT.flush
|
55
|
+
when "map_doc"
|
56
|
+
results = []
|
57
|
+
doc = cmd[1]
|
58
|
+
doc.freeze
|
59
|
+
$callables.each do |callable|
|
60
|
+
begin
|
61
|
+
result = callable.call(doc)
|
62
|
+
if result.nil?
|
63
|
+
results << 0 # indicate no match
|
64
|
+
elsif result == 0 # not sure if this one is correct
|
65
|
+
results << {"value"=>0}
|
66
|
+
else
|
67
|
+
results << result
|
68
|
+
end
|
69
|
+
rescue => e
|
70
|
+
# An error mapping the document. Indicate no match.
|
71
|
+
results << 0
|
72
|
+
end
|
73
|
+
end
|
74
|
+
puts JSON.unparse(results)
|
75
|
+
STDOUT.flush
|
76
|
+
else
|
77
|
+
puts "error"
|
78
|
+
STDOUT.flush
|
79
|
+
exit(1)
|
80
|
+
end
|
81
|
+
end
|
data/config/hoe.rb
CHANGED
@@ -61,7 +61,8 @@ hoe = Hoe.new(GEM_NAME, VERS) do |p|
|
|
61
61
|
p.changes = p.paragraphs_of("History.txt", 0..1).join("\\n\\n")
|
62
62
|
# An array of rubygem dependencies [name, version], e.g. [ ['active_support', '>= 1.3.1'] ]
|
63
63
|
p.extra_deps = [
|
64
|
-
["json", ">= 1.1.1"]
|
64
|
+
[ "json", ">= 1.1.1" ],
|
65
|
+
[ "ruby2ruby", ">= 1.1.7" ],
|
65
66
|
]
|
66
67
|
|
67
68
|
#p.spec_extras = {} # A hash of extra values to set in the gemspec.
|
data/lib/couch_object.rb
CHANGED
@@ -9,11 +9,14 @@ rescue LoadError
|
|
9
9
|
$stderr.puts "C version of json (fjson) could not be loaded, using pure ruby one"
|
10
10
|
require "json/pure"
|
11
11
|
end
|
12
|
+
|
12
13
|
require 'json/add/core'
|
14
|
+
require "ruby2ruby"
|
13
15
|
|
14
16
|
$:.unshift File.dirname(__FILE__)
|
15
17
|
|
16
18
|
require "couch_object/utils"
|
19
|
+
require "couch_object/proc_condition"
|
17
20
|
require "couch_object/document"
|
18
21
|
require "couch_object/response"
|
19
22
|
require "couch_object/server"
|
@@ -101,9 +101,25 @@ module CouchObject
|
|
101
101
|
resp.to_document.rows
|
102
102
|
end
|
103
103
|
|
104
|
+
def store(document)
|
105
|
+
document.save(self)
|
106
|
+
end
|
107
|
+
|
104
108
|
# Queries the database with the block (using a temp. view)
|
105
|
-
|
106
|
-
|
109
|
+
# Requires a block argument that's the doc thats evaluted in
|
110
|
+
# CouchDb
|
111
|
+
#
|
112
|
+
# >> pp db.filter do |doc|
|
113
|
+
# if doc["foo"] == "baz"
|
114
|
+
# return doc["foo"]
|
115
|
+
# end
|
116
|
+
# end
|
117
|
+
# [{"_rev"=>928806717,
|
118
|
+
# "_id"=>"28D568C5992CBD2B4711F57225A19517",
|
119
|
+
# "value"=>"baz"}]
|
120
|
+
def filter(&block)
|
121
|
+
resp = Response.new(post("_temp_view", ProcCondition.new(&block).to_ruby)).parse
|
122
|
+
resp.to_document.rows
|
107
123
|
end
|
108
124
|
|
109
125
|
def views(view_name)
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module CouchObject
|
2
|
+
class ProcCondition
|
3
|
+
def initialize(&block)
|
4
|
+
unless block.arity == 1
|
5
|
+
raise ArgumentError, "wrong number of arguments (#{block.arity+1} for 1)"
|
6
|
+
end
|
7
|
+
@block = block
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_ruby
|
11
|
+
@block.to_ruby.squeeze(" ")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/couch_object/version.rb
CHANGED
data/script/txt2html
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
begin
|
5
|
+
require 'newgem'
|
6
|
+
rescue LoadError
|
7
|
+
puts "\n\nGenerating the website requires the newgem RubyGem"
|
8
|
+
puts "Install: gem install newgem\n\n"
|
9
|
+
exit(1)
|
10
|
+
end
|
11
|
+
require 'redcloth'
|
12
|
+
require 'syntax/convertors/html'
|
13
|
+
require 'erb'
|
14
|
+
require File.dirname(__FILE__) + '/../lib/couch_object/version.rb'
|
15
|
+
|
16
|
+
version = CouchObject::VERSION::STRING
|
17
|
+
download = 'http://rubyforge.org/projects/couch_object'
|
18
|
+
|
19
|
+
class Fixnum
|
20
|
+
def ordinal
|
21
|
+
# teens
|
22
|
+
return 'th' if (10..19).include?(self % 100)
|
23
|
+
# others
|
24
|
+
case self % 10
|
25
|
+
when 1: return 'st'
|
26
|
+
when 2: return 'nd'
|
27
|
+
when 3: return 'rd'
|
28
|
+
else return 'th'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class Time
|
34
|
+
def pretty
|
35
|
+
return "#{mday}#{mday.ordinal} #{strftime('%B')} #{year}"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def convert_syntax(syntax, source)
|
40
|
+
return Syntax::Convertors::HTML.for_syntax(syntax).convert(source).gsub(%r!^<pre>|</pre>$!,'')
|
41
|
+
end
|
42
|
+
|
43
|
+
if ARGV.length >= 1
|
44
|
+
src, template = ARGV
|
45
|
+
template ||= File.join(File.dirname(__FILE__), '/../website/template.rhtml')
|
46
|
+
|
47
|
+
else
|
48
|
+
puts("Usage: #{File.split($0).last} source.txt [template.rhtml] > output.html")
|
49
|
+
exit!
|
50
|
+
end
|
51
|
+
|
52
|
+
template = ERB.new(File.open(template).read)
|
53
|
+
|
54
|
+
title = nil
|
55
|
+
body = nil
|
56
|
+
File.open(src) do |fsrc|
|
57
|
+
title_text = fsrc.readline
|
58
|
+
body_text = fsrc.read
|
59
|
+
syntax_items = []
|
60
|
+
body_text.gsub!(%r!<(pre|code)[^>]*?syntax=['"]([^'"]+)[^>]*>(.*?)</\1>!m){
|
61
|
+
ident = syntax_items.length
|
62
|
+
element, syntax, source = $1, $2, $3
|
63
|
+
syntax_items << "<#{element} class='syntax'>#{convert_syntax(syntax, source)}</#{element}>"
|
64
|
+
"syntax-temp-#{ident}"
|
65
|
+
}
|
66
|
+
title = RedCloth.new(title_text).to_html.gsub(%r!<.*?>!,'').strip
|
67
|
+
body = RedCloth.new(body_text).to_html
|
68
|
+
body.gsub!(%r!(?:<pre><code>)?syntax-temp-(\d+)(?:</code></pre>)?!){ syntax_items[$1.to_i] }
|
69
|
+
end
|
70
|
+
stat = File.stat(src)
|
71
|
+
created = stat.ctime
|
72
|
+
modified = stat.mtime
|
73
|
+
|
74
|
+
$stdout << template.result(binding)
|
data/spec/database_spec.rb
CHANGED
@@ -139,5 +139,34 @@ describe CouchObject::Database do
|
|
139
139
|
db.all_documents.should == [{"_rev"=>123, "_id"=>"123ABC"}]
|
140
140
|
end
|
141
141
|
|
142
|
+
it "should store a document" do
|
143
|
+
db = CouchObject::Database.new(@uri, "foo")
|
144
|
+
doc = CouchObject::Document.new({"foo" => "bar"})
|
145
|
+
db.should_receive(:post).with("", JSON.unparse("foo" => "bar"))
|
146
|
+
db.store(doc)
|
147
|
+
end
|
148
|
+
|
149
|
+
it "should return the rows when filtering" do
|
150
|
+
db = CouchObject::Database.new(@uri, "foo")
|
151
|
+
rowdata = { "_rev"=>1,
|
152
|
+
"_id"=>"1",
|
153
|
+
"value"=> {
|
154
|
+
"_id"=>"1",
|
155
|
+
"_rev"=>1,
|
156
|
+
"foo"=>"bar"
|
157
|
+
}
|
158
|
+
}
|
159
|
+
resp = mock("response")
|
160
|
+
resp.stub!(:body).and_return(JSON.unparse("rows" => [rowdata]))
|
161
|
+
resp.stub!(:parse).and_return(resp)
|
162
|
+
resp.stub!(:to_document).and_return(
|
163
|
+
CouchObject::Document.new("rows" => [rowdata])
|
164
|
+
)
|
165
|
+
db.should_receive(:post).with("_temp_view", "proc { |doc|\n (doc[\"foo\"] == \"bar\")\n}").and_return(resp)
|
166
|
+
rows = db.filter{|doc| doc["foo"] == "bar"}
|
167
|
+
rows.size.should == 1
|
168
|
+
rows.first["value"]["foo"].should == "bar"
|
169
|
+
end
|
170
|
+
|
142
171
|
#it "should url encode paths"
|
143
172
|
end
|
@@ -75,4 +75,17 @@ describe "Database operations" do
|
|
75
75
|
resp.code.should == 404
|
76
76
|
end
|
77
77
|
|
78
|
+
it "should filter documents" do
|
79
|
+
db = create_and_open_test_db
|
80
|
+
db.post("", JSON.unparse({"foo" => "bar"}))
|
81
|
+
db.post("", JSON.unparse({"foo" => "baz"}))
|
82
|
+
db.post("", JSON.unparse({"foo" => "qux"}))
|
83
|
+
db.all_documents.size.should == 3
|
84
|
+
results = db.filter do |doc|
|
85
|
+
doc["foo"] =~ /ba/
|
86
|
+
end
|
87
|
+
results.size.should == 2
|
88
|
+
|
89
|
+
end
|
90
|
+
|
78
91
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
describe CouchObject::ProcCondition do
|
4
|
+
|
5
|
+
it "should accept a block only" do
|
6
|
+
proc{
|
7
|
+
CouchObject::ProcCondition.new do |x|
|
8
|
+
x
|
9
|
+
end
|
10
|
+
}.should_not raise_error
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should require a block argument" do
|
14
|
+
proc{
|
15
|
+
CouchObject::ProcCondition.new do
|
16
|
+
"bar"
|
17
|
+
end
|
18
|
+
}.should raise_error(ArgumentError)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should convert itself to ruby" do
|
22
|
+
CouchObject::ProcCondition.new do |x|
|
23
|
+
x
|
24
|
+
end.to_ruby.should == "proc { |x|\n x\n}"
|
25
|
+
end
|
26
|
+
end
|
data/tasks/website.rake
CHANGED
@@ -1,9 +1,17 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
desc 'Generate website files'
|
2
|
+
task :website_generate => :ruby_env do
|
3
|
+
(Dir['website/**/*.txt'] - Dir['website/version*.txt']).each do |txt|
|
4
|
+
sh %{ #{RUBY_APP} script/txt2html #{txt} > #{txt.gsub(/txt$/,'html')} }
|
5
|
+
end
|
6
|
+
end
|
4
7
|
|
5
|
-
|
8
|
+
desc 'Upload website files to rubyforge'
|
9
|
+
task :website_upload do
|
10
|
+
host = "#{rubyforge_username}@rubyforge.org"
|
11
|
+
remote_dir = "/var/www/gforge-projects/#{RUBYFORGE_PROJECT}/"
|
12
|
+
local_dir = 'website'
|
13
|
+
sh %{rsync -aCv #{local_dir}/ #{host}:#{remote_dir}}
|
14
|
+
end
|
6
15
|
|
7
|
-
|
8
|
-
|
9
|
-
task :website => :publish_docs
|
16
|
+
desc 'Generate and upload website files'
|
17
|
+
task :website => [:website_generate, :website_upload, :publish_docs]
|
data/website/index.html
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
2
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
3
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
4
|
+
<head>
|
5
|
+
<link rel="stylesheet" href="stylesheets/screen.css" type="text/css" media="screen" />
|
6
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
7
|
+
<title>
|
8
|
+
CouchObject
|
9
|
+
</title>
|
10
|
+
<script src="javascripts/rounded_corners_lite.inc.js" type="text/javascript"></script>
|
11
|
+
<style>
|
12
|
+
|
13
|
+
</style>
|
14
|
+
<script type="text/javascript">
|
15
|
+
window.onload = function() {
|
16
|
+
settings = {
|
17
|
+
tl: { radius: 10 },
|
18
|
+
tr: { radius: 10 },
|
19
|
+
bl: { radius: 10 },
|
20
|
+
br: { radius: 10 },
|
21
|
+
antiAlias: true,
|
22
|
+
autoPad: true,
|
23
|
+
validTags: ["div"]
|
24
|
+
}
|
25
|
+
var versionBox = new curvyCorners(settings, document.getElementById("version"));
|
26
|
+
versionBox.applyCornersToAll();
|
27
|
+
}
|
28
|
+
</script>
|
29
|
+
</head>
|
30
|
+
<body>
|
31
|
+
<div id="main">
|
32
|
+
|
33
|
+
<h1>CouchObject</h1>
|
34
|
+
<div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/couch_object"; return false'>
|
35
|
+
<p>Get Version</p>
|
36
|
+
<a href="http://rubyforge.org/projects/couch_object" class="numbers">0.5.0</a>
|
37
|
+
</div>
|
38
|
+
<h1>→ ‘couch_object’</h1>
|
39
|
+
|
40
|
+
|
41
|
+
<h2>What</h2>
|
42
|
+
|
43
|
+
|
44
|
+
<p>CouchObject is a set of classes to help you talk to <a href="http://couchdbwiki.com/">CouchDb</a> with and in Ruby.</p>
|
45
|
+
|
46
|
+
|
47
|
+
<h2>Installing</h2>
|
48
|
+
|
49
|
+
|
50
|
+
<p><pre class='syntax'><span class="ident">sudo</span> <span class="ident">gem</span> <span class="ident">install</span> <span class="ident">couchobject</span></pre></p>
|
51
|
+
|
52
|
+
|
53
|
+
<h2>The basics</h2>
|
54
|
+
|
55
|
+
|
56
|
+
<h2>Demonstration of usage</h2>
|
57
|
+
|
58
|
+
|
59
|
+
<p>See the <a href="http://couchobject.rubyforge.org/rdoc/">RDoc</a></p>
|
60
|
+
|
61
|
+
|
62
|
+
<h2>How to submit patches</h2>
|
63
|
+
|
64
|
+
|
65
|
+
<pre>
|
66
|
+
$ git clone git://repo.or.cz/couchobject.git
|
67
|
+
</pre>
|
68
|
+
|
69
|
+
<h2>License</h2>
|
70
|
+
|
71
|
+
|
72
|
+
<p>This code is free to use under the terms of the <span class="caps">MIT</span> license.</p>
|
73
|
+
|
74
|
+
|
75
|
+
<h2>Contact</h2>
|
76
|
+
|
77
|
+
|
78
|
+
<ul>
|
79
|
+
<li>Author: Johan Sørensen</li>
|
80
|
+
<li>Contact: johan (at) johansorensen <span class="caps">DOT</span> com</li>
|
81
|
+
<li>Home: <a href="http://rubyforge.org/projects/couchobject/">Rubyforge</a> | <a href="http://couchobject.rubyforge.org">Rubyforge hme</a></li>
|
82
|
+
<li>Source (Git): <a href="http://repo.or.cz/w/couchobject.git">http://repo.or.cz/w/couchobject.git</a></li>
|
83
|
+
</ul>
|
84
|
+
<p class="coda">
|
85
|
+
<a href="">TODO</a>, 15th September 2007<br>
|
86
|
+
Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
|
87
|
+
</p>
|
88
|
+
</div>
|
89
|
+
|
90
|
+
<!-- insert site tracking codes here, like Google Urchin -->
|
91
|
+
|
92
|
+
</body>
|
93
|
+
</html>
|
data/website/index.txt
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
h1. CouchObject
|
2
|
+
|
3
|
+
h1. → 'couch_object'
|
4
|
+
|
5
|
+
|
6
|
+
h2. What
|
7
|
+
|
8
|
+
CouchObject is a set of classes to help you talk to "CouchDb":http://couchdbwiki.com/ with and in Ruby.
|
9
|
+
|
10
|
+
h2. Installing
|
11
|
+
|
12
|
+
<pre syntax="ruby">sudo gem install couchobject</pre>
|
13
|
+
|
14
|
+
h2. The basics
|
15
|
+
|
16
|
+
|
17
|
+
h2. Demonstration of usage
|
18
|
+
|
19
|
+
See the "RDoc":http://couchobject.rubyforge.org/rdoc/
|
20
|
+
|
21
|
+
h2. How to submit patches
|
22
|
+
|
23
|
+
<pre>
|
24
|
+
$ git clone git://repo.or.cz/couchobject.git
|
25
|
+
</pre>
|
26
|
+
|
27
|
+
h2. License
|
28
|
+
|
29
|
+
This code is free to use under the terms of the MIT license.
|
30
|
+
|
31
|
+
h2. Contact
|
32
|
+
|
33
|
+
* Author: Johan Sørensen
|
34
|
+
* Contact: johan (at) johansorensen DOT com
|
35
|
+
* Home: "Rubyforge":http://rubyforge.org/projects/couchobject/ | "Rubyforge hme":http://couchobject.rubyforge.org
|
36
|
+
* Source (Git): "http://repo.or.cz/w/couchobject.git":http://repo.or.cz/w/couchobject.git
|
37
|
+
|
@@ -0,0 +1,285 @@
|
|
1
|
+
|
2
|
+
/****************************************************************
|
3
|
+
* *
|
4
|
+
* curvyCorners *
|
5
|
+
* ------------ *
|
6
|
+
* *
|
7
|
+
* This script generates rounded corners for your divs. *
|
8
|
+
* *
|
9
|
+
* Version 1.2.9 *
|
10
|
+
* Copyright (c) 2006 Cameron Cooke *
|
11
|
+
* By: Cameron Cooke and Tim Hutchison. *
|
12
|
+
* *
|
13
|
+
* *
|
14
|
+
* Website: http://www.curvycorners.net *
|
15
|
+
* Email: info@totalinfinity.com *
|
16
|
+
* Forum: http://www.curvycorners.net/forum/ *
|
17
|
+
* *
|
18
|
+
* *
|
19
|
+
* This library is free software; you can redistribute *
|
20
|
+
* it and/or modify it under the terms of the GNU *
|
21
|
+
* Lesser General Public License as published by the *
|
22
|
+
* Free Software Foundation; either version 2.1 of the *
|
23
|
+
* License, or (at your option) any later version. *
|
24
|
+
* *
|
25
|
+
* This library is distributed in the hope that it will *
|
26
|
+
* be useful, but WITHOUT ANY WARRANTY; without even the *
|
27
|
+
* implied warranty of MERCHANTABILITY or FITNESS FOR A *
|
28
|
+
* PARTICULAR PURPOSE. See the GNU Lesser General Public *
|
29
|
+
* License for more details. *
|
30
|
+
* *
|
31
|
+
* You should have received a copy of the GNU Lesser *
|
32
|
+
* General Public License along with this library; *
|
33
|
+
* Inc., 59 Temple Place, Suite 330, Boston, *
|
34
|
+
* MA 02111-1307 USA *
|
35
|
+
* *
|
36
|
+
****************************************************************/
|
37
|
+
|
38
|
+
var isIE = navigator.userAgent.toLowerCase().indexOf("msie") > -1; var isMoz = document.implementation && document.implementation.createDocument; var isSafari = ((navigator.userAgent.toLowerCase().indexOf('safari')!=-1)&&(navigator.userAgent.toLowerCase().indexOf('mac')!=-1))?true:false; function curvyCorners()
|
39
|
+
{ if(typeof(arguments[0]) != "object") throw newCurvyError("First parameter of curvyCorners() must be an object."); if(typeof(arguments[1]) != "object" && typeof(arguments[1]) != "string") throw newCurvyError("Second parameter of curvyCorners() must be an object or a class name."); if(typeof(arguments[1]) == "string")
|
40
|
+
{ var startIndex = 0; var boxCol = getElementsByClass(arguments[1]);}
|
41
|
+
else
|
42
|
+
{ var startIndex = 1; var boxCol = arguments;}
|
43
|
+
var curvyCornersCol = new Array(); if(arguments[0].validTags)
|
44
|
+
var validElements = arguments[0].validTags; else
|
45
|
+
var validElements = ["div"]; for(var i = startIndex, j = boxCol.length; i < j; i++)
|
46
|
+
{ var currentTag = boxCol[i].tagName.toLowerCase(); if(inArray(validElements, currentTag) !== false)
|
47
|
+
{ curvyCornersCol[curvyCornersCol.length] = new curvyObject(arguments[0], boxCol[i]);}
|
48
|
+
}
|
49
|
+
this.objects = curvyCornersCol; this.applyCornersToAll = function()
|
50
|
+
{ for(var x = 0, k = this.objects.length; x < k; x++)
|
51
|
+
{ this.objects[x].applyCorners();}
|
52
|
+
}
|
53
|
+
}
|
54
|
+
function curvyObject()
|
55
|
+
{ this.box = arguments[1]; this.settings = arguments[0]; this.topContainer = null; this.bottomContainer = null; this.masterCorners = new Array(); this.contentDIV = null; var boxHeight = get_style(this.box, "height", "height"); var boxWidth = get_style(this.box, "width", "width"); var borderWidth = get_style(this.box, "borderTopWidth", "border-top-width"); var borderColour = get_style(this.box, "borderTopColor", "border-top-color"); var boxColour = get_style(this.box, "backgroundColor", "background-color"); var backgroundImage = get_style(this.box, "backgroundImage", "background-image"); var boxPosition = get_style(this.box, "position", "position"); var boxPadding = get_style(this.box, "paddingTop", "padding-top"); this.boxHeight = parseInt(((boxHeight != "" && boxHeight != "auto" && boxHeight.indexOf("%") == -1)? boxHeight.substring(0, boxHeight.indexOf("px")) : this.box.scrollHeight)); this.boxWidth = parseInt(((boxWidth != "" && boxWidth != "auto" && boxWidth.indexOf("%") == -1)? boxWidth.substring(0, boxWidth.indexOf("px")) : this.box.scrollWidth)); this.borderWidth = parseInt(((borderWidth != "" && borderWidth.indexOf("px") !== -1)? borderWidth.slice(0, borderWidth.indexOf("px")) : 0)); this.boxColour = format_colour(boxColour); this.boxPadding = parseInt(((boxPadding != "" && boxPadding.indexOf("px") !== -1)? boxPadding.slice(0, boxPadding.indexOf("px")) : 0)); this.borderColour = format_colour(borderColour); this.borderString = this.borderWidth + "px" + " solid " + this.borderColour; this.backgroundImage = ((backgroundImage != "none")? backgroundImage : ""); this.boxContent = this.box.innerHTML; if(boxPosition != "absolute") this.box.style.position = "relative"; this.box.style.padding = "0px"; if(isIE && boxWidth == "auto" && boxHeight == "auto") this.box.style.width = "100%"; if(this.settings.autoPad == true && this.boxPadding > 0)
|
56
|
+
this.box.innerHTML = ""; this.applyCorners = function()
|
57
|
+
{ for(var t = 0; t < 2; t++)
|
58
|
+
{ switch(t)
|
59
|
+
{ case 0:
|
60
|
+
if(this.settings.tl || this.settings.tr)
|
61
|
+
{ var newMainContainer = document.createElement("DIV"); newMainContainer.style.width = "100%"; newMainContainer.style.fontSize = "1px"; newMainContainer.style.overflow = "hidden"; newMainContainer.style.position = "absolute"; newMainContainer.style.paddingLeft = this.borderWidth + "px"; newMainContainer.style.paddingRight = this.borderWidth + "px"; var topMaxRadius = Math.max(this.settings.tl ? this.settings.tl.radius : 0, this.settings.tr ? this.settings.tr.radius : 0); newMainContainer.style.height = topMaxRadius + "px"; newMainContainer.style.top = 0 - topMaxRadius + "px"; newMainContainer.style.left = 0 - this.borderWidth + "px"; this.topContainer = this.box.appendChild(newMainContainer);}
|
62
|
+
break; case 1:
|
63
|
+
if(this.settings.bl || this.settings.br)
|
64
|
+
{ var newMainContainer = document.createElement("DIV"); newMainContainer.style.width = "100%"; newMainContainer.style.fontSize = "1px"; newMainContainer.style.overflow = "hidden"; newMainContainer.style.position = "absolute"; newMainContainer.style.paddingLeft = this.borderWidth + "px"; newMainContainer.style.paddingRight = this.borderWidth + "px"; var botMaxRadius = Math.max(this.settings.bl ? this.settings.bl.radius : 0, this.settings.br ? this.settings.br.radius : 0); newMainContainer.style.height = botMaxRadius + "px"; newMainContainer.style.bottom = 0 - botMaxRadius + "px"; newMainContainer.style.left = 0 - this.borderWidth + "px"; this.bottomContainer = this.box.appendChild(newMainContainer);}
|
65
|
+
break;}
|
66
|
+
}
|
67
|
+
if(this.topContainer) this.box.style.borderTopWidth = "0px"; if(this.bottomContainer) this.box.style.borderBottomWidth = "0px"; var corners = ["tr", "tl", "br", "bl"]; for(var i in corners)
|
68
|
+
{ if(i > -1 < 4)
|
69
|
+
{ var cc = corners[i]; if(!this.settings[cc])
|
70
|
+
{ if(((cc == "tr" || cc == "tl") && this.topContainer != null) || ((cc == "br" || cc == "bl") && this.bottomContainer != null))
|
71
|
+
{ var newCorner = document.createElement("DIV"); newCorner.style.position = "relative"; newCorner.style.fontSize = "1px"; newCorner.style.overflow = "hidden"; if(this.backgroundImage == "")
|
72
|
+
newCorner.style.backgroundColor = this.boxColour; else
|
73
|
+
newCorner.style.backgroundImage = this.backgroundImage; switch(cc)
|
74
|
+
{ case "tl":
|
75
|
+
newCorner.style.height = topMaxRadius - this.borderWidth + "px"; newCorner.style.marginRight = this.settings.tr.radius - (this.borderWidth*2) + "px"; newCorner.style.borderLeft = this.borderString; newCorner.style.borderTop = this.borderString; newCorner.style.left = -this.borderWidth + "px"; break; case "tr":
|
76
|
+
newCorner.style.height = topMaxRadius - this.borderWidth + "px"; newCorner.style.marginLeft = this.settings.tl.radius - (this.borderWidth*2) + "px"; newCorner.style.borderRight = this.borderString; newCorner.style.borderTop = this.borderString; newCorner.style.backgroundPosition = "-" + (topMaxRadius + this.borderWidth) + "px 0px"; newCorner.style.left = this.borderWidth + "px"; break; case "bl":
|
77
|
+
newCorner.style.height = botMaxRadius - this.borderWidth + "px"; newCorner.style.marginRight = this.settings.br.radius - (this.borderWidth*2) + "px"; newCorner.style.borderLeft = this.borderString; newCorner.style.borderBottom = this.borderString; newCorner.style.left = -this.borderWidth + "px"; newCorner.style.backgroundPosition = "-" + (this.borderWidth) + "px -" + (this.boxHeight + (botMaxRadius + this.borderWidth)) + "px"; break; case "br":
|
78
|
+
newCorner.style.height = botMaxRadius - this.borderWidth + "px"; newCorner.style.marginLeft = this.settings.bl.radius - (this.borderWidth*2) + "px"; newCorner.style.borderRight = this.borderString; newCorner.style.borderBottom = this.borderString; newCorner.style.left = this.borderWidth + "px"
|
79
|
+
newCorner.style.backgroundPosition = "-" + (botMaxRadius + this.borderWidth) + "px -" + (this.boxHeight + (botMaxRadius + this.borderWidth)) + "px"; break;}
|
80
|
+
}
|
81
|
+
}
|
82
|
+
else
|
83
|
+
{ if(this.masterCorners[this.settings[cc].radius])
|
84
|
+
{ var newCorner = this.masterCorners[this.settings[cc].radius].cloneNode(true);}
|
85
|
+
else
|
86
|
+
{ var newCorner = document.createElement("DIV"); newCorner.style.height = this.settings[cc].radius + "px"; newCorner.style.width = this.settings[cc].radius + "px"; newCorner.style.position = "absolute"; newCorner.style.fontSize = "1px"; newCorner.style.overflow = "hidden"; var borderRadius = parseInt(this.settings[cc].radius - this.borderWidth); for(var intx = 0, j = this.settings[cc].radius; intx < j; intx++)
|
87
|
+
{ if((intx +1) >= borderRadius)
|
88
|
+
var y1 = -1; else
|
89
|
+
var y1 = (Math.floor(Math.sqrt(Math.pow(borderRadius, 2) - Math.pow((intx+1), 2))) - 1); if(borderRadius != j)
|
90
|
+
{ if((intx) >= borderRadius)
|
91
|
+
var y2 = -1; else
|
92
|
+
var y2 = Math.ceil(Math.sqrt(Math.pow(borderRadius,2) - Math.pow(intx, 2))); if((intx+1) >= j)
|
93
|
+
var y3 = -1; else
|
94
|
+
var y3 = (Math.floor(Math.sqrt(Math.pow(j ,2) - Math.pow((intx+1), 2))) - 1);}
|
95
|
+
if((intx) >= j)
|
96
|
+
var y4 = -1; else
|
97
|
+
var y4 = Math.ceil(Math.sqrt(Math.pow(j ,2) - Math.pow(intx, 2))); if(y1 > -1) this.drawPixel(intx, 0, this.boxColour, 100, (y1+1), newCorner, -1, this.settings[cc].radius); if(borderRadius != j)
|
98
|
+
{ for(var inty = (y1 + 1); inty < y2; inty++)
|
99
|
+
{ if(this.settings.antiAlias)
|
100
|
+
{ if(this.backgroundImage != "")
|
101
|
+
{ var borderFract = (pixelFraction(intx, inty, borderRadius) * 100); if(borderFract < 30)
|
102
|
+
{ this.drawPixel(intx, inty, this.borderColour, 100, 1, newCorner, 0, this.settings[cc].radius);}
|
103
|
+
else
|
104
|
+
{ this.drawPixel(intx, inty, this.borderColour, 100, 1, newCorner, -1, this.settings[cc].radius);}
|
105
|
+
}
|
106
|
+
else
|
107
|
+
{ var pixelcolour = BlendColour(this.boxColour, this.borderColour, pixelFraction(intx, inty, borderRadius)); this.drawPixel(intx, inty, pixelcolour, 100, 1, newCorner, 0, this.settings[cc].radius, cc);}
|
108
|
+
}
|
109
|
+
}
|
110
|
+
if(this.settings.antiAlias)
|
111
|
+
{ if(y3 >= y2)
|
112
|
+
{ if (y2 == -1) y2 = 0; this.drawPixel(intx, y2, this.borderColour, 100, (y3 - y2 + 1), newCorner, 0, 0);}
|
113
|
+
}
|
114
|
+
else
|
115
|
+
{ if(y3 >= y1)
|
116
|
+
{ this.drawPixel(intx, (y1 + 1), this.borderColour, 100, (y3 - y1), newCorner, 0, 0);}
|
117
|
+
}
|
118
|
+
var outsideColour = this.borderColour;}
|
119
|
+
else
|
120
|
+
{ var outsideColour = this.boxColour; var y3 = y1;}
|
121
|
+
if(this.settings.antiAlias)
|
122
|
+
{ for(var inty = (y3 + 1); inty < y4; inty++)
|
123
|
+
{ this.drawPixel(intx, inty, outsideColour, (pixelFraction(intx, inty , j) * 100), 1, newCorner, ((this.borderWidth > 0)? 0 : -1), this.settings[cc].radius);}
|
124
|
+
}
|
125
|
+
}
|
126
|
+
this.masterCorners[this.settings[cc].radius] = newCorner.cloneNode(true);}
|
127
|
+
if(cc != "br")
|
128
|
+
{ for(var t = 0, k = newCorner.childNodes.length; t < k; t++)
|
129
|
+
{ var pixelBar = newCorner.childNodes[t]; var pixelBarTop = parseInt(pixelBar.style.top.substring(0, pixelBar.style.top.indexOf("px"))); var pixelBarLeft = parseInt(pixelBar.style.left.substring(0, pixelBar.style.left.indexOf("px"))); var pixelBarHeight = parseInt(pixelBar.style.height.substring(0, pixelBar.style.height.indexOf("px"))); if(cc == "tl" || cc == "bl"){ pixelBar.style.left = this.settings[cc].radius -pixelBarLeft -1 + "px";}
|
130
|
+
if(cc == "tr" || cc == "tl"){ pixelBar.style.top = this.settings[cc].radius -pixelBarHeight -pixelBarTop + "px";}
|
131
|
+
switch(cc)
|
132
|
+
{ case "tr":
|
133
|
+
pixelBar.style.backgroundPosition = "-" + Math.abs((this.boxWidth - this.settings[cc].radius + this.borderWidth) + pixelBarLeft) + "px -" + Math.abs(this.settings[cc].radius -pixelBarHeight -pixelBarTop - this.borderWidth) + "px"; break; case "tl":
|
134
|
+
pixelBar.style.backgroundPosition = "-" + Math.abs((this.settings[cc].radius -pixelBarLeft -1) - this.borderWidth) + "px -" + Math.abs(this.settings[cc].radius -pixelBarHeight -pixelBarTop - this.borderWidth) + "px"; break; case "bl":
|
135
|
+
pixelBar.style.backgroundPosition = "-" + Math.abs((this.settings[cc].radius -pixelBarLeft -1) - this.borderWidth) + "px -" + Math.abs((this.boxHeight + this.settings[cc].radius + pixelBarTop) -this.borderWidth) + "px"; break;}
|
136
|
+
}
|
137
|
+
}
|
138
|
+
}
|
139
|
+
if(newCorner)
|
140
|
+
{ switch(cc)
|
141
|
+
{ case "tl":
|
142
|
+
if(newCorner.style.position == "absolute") newCorner.style.top = "0px"; if(newCorner.style.position == "absolute") newCorner.style.left = "0px"; if(this.topContainer) this.topContainer.appendChild(newCorner); break; case "tr":
|
143
|
+
if(newCorner.style.position == "absolute") newCorner.style.top = "0px"; if(newCorner.style.position == "absolute") newCorner.style.right = "0px"; if(this.topContainer) this.topContainer.appendChild(newCorner); break; case "bl":
|
144
|
+
if(newCorner.style.position == "absolute") newCorner.style.bottom = "0px"; if(newCorner.style.position == "absolute") newCorner.style.left = "0px"; if(this.bottomContainer) this.bottomContainer.appendChild(newCorner); break; case "br":
|
145
|
+
if(newCorner.style.position == "absolute") newCorner.style.bottom = "0px"; if(newCorner.style.position == "absolute") newCorner.style.right = "0px"; if(this.bottomContainer) this.bottomContainer.appendChild(newCorner); break;}
|
146
|
+
}
|
147
|
+
}
|
148
|
+
}
|
149
|
+
var radiusDiff = new Array(); radiusDiff["t"] = Math.abs(this.settings.tl.radius - this.settings.tr.radius)
|
150
|
+
radiusDiff["b"] = Math.abs(this.settings.bl.radius - this.settings.br.radius); for(z in radiusDiff)
|
151
|
+
{ if(z == "t" || z == "b")
|
152
|
+
{ if(radiusDiff[z])
|
153
|
+
{ var smallerCornerType = ((this.settings[z + "l"].radius < this.settings[z + "r"].radius)? z +"l" : z +"r"); var newFiller = document.createElement("DIV"); newFiller.style.height = radiusDiff[z] + "px"; newFiller.style.width = this.settings[smallerCornerType].radius+ "px"
|
154
|
+
newFiller.style.position = "absolute"; newFiller.style.fontSize = "1px"; newFiller.style.overflow = "hidden"; newFiller.style.backgroundColor = this.boxColour; switch(smallerCornerType)
|
155
|
+
{ case "tl":
|
156
|
+
newFiller.style.bottom = "0px"; newFiller.style.left = "0px"; newFiller.style.borderLeft = this.borderString; this.topContainer.appendChild(newFiller); break; case "tr":
|
157
|
+
newFiller.style.bottom = "0px"; newFiller.style.right = "0px"; newFiller.style.borderRight = this.borderString; this.topContainer.appendChild(newFiller); break; case "bl":
|
158
|
+
newFiller.style.top = "0px"; newFiller.style.left = "0px"; newFiller.style.borderLeft = this.borderString; this.bottomContainer.appendChild(newFiller); break; case "br":
|
159
|
+
newFiller.style.top = "0px"; newFiller.style.right = "0px"; newFiller.style.borderRight = this.borderString; this.bottomContainer.appendChild(newFiller); break;}
|
160
|
+
}
|
161
|
+
var newFillerBar = document.createElement("DIV"); newFillerBar.style.position = "relative"; newFillerBar.style.fontSize = "1px"; newFillerBar.style.overflow = "hidden"; newFillerBar.style.backgroundColor = this.boxColour; newFillerBar.style.backgroundImage = this.backgroundImage; switch(z)
|
162
|
+
{ case "t":
|
163
|
+
if(this.topContainer)
|
164
|
+
{ if(this.settings.tl.radius && this.settings.tr.radius)
|
165
|
+
{ newFillerBar.style.height = topMaxRadius - this.borderWidth + "px"; newFillerBar.style.marginLeft = this.settings.tl.radius - this.borderWidth + "px"; newFillerBar.style.marginRight = this.settings.tr.radius - this.borderWidth + "px"; newFillerBar.style.borderTop = this.borderString; if(this.backgroundImage != "")
|
166
|
+
newFillerBar.style.backgroundPosition = "-" + (topMaxRadius + this.borderWidth) + "px 0px"; this.topContainer.appendChild(newFillerBar);}
|
167
|
+
this.box.style.backgroundPosition = "0px -" + (topMaxRadius - this.borderWidth) + "px";}
|
168
|
+
break; case "b":
|
169
|
+
if(this.bottomContainer)
|
170
|
+
{ if(this.settings.bl.radius && this.settings.br.radius)
|
171
|
+
{ newFillerBar.style.height = botMaxRadius - this.borderWidth + "px"; newFillerBar.style.marginLeft = this.settings.bl.radius - this.borderWidth + "px"; newFillerBar.style.marginRight = this.settings.br.radius - this.borderWidth + "px"; newFillerBar.style.borderBottom = this.borderString; if(this.backgroundImage != "")
|
172
|
+
newFillerBar.style.backgroundPosition = "-" + (botMaxRadius + this.borderWidth) + "px -" + (this.boxHeight + (topMaxRadius + this.borderWidth)) + "px"; this.bottomContainer.appendChild(newFillerBar);}
|
173
|
+
}
|
174
|
+
break;}
|
175
|
+
}
|
176
|
+
}
|
177
|
+
if(this.settings.autoPad == true && this.boxPadding > 0)
|
178
|
+
{ var contentContainer = document.createElement("DIV"); contentContainer.style.position = "relative"; contentContainer.innerHTML = this.boxContent; contentContainer.className = "autoPadDiv"; var topPadding = Math.abs(topMaxRadius - this.boxPadding); var botPadding = Math.abs(botMaxRadius - this.boxPadding); if(topMaxRadius < this.boxPadding)
|
179
|
+
contentContainer.style.paddingTop = topPadding + "px"; if(botMaxRadius < this.boxPadding)
|
180
|
+
contentContainer.style.paddingBottom = botMaxRadius + "px"; contentContainer.style.paddingLeft = this.boxPadding + "px"; contentContainer.style.paddingRight = this.boxPadding + "px"; this.contentDIV = this.box.appendChild(contentContainer);}
|
181
|
+
}
|
182
|
+
this.drawPixel = function(intx, inty, colour, transAmount, height, newCorner, image, cornerRadius)
|
183
|
+
{ var pixel = document.createElement("DIV"); pixel.style.height = height + "px"; pixel.style.width = "1px"; pixel.style.position = "absolute"; pixel.style.fontSize = "1px"; pixel.style.overflow = "hidden"; var topMaxRadius = Math.max(this.settings["tr"].radius, this.settings["tl"].radius); if(image == -1 && this.backgroundImage != "")
|
184
|
+
{ pixel.style.backgroundImage = this.backgroundImage; pixel.style.backgroundPosition = "-" + (this.boxWidth - (cornerRadius - intx) + this.borderWidth) + "px -" + ((this.boxHeight + topMaxRadius + inty) -this.borderWidth) + "px";}
|
185
|
+
else
|
186
|
+
{ pixel.style.backgroundColor = colour;}
|
187
|
+
if (transAmount != 100)
|
188
|
+
setOpacity(pixel, transAmount); pixel.style.top = inty + "px"; pixel.style.left = intx + "px"; newCorner.appendChild(pixel);}
|
189
|
+
}
|
190
|
+
function insertAfter(parent, node, referenceNode)
|
191
|
+
{ parent.insertBefore(node, referenceNode.nextSibling);}
|
192
|
+
function BlendColour(Col1, Col2, Col1Fraction)
|
193
|
+
{ var red1 = parseInt(Col1.substr(1,2),16); var green1 = parseInt(Col1.substr(3,2),16); var blue1 = parseInt(Col1.substr(5,2),16); var red2 = parseInt(Col2.substr(1,2),16); var green2 = parseInt(Col2.substr(3,2),16); var blue2 = parseInt(Col2.substr(5,2),16); if(Col1Fraction > 1 || Col1Fraction < 0) Col1Fraction = 1; var endRed = Math.round((red1 * Col1Fraction) + (red2 * (1 - Col1Fraction))); if(endRed > 255) endRed = 255; if(endRed < 0) endRed = 0; var endGreen = Math.round((green1 * Col1Fraction) + (green2 * (1 - Col1Fraction))); if(endGreen > 255) endGreen = 255; if(endGreen < 0) endGreen = 0; var endBlue = Math.round((blue1 * Col1Fraction) + (blue2 * (1 - Col1Fraction))); if(endBlue > 255) endBlue = 255; if(endBlue < 0) endBlue = 0; return "#" + IntToHex(endRed)+ IntToHex(endGreen)+ IntToHex(endBlue);}
|
194
|
+
function IntToHex(strNum)
|
195
|
+
{ base = strNum / 16; rem = strNum % 16; base = base - (rem / 16); baseS = MakeHex(base); remS = MakeHex(rem); return baseS + '' + remS;}
|
196
|
+
function MakeHex(x)
|
197
|
+
{ if((x >= 0) && (x <= 9))
|
198
|
+
{ return x;}
|
199
|
+
else
|
200
|
+
{ switch(x)
|
201
|
+
{ case 10: return "A"; case 11: return "B"; case 12: return "C"; case 13: return "D"; case 14: return "E"; case 15: return "F";}
|
202
|
+
}
|
203
|
+
}
|
204
|
+
function pixelFraction(x, y, r)
|
205
|
+
{ var pixelfraction = 0; var xvalues = new Array(1); var yvalues = new Array(1); var point = 0; var whatsides = ""; var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(x,2))); if ((intersect >= y) && (intersect < (y+1)))
|
206
|
+
{ whatsides = "Left"; xvalues[point] = 0; yvalues[point] = intersect - y; point = point + 1;}
|
207
|
+
var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(y+1,2))); if ((intersect >= x) && (intersect < (x+1)))
|
208
|
+
{ whatsides = whatsides + "Top"; xvalues[point] = intersect - x; yvalues[point] = 1; point = point + 1;}
|
209
|
+
var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(x+1,2))); if ((intersect >= y) && (intersect < (y+1)))
|
210
|
+
{ whatsides = whatsides + "Right"; xvalues[point] = 1; yvalues[point] = intersect - y; point = point + 1;}
|
211
|
+
var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(y,2))); if ((intersect >= x) && (intersect < (x+1)))
|
212
|
+
{ whatsides = whatsides + "Bottom"; xvalues[point] = intersect - x; yvalues[point] = 0;}
|
213
|
+
switch (whatsides)
|
214
|
+
{ case "LeftRight":
|
215
|
+
pixelfraction = Math.min(yvalues[0],yvalues[1]) + ((Math.max(yvalues[0],yvalues[1]) - Math.min(yvalues[0],yvalues[1]))/2); break; case "TopRight":
|
216
|
+
pixelfraction = 1-(((1-xvalues[0])*(1-yvalues[1]))/2); break; case "TopBottom":
|
217
|
+
pixelfraction = Math.min(xvalues[0],xvalues[1]) + ((Math.max(xvalues[0],xvalues[1]) - Math.min(xvalues[0],xvalues[1]))/2); break; case "LeftBottom":
|
218
|
+
pixelfraction = (yvalues[0]*xvalues[1])/2; break; default:
|
219
|
+
pixelfraction = 1;}
|
220
|
+
return pixelfraction;}
|
221
|
+
function rgb2Hex(rgbColour)
|
222
|
+
{ try{ var rgbArray = rgb2Array(rgbColour); var red = parseInt(rgbArray[0]); var green = parseInt(rgbArray[1]); var blue = parseInt(rgbArray[2]); var hexColour = "#" + IntToHex(red) + IntToHex(green) + IntToHex(blue);}
|
223
|
+
catch(e){ alert("There was an error converting the RGB value to Hexadecimal in function rgb2Hex");}
|
224
|
+
return hexColour;}
|
225
|
+
function rgb2Array(rgbColour)
|
226
|
+
{ var rgbValues = rgbColour.substring(4, rgbColour.indexOf(")")); var rgbArray = rgbValues.split(", "); return rgbArray;}
|
227
|
+
function setOpacity(obj, opacity)
|
228
|
+
{ opacity = (opacity == 100)?99.999:opacity; if(isSafari && obj.tagName != "IFRAME")
|
229
|
+
{ var rgbArray = rgb2Array(obj.style.backgroundColor); var red = parseInt(rgbArray[0]); var green = parseInt(rgbArray[1]); var blue = parseInt(rgbArray[2]); obj.style.backgroundColor = "rgba(" + red + ", " + green + ", " + blue + ", " + opacity/100 + ")";}
|
230
|
+
else if(typeof(obj.style.opacity) != "undefined")
|
231
|
+
{ obj.style.opacity = opacity/100;}
|
232
|
+
else if(typeof(obj.style.MozOpacity) != "undefined")
|
233
|
+
{ obj.style.MozOpacity = opacity/100;}
|
234
|
+
else if(typeof(obj.style.filter) != "undefined")
|
235
|
+
{ obj.style.filter = "alpha(opacity:" + opacity + ")";}
|
236
|
+
else if(typeof(obj.style.KHTMLOpacity) != "undefined")
|
237
|
+
{ obj.style.KHTMLOpacity = opacity/100;}
|
238
|
+
}
|
239
|
+
function inArray(array, value)
|
240
|
+
{ for(var i = 0; i < array.length; i++){ if (array[i] === value) return i;}
|
241
|
+
return false;}
|
242
|
+
function inArrayKey(array, value)
|
243
|
+
{ for(key in array){ if(key === value) return true;}
|
244
|
+
return false;}
|
245
|
+
function addEvent(elm, evType, fn, useCapture) { if (elm.addEventListener) { elm.addEventListener(evType, fn, useCapture); return true;}
|
246
|
+
else if (elm.attachEvent) { var r = elm.attachEvent('on' + evType, fn); return r;}
|
247
|
+
else { elm['on' + evType] = fn;}
|
248
|
+
}
|
249
|
+
function removeEvent(obj, evType, fn, useCapture){ if (obj.removeEventListener){ obj.removeEventListener(evType, fn, useCapture); return true;} else if (obj.detachEvent){ var r = obj.detachEvent("on"+evType, fn); return r;} else { alert("Handler could not be removed");}
|
250
|
+
}
|
251
|
+
function format_colour(colour)
|
252
|
+
{ var returnColour = "#ffffff"; if(colour != "" && colour != "transparent")
|
253
|
+
{ if(colour.substr(0, 3) == "rgb")
|
254
|
+
{ returnColour = rgb2Hex(colour);}
|
255
|
+
else if(colour.length == 4)
|
256
|
+
{ returnColour = "#" + colour.substring(1, 2) + colour.substring(1, 2) + colour.substring(2, 3) + colour.substring(2, 3) + colour.substring(3, 4) + colour.substring(3, 4);}
|
257
|
+
else
|
258
|
+
{ returnColour = colour;}
|
259
|
+
}
|
260
|
+
return returnColour;}
|
261
|
+
function get_style(obj, property, propertyNS)
|
262
|
+
{ try
|
263
|
+
{ if(obj.currentStyle)
|
264
|
+
{ var returnVal = eval("obj.currentStyle." + property);}
|
265
|
+
else
|
266
|
+
{ if(isSafari && obj.style.display == "none")
|
267
|
+
{ obj.style.display = ""; var wasHidden = true;}
|
268
|
+
var returnVal = document.defaultView.getComputedStyle(obj, '').getPropertyValue(propertyNS); if(isSafari && wasHidden)
|
269
|
+
{ obj.style.display = "none";}
|
270
|
+
}
|
271
|
+
}
|
272
|
+
catch(e)
|
273
|
+
{ }
|
274
|
+
return returnVal;}
|
275
|
+
function getElementsByClass(searchClass, node, tag)
|
276
|
+
{ var classElements = new Array(); if(node == null)
|
277
|
+
node = document; if(tag == null)
|
278
|
+
tag = '*'; var els = node.getElementsByTagName(tag); var elsLen = els.length; var pattern = new RegExp("(^|\s)"+searchClass+"(\s|$)"); for (i = 0, j = 0; i < elsLen; i++)
|
279
|
+
{ if(pattern.test(els[i].className))
|
280
|
+
{ classElements[j] = els[i]; j++;}
|
281
|
+
}
|
282
|
+
return classElements;}
|
283
|
+
function newCurvyError(errorMessage)
|
284
|
+
{ return new Error("curvyCorners Error:\n" + errorMessage)
|
285
|
+
}
|
@@ -0,0 +1,138 @@
|
|
1
|
+
body {
|
2
|
+
background-color: #E1D1F1;
|
3
|
+
font-family: "Georgia", sans-serif;
|
4
|
+
font-size: 16px;
|
5
|
+
line-height: 1.6em;
|
6
|
+
padding: 1.6em 0 0 0;
|
7
|
+
color: #333;
|
8
|
+
}
|
9
|
+
h1, h2, h3, h4, h5, h6 {
|
10
|
+
color: #444;
|
11
|
+
}
|
12
|
+
h1 {
|
13
|
+
font-family: sans-serif;
|
14
|
+
font-weight: normal;
|
15
|
+
font-size: 4em;
|
16
|
+
line-height: 0.8em;
|
17
|
+
letter-spacing: -0.1ex;
|
18
|
+
margin: 5px;
|
19
|
+
}
|
20
|
+
li {
|
21
|
+
padding: 0;
|
22
|
+
margin: 0;
|
23
|
+
list-style-type: square;
|
24
|
+
}
|
25
|
+
a {
|
26
|
+
color: #5E5AFF;
|
27
|
+
background-color: #DAC;
|
28
|
+
font-weight: normal;
|
29
|
+
text-decoration: underline;
|
30
|
+
}
|
31
|
+
blockquote {
|
32
|
+
font-size: 90%;
|
33
|
+
font-style: italic;
|
34
|
+
border-left: 1px solid #111;
|
35
|
+
padding-left: 1em;
|
36
|
+
}
|
37
|
+
.caps {
|
38
|
+
font-size: 80%;
|
39
|
+
}
|
40
|
+
|
41
|
+
#main {
|
42
|
+
width: 45em;
|
43
|
+
padding: 0;
|
44
|
+
margin: 0 auto;
|
45
|
+
}
|
46
|
+
.coda {
|
47
|
+
text-align: right;
|
48
|
+
color: #77f;
|
49
|
+
font-size: smaller;
|
50
|
+
}
|
51
|
+
|
52
|
+
table {
|
53
|
+
font-size: 90%;
|
54
|
+
line-height: 1.4em;
|
55
|
+
color: #ff8;
|
56
|
+
background-color: #111;
|
57
|
+
padding: 2px 10px 2px 10px;
|
58
|
+
border-style: dashed;
|
59
|
+
}
|
60
|
+
|
61
|
+
th {
|
62
|
+
color: #fff;
|
63
|
+
}
|
64
|
+
|
65
|
+
td {
|
66
|
+
padding: 2px 10px 2px 10px;
|
67
|
+
}
|
68
|
+
|
69
|
+
.success {
|
70
|
+
color: #0CC52B;
|
71
|
+
}
|
72
|
+
|
73
|
+
.failed {
|
74
|
+
color: #E90A1B;
|
75
|
+
}
|
76
|
+
|
77
|
+
.unknown {
|
78
|
+
color: #995000;
|
79
|
+
}
|
80
|
+
pre, code {
|
81
|
+
font-family: monospace;
|
82
|
+
font-size: 90%;
|
83
|
+
line-height: 1.4em;
|
84
|
+
color: #ff8;
|
85
|
+
background-color: #111;
|
86
|
+
padding: 2px 10px 2px 10px;
|
87
|
+
}
|
88
|
+
.comment { color: #aaa; font-style: italic; }
|
89
|
+
.keyword { color: #eff; font-weight: bold; }
|
90
|
+
.punct { color: #eee; font-weight: bold; }
|
91
|
+
.symbol { color: #0bb; }
|
92
|
+
.string { color: #6b4; }
|
93
|
+
.ident { color: #ff8; }
|
94
|
+
.constant { color: #66f; }
|
95
|
+
.regex { color: #ec6; }
|
96
|
+
.number { color: #F99; }
|
97
|
+
.expr { color: #227; }
|
98
|
+
|
99
|
+
#version {
|
100
|
+
float: right;
|
101
|
+
text-align: right;
|
102
|
+
font-family: sans-serif;
|
103
|
+
font-weight: normal;
|
104
|
+
background-color: #B3ABFF;
|
105
|
+
color: #141331;
|
106
|
+
padding: 15px 20px 10px 20px;
|
107
|
+
margin: 0 auto;
|
108
|
+
margin-top: 15px;
|
109
|
+
border: 3px solid #141331;
|
110
|
+
}
|
111
|
+
|
112
|
+
#version .numbers {
|
113
|
+
display: block;
|
114
|
+
font-size: 4em;
|
115
|
+
line-height: 0.8em;
|
116
|
+
letter-spacing: -0.1ex;
|
117
|
+
margin-bottom: 15px;
|
118
|
+
}
|
119
|
+
|
120
|
+
#version p {
|
121
|
+
text-decoration: none;
|
122
|
+
color: #141331;
|
123
|
+
background-color: #B3ABFF;
|
124
|
+
margin: 0;
|
125
|
+
padding: 0;
|
126
|
+
}
|
127
|
+
|
128
|
+
#version a {
|
129
|
+
text-decoration: none;
|
130
|
+
color: #141331;
|
131
|
+
background-color: #B3ABFF;
|
132
|
+
}
|
133
|
+
|
134
|
+
.clickable {
|
135
|
+
cursor: pointer;
|
136
|
+
cursor: hand;
|
137
|
+
}
|
138
|
+
|
@@ -0,0 +1,48 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
2
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
3
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
4
|
+
<head>
|
5
|
+
<link rel="stylesheet" href="stylesheets/screen.css" type="text/css" media="screen" />
|
6
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
7
|
+
<title>
|
8
|
+
<%= title %>
|
9
|
+
</title>
|
10
|
+
<script src="javascripts/rounded_corners_lite.inc.js" type="text/javascript"></script>
|
11
|
+
<style>
|
12
|
+
|
13
|
+
</style>
|
14
|
+
<script type="text/javascript">
|
15
|
+
window.onload = function() {
|
16
|
+
settings = {
|
17
|
+
tl: { radius: 10 },
|
18
|
+
tr: { radius: 10 },
|
19
|
+
bl: { radius: 10 },
|
20
|
+
br: { radius: 10 },
|
21
|
+
antiAlias: true,
|
22
|
+
autoPad: true,
|
23
|
+
validTags: ["div"]
|
24
|
+
}
|
25
|
+
var versionBox = new curvyCorners(settings, document.getElementById("version"));
|
26
|
+
versionBox.applyCornersToAll();
|
27
|
+
}
|
28
|
+
</script>
|
29
|
+
</head>
|
30
|
+
<body>
|
31
|
+
<div id="main">
|
32
|
+
|
33
|
+
<h1><%= title %></h1>
|
34
|
+
<div id="version" class="clickable" onclick='document.location = "<%= download %>"; return false'>
|
35
|
+
<p>Get Version</p>
|
36
|
+
<a href="<%= download %>" class="numbers"><%= version %></a>
|
37
|
+
</div>
|
38
|
+
<%= body %>
|
39
|
+
<p class="coda">
|
40
|
+
<a href="">TODO</a>, <%= modified.pretty %><br>
|
41
|
+
Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
|
42
|
+
</p>
|
43
|
+
</div>
|
44
|
+
|
45
|
+
<!-- insert site tracking codes here, like Google Urchin -->
|
46
|
+
|
47
|
+
</body>
|
48
|
+
</html>
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
|
|
3
3
|
specification_version: 1
|
4
4
|
name: couchobject
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0
|
7
|
-
date: 2007-09-
|
6
|
+
version: 0.5.0
|
7
|
+
date: 2007-09-15 00:00:00 +02:00
|
8
8
|
summary: CouchObject is a library that maps ruby objects to CouchDb documents
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -35,6 +35,7 @@ files:
|
|
35
35
|
- README.txt
|
36
36
|
- Rakefile
|
37
37
|
- TODO
|
38
|
+
- bin/couch_ruby_view_requestor
|
38
39
|
- config/hoe.rb
|
39
40
|
- config/requirements.rb
|
40
41
|
- lib/couch_object.rb
|
@@ -42,6 +43,7 @@ files:
|
|
42
43
|
- lib/couch_object/document.rb
|
43
44
|
- lib/couch_object/model.rb
|
44
45
|
- lib/couch_object/persistable.rb
|
46
|
+
- lib/couch_object/proc_condition.rb
|
45
47
|
- lib/couch_object/response.rb
|
46
48
|
- lib/couch_object/server.rb
|
47
49
|
- lib/couch_object/utils.rb
|
@@ -51,6 +53,7 @@ files:
|
|
51
53
|
- script/console
|
52
54
|
- script/destroy
|
53
55
|
- script/generate
|
56
|
+
- script/txt2html
|
54
57
|
- setup.rb
|
55
58
|
- spec/database_spec.rb
|
56
59
|
- spec/document_spec.rb
|
@@ -59,6 +62,7 @@ files:
|
|
59
62
|
- spec/integration/integration_helper.rb
|
60
63
|
- spec/model_spec.rb
|
61
64
|
- spec/persistable_spec.rb
|
65
|
+
- spec/proc_condition_spec.rb
|
62
66
|
- spec/response_spec.rb
|
63
67
|
- spec/rspec_autotest.rb
|
64
68
|
- spec/server_spec.rb
|
@@ -70,6 +74,11 @@ files:
|
|
70
74
|
- tasks/environment.rake
|
71
75
|
- tasks/rspec.rake
|
72
76
|
- tasks/website.rake
|
77
|
+
- website/index.html
|
78
|
+
- website/index.txt
|
79
|
+
- website/javascripts/rounded_corners_lite.inc.js
|
80
|
+
- website/stylesheets/screen.css
|
81
|
+
- website/template.rhtml
|
73
82
|
test_files:
|
74
83
|
- spec/spec_helper.rb
|
75
84
|
rdoc_options:
|
@@ -80,8 +89,9 @@ extra_rdoc_files:
|
|
80
89
|
- License.txt
|
81
90
|
- Manifest.txt
|
82
91
|
- README.txt
|
83
|
-
|
84
|
-
|
92
|
+
- website/index.txt
|
93
|
+
executables:
|
94
|
+
- couch_ruby_view_requestor
|
85
95
|
extensions: []
|
86
96
|
|
87
97
|
requirements: []
|
@@ -96,3 +106,12 @@ dependencies:
|
|
96
106
|
- !ruby/object:Gem::Version
|
97
107
|
version: 1.1.1
|
98
108
|
version:
|
109
|
+
- !ruby/object:Gem::Dependency
|
110
|
+
name: ruby2ruby
|
111
|
+
version_requirement:
|
112
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: 1.1.7
|
117
|
+
version:
|