nosql-tutorial 0.1.0 → 0.1.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.
- data/README.markdown +25 -14
- data/Rakefile +2 -2
- data/VERSION.yml +2 -2
- data/lib/public/doc/activerecord/000-activerecord.rb +77 -0
- data/lib/public/doc/activerecord/100-datamapper.rb +60 -0
- data/lib/public/doc/activerecord/activerecord_spec_helper.rb +13 -0
- data/lib/public/doc/activerecord/datamapper_spec_helper.rb +15 -0
- data/lib/public/doc/couchdb/blog-inline.rb +60 -0
- data/lib/public/doc/couchdb/collseq.rb +22 -0
- data/lib/public/doc/datamapper/000-sqlite3.rb +65 -0
- data/lib/public/doc/datamapper/001-ale-kino.rb +69 -0
- data/lib/public/doc/datamapper/010-postgres.rb +95 -0
- data/lib/public/doc/datamapper/bug.rb +25 -0
- data/lib/public/doc/mail/mail-20.rb +40 -0
- data/lib/public/doc/mail/mail-21.rb +62 -0
- data/lib/public/doc/mail/mail-gmail.rb +34 -0
- data/lib/public/doc/mail/private.yaml +7 -0
- data/lib/public/doc/mail/swistak.jpeg +0 -0
- data/lib/public/images/kumkwat.jpg +0 -0
- data/lib/public/stylesheets/nosql.css +8 -0
- data/lib/views/blogi.rdiscount +5 -0
- data/lib/views/couchdb-couchapp.rdiscount +83 -0
- data/lib/views/couchdb-crud.rdiscount +205 -0
- data/lib/views/couchdb-futon.rdiscount +116 -0
- data/lib/views/couchdb-ruby.rdiscount +53 -0
- data/lib/views/couchdb-views.rdiscount +162 -0
- data/lib/views/couchdb.rdiscount +122 -0
- data/lib/views/main.rdiscount +55 -12
- data/lib/views/summary.rdiscount +52 -3
- data/lib/views/zadania.rdiscount +9 -0
- metadata +30 -6
data/README.markdown
CHANGED
@@ -1,20 +1,31 @@
|
|
1
|
-
# Not Only SQL
|
1
|
+
# NOSQL – Not Only SQL
|
2
2
|
|
3
|
-
|
3
|
+
Gem z notatkami do wykładu „Utrwalanie Danych”.
|
4
4
|
|
5
|
-
### Jakieś aplikacje:
|
6
5
|
|
7
|
-
|
8
|
-
[pastie2](http://blog.zerosum.org/2008/7/2/clone-pastie-with-sinatra-datamapper-redux).
|
9
|
-
2. [apps written in sinatra, uses datamapper](http://github.com/zapnap/mogo/)
|
10
|
-
3. [A simple Twitter application template, built in Ruby with
|
11
|
-
Sinatra and DataMapper](http://github.com/zapnap/retweet/)
|
6
|
+
## Instalacja
|
12
7
|
|
13
|
-
|
8
|
+
Wykonać polecenie:
|
14
9
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
10
|
+
gem install nosql-tutorial
|
11
|
+
|
12
|
+
|
13
|
+
## Uruchamianie
|
14
|
+
|
15
|
+
Sprawdzamy gdzie w systemie został zainstalowany gem *nosql-tutorial*:
|
16
|
+
|
17
|
+
gem which nosql-tutorial
|
18
|
+
|
19
|
+
Aplikację uruchamiamy w taki sposób:
|
20
|
+
|
21
|
+
<pre>rackup /«<i>ścieżka do katalogu z gemem</i>»/lib/config.ru -p «<i>numer portu</i>»
|
22
|
+
</pre>
|
23
|
+
|
24
|
+
Na przykład:
|
25
|
+
|
26
|
+
rackup rackup /usr/lib/ruby/gems/1.8/gems/nosql-tutorial-0.0.0.0/lib/config.ru -p 8098
|
27
|
+
|
28
|
+
Po uruchomieniu aplikacja jest dostępna z URL:
|
29
|
+
|
30
|
+
http://localhost:8098/
|
19
31
|
|
20
|
-
1. redis.spec for Fedora rpm?
|
data/Rakefile
CHANGED
@@ -18,11 +18,11 @@ Notatki do wykładu Utrwalanie Danych.
|
|
18
18
|
s.files = %w[Rakefile README.markdown VERSION.yml] + FileList["lib/**/*"]
|
19
19
|
|
20
20
|
s.add_runtime_dependency 'rack'
|
21
|
-
s.add_runtime_dependency 'sinatra'
|
21
|
+
s.add_runtime_dependency 'sinatra', '0.9.4'
|
22
22
|
s.add_runtime_dependency 'rdiscount'
|
23
23
|
s.add_runtime_dependency 'ultraviolet'
|
24
24
|
s.add_runtime_dependency 'rack-codehighlighter'
|
25
|
-
s.add_runtime_dependency 'sinatra-rdiscount'
|
25
|
+
s.add_runtime_dependency 'sinatra-rdiscount', '0.9.4.0'
|
26
26
|
s.add_runtime_dependency 'sinatra-static-assets'
|
27
27
|
|
28
28
|
s.rubyforge_project = 'nosql'
|
data/VERSION.yml
CHANGED
@@ -0,0 +1,77 @@
|
|
1
|
+
# run with:
|
2
|
+
#
|
3
|
+
# clear && spec -c -f specdoc 000-activerecord.rb
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
require 'spec'
|
7
|
+
require 'active_record'
|
8
|
+
|
9
|
+
require 'activerecord_spec_helper'
|
10
|
+
|
11
|
+
#ActiveRecord::Base.logger = Logger.new(STDOUT)
|
12
|
+
|
13
|
+
ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
|
14
|
+
#ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => 'test.sqlite3')
|
15
|
+
|
16
|
+
class CreateStuff < ActiveRecord::Migration
|
17
|
+
def self.up
|
18
|
+
create_table :dogs do |t|
|
19
|
+
t.string :name, :null => false
|
20
|
+
end
|
21
|
+
create_table :toys do |t|
|
22
|
+
t.string :name, :null => false
|
23
|
+
end
|
24
|
+
create_table :dog_toys do |t|
|
25
|
+
t.integer :dog_id, :null => false
|
26
|
+
t.integer :toy_id, :null => false
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.down
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
CreateStuff.migrate :up
|
35
|
+
|
36
|
+
class Dog < ActiveRecord::Base
|
37
|
+
validates_presence_of :name
|
38
|
+
validates_uniqueness_of :name
|
39
|
+
|
40
|
+
has_many :dog_toys
|
41
|
+
has_many :toys, :through => :dog_toys
|
42
|
+
end
|
43
|
+
|
44
|
+
class DogToy < ActiveRecord::Base
|
45
|
+
belongs_to :dog
|
46
|
+
belongs_to :toy
|
47
|
+
end
|
48
|
+
|
49
|
+
class Toy < ActiveRecord::Base
|
50
|
+
has_many :dog_toys
|
51
|
+
has_many :dogs, :through => :dog_toys
|
52
|
+
end
|
53
|
+
|
54
|
+
describe Dog do
|
55
|
+
|
56
|
+
it 'requires a name' do
|
57
|
+
Dog.create(:name => nil ).should_not be_valid
|
58
|
+
Dog.create(:name => '' ).should_not be_valid
|
59
|
+
Dog.create(:name => 'Rover').should be_valid
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'requires unique name' do
|
63
|
+
Dog.create(:name => 'Rover').should be_valid
|
64
|
+
Dog.create(:name => 'Rover').should_not be_valid
|
65
|
+
Dog.create(:name => 'Spot' ).should be_valid
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'has many toys' do
|
69
|
+
rover = Dog.create(:name => 'Rover')
|
70
|
+
rover.toys.should be_empty
|
71
|
+
|
72
|
+
rover.toys.create :name => 'Squeeky Toy'
|
73
|
+
rover.toys.length.should == 1
|
74
|
+
rover.toys.first.name.should == 'Squeeky Toy'
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# run with:
|
3
|
+
#
|
4
|
+
# clear && spec -c -f specdoc 100-datamapper.rb
|
5
|
+
|
6
|
+
require 'rubygems'
|
7
|
+
require 'spec'
|
8
|
+
require 'dm-core'
|
9
|
+
require 'dm-validations'
|
10
|
+
|
11
|
+
require 'datamapper_spec_helper'
|
12
|
+
|
13
|
+
#DataMapper::Logger.new(STDOUT, :debug)
|
14
|
+
|
15
|
+
class Dog
|
16
|
+
include DataMapper::Resource
|
17
|
+
|
18
|
+
property :id, Serial
|
19
|
+
property :name, String, :required => true, :unique => true
|
20
|
+
|
21
|
+
has n, :toys, :through => Resource
|
22
|
+
end
|
23
|
+
|
24
|
+
class Toy
|
25
|
+
include DataMapper::Resource
|
26
|
+
|
27
|
+
property :id, Serial
|
28
|
+
property :name, String, :required => true, :unique => true
|
29
|
+
end
|
30
|
+
|
31
|
+
DataMapper.setup :default, 'sqlite3::memory:'
|
32
|
+
#DataMapper.setup :default, 'sqlite3:test.sqlite3'
|
33
|
+
|
34
|
+
|
35
|
+
DataMapper.auto_migrate!
|
36
|
+
|
37
|
+
describe Dog do
|
38
|
+
|
39
|
+
it 'requires a name' do
|
40
|
+
Dog.create(:name => nil ).should_not be_valid
|
41
|
+
Dog.create(:name => '' ).should_not be_valid
|
42
|
+
Dog.create(:name => 'Rover').should be_valid
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'requires unique name' do
|
46
|
+
Dog.create(:name => 'Rover').should be_valid
|
47
|
+
Dog.create(:name => 'Rover').should_not be_valid
|
48
|
+
Dog.create(:name => 'Spot' ).should be_valid
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'has many toys' do
|
52
|
+
rover = Dog.create(:name => 'Rover')
|
53
|
+
rover.toys.should be_empty
|
54
|
+
|
55
|
+
rover.toys.create :name => 'Squeeky Toy'
|
56
|
+
rover.toys.length.should == 1
|
57
|
+
rover.toys.first.name.should == 'Squeeky Toy'
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# ActiveRecord transactional specs (without Rails)
|
2
|
+
Spec::Runner.configure do |config|
|
3
|
+
config.before do
|
4
|
+
ActiveRecord::Base.connection.begin_db_transaction
|
5
|
+
ActiveRecord::Base.connection.increment_open_transactions
|
6
|
+
end
|
7
|
+
config.after do
|
8
|
+
if ActiveRecord::Base.connection.open_transactions != 0
|
9
|
+
ActiveRecord::Base.connection.rollback_db_transaction
|
10
|
+
ActiveRecord::Base.connection.decrement_open_transactions
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
def transactional_specs rspec_config
|
2
|
+
rspec_config.before do
|
3
|
+
@_spec_transaction = DataMapper::Transaction.new DataMapper.repository(:default).adapter
|
4
|
+
@_spec_transaction.begin
|
5
|
+
DataMapper.repository(:default).adapter.push_transaction @_spec_transaction
|
6
|
+
end
|
7
|
+
rspec_config.after do
|
8
|
+
DataMapper.repository(:default).adapter.pop_transaction
|
9
|
+
@_spec_transaction.rollback
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
Spec::Runner.configure do |config|
|
14
|
+
transactional_specs(config)
|
15
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'restclient'
|
5
|
+
require 'json'
|
6
|
+
|
7
|
+
post1 = {
|
8
|
+
"author" => "jacek",
|
9
|
+
"title" => "Rails 2",
|
10
|
+
"content" => "Bla bla…",
|
11
|
+
"comments" => [
|
12
|
+
{"author" => "agatka", "content" => "…"},
|
13
|
+
{"author" => "bolek", "content" => "…"}
|
14
|
+
]
|
15
|
+
}
|
16
|
+
|
17
|
+
post2 = {
|
18
|
+
"author" => "jacek",
|
19
|
+
"title" => "Rails 3",
|
20
|
+
"content" => "Bla bla bla…",
|
21
|
+
"comments" => [
|
22
|
+
{"author" => "lolek", "content" => "…"},
|
23
|
+
{"author" => "bolek", "content" => "…"}
|
24
|
+
]
|
25
|
+
}
|
26
|
+
|
27
|
+
post3 = {
|
28
|
+
"author" => "agatka",
|
29
|
+
"title" => "Sinatra 1.0",
|
30
|
+
"content" => "Bla…",
|
31
|
+
"comments" => [
|
32
|
+
{"author" => "jacek", "content" => "…"},
|
33
|
+
{"author" => "lolek", "content" => "…"},
|
34
|
+
{"author" => "bolek", "content" => "…"}
|
35
|
+
]
|
36
|
+
}
|
37
|
+
|
38
|
+
DB="http://127.0.0.1:5984/blog"
|
39
|
+
|
40
|
+
RestClient.delete DB rescue nil
|
41
|
+
|
42
|
+
RestClient.put "#{DB}", ""
|
43
|
+
|
44
|
+
RestClient.put "#{DB}/01", post1.to_json
|
45
|
+
RestClient.put "#{DB}/02", post2.to_json
|
46
|
+
RestClient.put "#{DB}/03", post3.to_json
|
47
|
+
|
48
|
+
__END__
|
49
|
+
|
50
|
+
RestClient.put "#{DB}/_design/test", <<EOS
|
51
|
+
{
|
52
|
+
"views":{
|
53
|
+
"one":{
|
54
|
+
"map":"function (doc) { emit(doc.x,null); }"
|
55
|
+
}
|
56
|
+
}
|
57
|
+
}
|
58
|
+
EOS
|
59
|
+
|
60
|
+
puts RestClient.get("#{DB}/_design/test/_view/one")
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# file: collseq.rb
|
2
|
+
require 'rubygems'
|
3
|
+
require 'restclient'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
DB="http://127.0.0.1:5984/collator"
|
7
|
+
RestClient.delete DB rescue nil
|
8
|
+
RestClient.put "#{DB}",""
|
9
|
+
(32..126).each do |c|
|
10
|
+
RestClient.put "#{DB}/#{c.to_s(16)}", {"x"=>c.chr}.to_json
|
11
|
+
end
|
12
|
+
RestClient.put "#{DB}/_design/test", <<EOS
|
13
|
+
{
|
14
|
+
"views":{
|
15
|
+
"one":{
|
16
|
+
"map":"function (doc) { emit(doc.x,null); }"
|
17
|
+
}
|
18
|
+
}
|
19
|
+
}
|
20
|
+
EOS
|
21
|
+
puts RestClient.get("#{DB}/_design/test/_view/one")
|
22
|
+
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'dm-core'
|
3
|
+
|
4
|
+
DataMapper.setup(:default,'sqlite3:test.sqlite3')
|
5
|
+
|
6
|
+
log = DataMapper::Logger.new(STDOUT, :debug)
|
7
|
+
|
8
|
+
log.push "==== hello datamapper"
|
9
|
+
|
10
|
+
class Post
|
11
|
+
include DataMapper::Resource
|
12
|
+
|
13
|
+
property :id, Serial
|
14
|
+
property :title, String
|
15
|
+
property :body, Text
|
16
|
+
property :created_at, DateTime
|
17
|
+
|
18
|
+
has n, :comments
|
19
|
+
end
|
20
|
+
|
21
|
+
class Comment
|
22
|
+
include DataMapper::Resource
|
23
|
+
|
24
|
+
property :id, Serial
|
25
|
+
property :posted_by, String
|
26
|
+
property :email, String
|
27
|
+
property :url, String
|
28
|
+
property :body, Text
|
29
|
+
|
30
|
+
belongs_to :post
|
31
|
+
end
|
32
|
+
|
33
|
+
class Category
|
34
|
+
include DataMapper::Resource
|
35
|
+
|
36
|
+
property :id, Serial
|
37
|
+
property :name, String
|
38
|
+
end
|
39
|
+
|
40
|
+
class Categorization
|
41
|
+
include DataMapper::Resource
|
42
|
+
|
43
|
+
property :id, Serial
|
44
|
+
property :created_at, DateTime
|
45
|
+
|
46
|
+
belongs_to :category
|
47
|
+
belongs_to :post
|
48
|
+
end
|
49
|
+
|
50
|
+
class Post
|
51
|
+
has n, :categorizations
|
52
|
+
has n, :categories, :through => :categorizations
|
53
|
+
end
|
54
|
+
|
55
|
+
class Category
|
56
|
+
has n, :categorizations
|
57
|
+
has n, :posts, :through => :categorizations
|
58
|
+
end
|
59
|
+
|
60
|
+
# Post.auto_migrate!
|
61
|
+
# Category.auto_migrate!
|
62
|
+
# Comment.auto_migrate!
|
63
|
+
# Categorization.auto_migrate!
|
64
|
+
|
65
|
+
DataMapper.auto_migrate!
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'dm-core'
|
5
|
+
require 'dm-timestamps'
|
6
|
+
require 'extlib'
|
7
|
+
|
8
|
+
Extlib::Inflection.plural_word 'film', 'filmy'
|
9
|
+
Extlib::Inflection.plural_word 'recenzja', 'recenzje'
|
10
|
+
Extlib::Inflection.plural_word 'kino', 'kina'
|
11
|
+
|
12
|
+
Extlib::Inflection.plural_word 'sesja', 'sesje'
|
13
|
+
# bug:
|
14
|
+
# jeśli nazwa modelu kończy się na 's', to
|
15
|
+
# datamapper głupieje, np.:
|
16
|
+
# Extlib::Inflection.plural_word 'seans', 'seanse'
|
17
|
+
|
18
|
+
DataMapper.setup :default, 'sqlite3:ale-kino.sqlite3'
|
19
|
+
|
20
|
+
log = DataMapper::Logger.new(STDOUT, :debug)
|
21
|
+
|
22
|
+
#log.push "==== hello datamapper"
|
23
|
+
|
24
|
+
class Film
|
25
|
+
include DataMapper::Resource
|
26
|
+
property :id, Serial
|
27
|
+
property :name, String
|
28
|
+
property :minutes, Integer
|
29
|
+
property :average_stars, Float
|
30
|
+
timestamps :at
|
31
|
+
|
32
|
+
has n, :recenzja
|
33
|
+
has n, :sesja
|
34
|
+
has n, :kino, :through => :sesja
|
35
|
+
end
|
36
|
+
|
37
|
+
class Recenzja
|
38
|
+
include DataMapper::Resource
|
39
|
+
property :id, Serial
|
40
|
+
property :author_name, String
|
41
|
+
property :stars, Integer
|
42
|
+
property :content, Text
|
43
|
+
timestamps :at
|
44
|
+
|
45
|
+
belongs_to :film
|
46
|
+
end
|
47
|
+
|
48
|
+
class Kino
|
49
|
+
include DataMapper::Resource
|
50
|
+
property :id, Serial
|
51
|
+
property :name, String
|
52
|
+
timestamps :at
|
53
|
+
|
54
|
+
has n, :sesja
|
55
|
+
has n, :film, :through => :sesja
|
56
|
+
end
|
57
|
+
|
58
|
+
class Sesja
|
59
|
+
include DataMapper::Resource
|
60
|
+
property :id, Serial
|
61
|
+
property :starts_on, Date
|
62
|
+
property :ends_on, Date
|
63
|
+
timestamps :at
|
64
|
+
|
65
|
+
belongs_to :kino
|
66
|
+
belongs_to :film
|
67
|
+
end
|
68
|
+
|
69
|
+
DataMapper.auto_migrate!
|