wbzyl-datamapper-tutorial 0.0.8 → 0.0.9

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.
Files changed (34) hide show
  1. data/README.markdown +9 -7
  2. data/Rakefile +8 -8
  3. data/VERSION.yml +4 -0
  4. data/config.ru +0 -5
  5. data/lib/config.ru +12 -0
  6. data/lib/datamapper-tutorial.rb +20 -5
  7. data/lib/public/doc/plain-text-files/contacts.yaml +11 -0
  8. data/lib/public/doc/plain-text-files/contacts_g.rb +105 -0
  9. data/lib/public/doc/plain-text-files/contacts_g_test.rb +51 -0
  10. data/lib/public/doc/plain-text-files/contacts_y.rb +57 -0
  11. data/lib/public/doc/plain-text-files/contacts_y_test.rb +39 -0
  12. data/lib/public/doc/plain-text-files/gdbm-example.rb +22 -0
  13. data/lib/public/doc/plain-text-files/gdbm_contacts/Ja/305/233_Ma/305/202gosia/extras +0 -0
  14. data/lib/public/doc/plain-text-files/gdbm_contacts/Ja/305/233_Ma/305/202gosia/home +0 -0
  15. data/lib/public/doc/plain-text-files/gdbm_contacts/Ja/305/233_Ma/305/202gosia/work +0 -0
  16. data/lib/public/doc/plain-text-files/gdbm_contacts/Joe_Smith/extras +0 -0
  17. data/lib/public/doc/plain-text-files/gdbm_contacts/Joe_Smith/home +0 -0
  18. data/lib/public/doc/plain-text-files/gdbm_contacts/Joe_Smith/work +0 -0
  19. data/lib/public/doc/using-plain-text-files-for-data-persistence.pdf +0 -0
  20. data/lib/public/images/datamapper.png +0 -0
  21. data/lib/public/images/datamapper.svg +95 -0
  22. data/lib/public/stylesheets/datamapper.css +160 -0
  23. data/lib/public/stylesheets/fonts/Cyklop-Italic.otf +0 -0
  24. data/lib/public/stylesheets/ie.css +1 -0
  25. data/lib/public/stylesheets/screen.css +48 -66
  26. data/lib/public/stylesheets/uv.css +121 -0
  27. data/lib/views/intro.rdiscount +10 -0
  28. data/lib/views/layout.rdiscount +28 -7
  29. data/lib/views/main.rdiscount +16 -6
  30. data/lib/views/using-plain-text-files-for-data-persistence.rdiscount +53 -0
  31. metadata +32 -12
  32. data/lib/public/Onyx_Mother_O_Pearl.html +0 -122
  33. data/lib/public/stylesheets/application.css +0 -113
  34. data/lib/public/stylesheets/coderay.css +0 -99
data/README.markdown CHANGED
@@ -2,16 +2,18 @@
2
2
 
3
3
  1. [pastie](http://www.dzone.com/links/datamapper_sinatra_tutorial.html),
4
4
  [pastie2](http://blog.zerosum.org/2008/7/2/clone-pastie-with-sinatra-datamapper-redux).
5
- 2. [ apps written in sinatra, uses datamapper](http://github.com/zapnap/mogo/)
5
+ 2. [apps written in sinatra, uses datamapper](http://github.com/zapnap/mogo/)
6
6
  3. [A simple Twitter application template, built in Ruby with
7
7
  Sinatra and DataMapper](http://github.com/zapnap/retweet/)
8
-
9
8
 
10
- ## Gotowce ze świata ActiveRecord
9
+ ## Data persistence
11
10
 
12
- 1. Wczytywanie dużych zbiorów danych testowych:
13
- gem faker.
11
+ 1. [using plain-text files for data persistence](/doc/using-plain-text-files-for-data-persistence.pdf)
12
+ 1. [ohm](http://ohm.keyvalue.org/) — Object-hash mapping library for
13
+ [Redis](http://code.google.com/p/redis/). Datamapper adapter for Redis:
14
+ [DataMapper loves Redis](http://whoahbot.com/2009/05/27/redis-and-datamapper.html)
15
+ \([source, example](http://github.com/whoahbot/dm-redis-adapter/)\).
14
16
 
15
- Wczytujemy: 10_000 rekordów: czas?
16
- 1_000_000 : czas?
17
+ ## Todo
17
18
 
19
+ 1. redis.spec for Fedora?
data/Rakefile CHANGED
@@ -13,13 +13,13 @@ Moje notatki do Datamappera.
13
13
  EOF
14
14
  s.summary = "Prosta aplikacja Sinatry."
15
15
 
16
- s.files = %w[TODO Rakefile config.ru VERSION.yml] + FileList["lib/**/*"]
16
+ s.files = %w[LICENSE TODO Rakefile config.ru VERSION.yml] + FileList["lib/**/*"]
17
17
 
18
18
  s.add_dependency 'rack'
19
19
  s.add_dependency 'sinatra'
20
20
  s.add_dependency 'rdiscount'
21
- s.add_dependency 'sinatra-rdiscount'
22
- s.add_dependency 'codehighlighter-middleware'
21
+ s.add_dependency 'wbzyl-sinatra-rdiscount'
22
+ s.add_dependency 'wbzyl-codehighlighter-middleware'
23
23
  s.add_dependency 'coderay'
24
24
 
25
25
  s.rubyforge_project = 'datamapper-tutorial'
@@ -31,8 +31,8 @@ rescue LoadError
31
31
  puts " sudo gem install technicalpickles-jeweler -s http://gems.github.com"
32
32
  end
33
33
 
34
- Rake::TestTask.new(:test) do |t|
35
- t.libs << 'lib' << 'test'
36
- t.pattern = 'test/**/*_test.rb'
37
- t.verbose = false
38
- end
34
+ #Rake::TestTask.new(:test) do |t|
35
+ # t.libs << 'lib' << 'test'
36
+ # t.pattern = 'test/**/*_test.rb'
37
+ # t.verbose = false
38
+ #end
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :minor: 0
3
+ :patch: 9
4
+ :major: 0
data/config.ru CHANGED
@@ -3,11 +3,6 @@
3
3
  $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/lib")
4
4
  require 'config'
5
5
 
6
- #FileUtils.mkdir_p 'log' unless File.exists?('log')
7
- #log = File.new("log/sinatra.log", "a")
8
- #STDOUT.reopen(log)
9
- #STDERR.reopen(log)
10
-
11
6
  # require 'rack/cache'
12
7
  # use Rack::Cache
13
8
  run WB_DatamapperTutorial
data/lib/config.ru ADDED
@@ -0,0 +1,12 @@
1
+ require 'datamapper-tutorial'
2
+
3
+ gem 'wbzyl-rack-codehighlighter'
4
+ require 'rack/codehighlighter'
5
+
6
+ gem 'ultraviolet'
7
+ require 'uv'
8
+
9
+ use Rack::ShowExceptions
10
+ use Rack::Lint
11
+ use Rack::Codehighlighter, :ultraviolet, :element => '//pre/code', :markdown => true
12
+ run WB::DatamapperTutorial.new
@@ -2,16 +2,25 @@
2
2
 
3
3
  # Zobacz przykład: http://gist.github.com/38605
4
4
 
5
- gem 'rdiscount'
6
- gem 'sinatra'
7
- gem 'wbzyl-sinatra-rdiscount'
5
+ #gem 'rdiscount'
6
+ #gem 'sinatra'
7
+
8
+ #gem 'wbzyl-sinatra-rdiscount'
9
+ #gem 'emk-sinatra-url-for'
10
+ #gem 'wbzyl-sinatra-static-assets'
8
11
 
9
12
  require 'rdiscount'
10
13
  require 'sinatra/base'
11
14
  require 'sinatra/rdiscount'
12
15
 
16
+ require 'sinatra/url_for'
17
+ require 'sinatra/static_assets'
18
+
13
19
  module WB
14
20
  class DatamapperTutorial < Sinatra::Base
21
+ helpers Sinatra::UrlForHelper
22
+ helpers Sinatra::StaticAssets
23
+
15
24
  # disable overriding public and views dirs
16
25
  set :app_file, __FILE__
17
26
  set :static, true
@@ -33,7 +42,14 @@ module WB
33
42
 
34
43
  # helper methods
35
44
 
36
- attr_accessor :title
45
+ def page_title
46
+ @title || ""
47
+ end
48
+
49
+ # def title=(name)... does not work, bug?
50
+ def title(name)
51
+ @title = " | #{name}"
52
+ end
37
53
 
38
54
  get '/' do
39
55
  rdiscount :main
@@ -53,4 +69,3 @@ module WB
53
69
  use Rack::Lint
54
70
  end
55
71
  end
56
-
@@ -0,0 +1,11 @@
1
+ ---
2
+ - !ruby/object:Contact
3
+ email: joe@somewhere.abc
4
+ extras:
5
+ :instrument: Cello
6
+ home:
7
+ :street1: 123 Main Street
8
+ :city: Somewhere
9
+ name: Joe Smith
10
+ work:
11
+ :phone: (000) 123-4567
@@ -0,0 +1,105 @@
1
+ require 'gdbm'
2
+ require 'fileutils'
3
+
4
+ class ContactList
5
+
6
+ attr_reader :contact_cache
7
+
8
+ def initialize(dir)
9
+ @dir = dir
10
+ @contact_cache = []
11
+ end
12
+
13
+ def [](name)
14
+ contact = @contact_cache.find {|c| c.name == name }
15
+ return contact if contact
16
+ contact = Contact.new(name)
17
+ Dir.chdir(@dir) do
18
+ if File.directory?(contact.dirname)
19
+ populate_contact(contact)
20
+ @contact_cache << contact
21
+ else
22
+ contact = nil
23
+ end
24
+ end
25
+ contact
26
+ end
27
+
28
+ def populate_contact(contact)
29
+ Dir.chdir(contact.dirname) do
30
+ contact.open
31
+ end
32
+ end
33
+
34
+ def <<(contact)
35
+ Dir.chdir(@dir) do
36
+ Dir.mkdir(contact.dirname) unless File.exists?(contact.dirname)
37
+ populate_contact(contact)
38
+ end
39
+ @contact_cache << contact
40
+ end
41
+
42
+ def delete(name)
43
+ contact = self[name]
44
+ return false unless contact
45
+ contact.close
46
+ Dir.chdir(@dir) do
47
+ FileUtils.rm_rf(contact.dirname)
48
+ end
49
+ contact_cache.delete_if {|c| c.name == name }
50
+ true
51
+ end
52
+
53
+ def directory_names
54
+ Dir["#{@dir}/*"]
55
+ end
56
+
57
+ def size
58
+ directory_names.size
59
+ end
60
+
61
+ def empty?
62
+ directory_names.empty?
63
+ end
64
+
65
+ end
66
+
67
+
68
+ class Contact
69
+
70
+ COMPONENTS = ["home", "extras", "work"]
71
+
72
+ attr_accessor :name, *COMPONENTS
73
+
74
+ attr_reader :dirname
75
+
76
+ def initialize(name)
77
+ @name = name
78
+ @dirname = @name.gsub(" ", "_")
79
+ end
80
+
81
+ def components
82
+ COMPONENTS.map {|comp_name| self.send(comp_name) }
83
+ end
84
+
85
+ def open
86
+ COMPONENTS.each do |component|
87
+ self.send(component + "=", GDBM.new(component))
88
+ end
89
+ end
90
+
91
+ def close
92
+ components.each do |component|
93
+ component.close unless component.closed?
94
+ end
95
+ end
96
+
97
+ def email
98
+ extras["email"]
99
+ end
100
+
101
+ def email=(e)
102
+ extras["email"] = e
103
+ end
104
+
105
+ end
@@ -0,0 +1,51 @@
1
+ require 'test/unit'
2
+ require 'contacts_g'
3
+
4
+ Dir.mkdir("gdbm_contacts") unless File.exist?("gdbm_contacts")
5
+
6
+ class GDBMTest < Test::Unit::TestCase
7
+
8
+ def setup
9
+ @list = ContactList.new("gdbm_contacts")
10
+ @contact = Contact.new("Joe Smith")
11
+
12
+ @list << @contact
13
+
14
+ @contact.home["street1"] = "123 Main Street"
15
+ @contact.home["city"] = "Somewhere"
16
+ @contact.work["phone"] = "(000) 123-4567"
17
+ @contact.extras["instrument"] = "Cello"
18
+ @contact.email = "joe@somewhere.abc"
19
+ end
20
+
21
+ def teardown
22
+ @list.delete("Joe Smith") if @list["Joe Smith"]
23
+ end
24
+
25
+ def test_retrieving_a_contact_from_list
26
+ contact = @list["Joe Smith"]
27
+ assert_equal("Joe Smith", contact.name)
28
+ end
29
+
30
+ def test_delete_a_contact_from_list
31
+ assert(!@list.empty?)
32
+ @list.delete("Joe Smith")
33
+ assert(@list.empty?)
34
+ assert(@list.contact_cache.empty?)
35
+ end
36
+
37
+ def test_home
38
+ contact = @list["Joe Smith"]
39
+ assert_equal("123 Main Street", contact.home["street1"])
40
+ end
41
+
42
+ def test_email
43
+ contact = @list["Joe Smith"]
44
+ assert_equal("joe@somewhere.abc", contact.email)
45
+ end
46
+
47
+ def test_non_existent_contact_is_nil
48
+ assert_equal(nil, @list["Some Person"])
49
+ end
50
+
51
+ end
@@ -0,0 +1,57 @@
1
+ require "yaml"
2
+
3
+ class ContactList
4
+ attr_accessor :contacts
5
+
6
+ def initialize(file)
7
+ @file = file
8
+ @contacts = []
9
+ end
10
+
11
+ def <<(contact)
12
+ @contacts << contact
13
+ end
14
+
15
+ def delete(name)
16
+ @contacts.delete_if {|c| c.name == name }
17
+ end
18
+
19
+ def empty?
20
+ @contacts.empty?
21
+ end
22
+
23
+ def size
24
+ @contacts.size
25
+ end
26
+
27
+ def [](name)
28
+ @contacts.find {|c| c.name == name }
29
+ end
30
+
31
+ def save
32
+ File.open(@file, "w") do |fh|
33
+ fh.puts(@contacts.to_yaml)
34
+ end
35
+ end
36
+
37
+ def self.load(file)
38
+ list = new(file)
39
+ list.contacts = YAML.load(File.read(file))
40
+ list
41
+ end
42
+
43
+ end
44
+
45
+
46
+ class Contact
47
+ attr_reader :name, :email, :home, :work, :extras
48
+ attr_writer :name, :email
49
+
50
+ def initialize(name)
51
+ @name = name
52
+ @home = {}
53
+ @work = {}
54
+ @extras = {}
55
+ end
56
+
57
+ end
@@ -0,0 +1,39 @@
1
+ require "test/unit"
2
+ require "contacts_y"
3
+
4
+ class TestContacts < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @filename = "contacts.yaml"
8
+ @list = ContactList.new(@filename)
9
+ @contact = Contact.new("Joe Smith")
10
+
11
+ @contact.email = "joe@somewhere.abc"
12
+ @contact.home[:street1] = "123 Main Street"
13
+ @contact.home[:city] = "Somewhere"
14
+ @contact.work[:phone] = "(000) 123-4567"
15
+ @contact.extras[:instrument] = "Cello"
16
+
17
+ @list << @contact
18
+ end
19
+
20
+ def test_retrieve_contact_from_list
21
+ contact = @list["Joe Smith"]
22
+ assert_equal("Joe Smith", contact.name)
23
+ end
24
+
25
+ def test_delete_contact_from_list
26
+ assert(!@list.empty?)
27
+ @list.delete(@contact.name)
28
+ assert(@list.empty?)
29
+ end
30
+
31
+ def test_save_and_load_list
32
+ @list.save
33
+ relist = ContactList.load(@filename)
34
+ assert_equal(1, relist.size)
35
+ contact = relist["Joe Smith"]
36
+ assert_equal("Joe Smith", contact.name)
37
+ end
38
+
39
+ end
@@ -0,0 +1,22 @@
1
+ require 'gdbm'
2
+
3
+ movies = GDBM.new("movies.db")
4
+
5
+ movies.update(
6
+ { "Vertigo" => "Alfred Hitchcock",
7
+ "In a Lonely Place" => "Nicholas Ray",
8
+ "Johnny Guitar" => "Nicholas Ray",
9
+ "Touch of Evil" => "Orson Welles",
10
+ "Psycho" => "Alfred Hitchcock",
11
+ })
12
+
13
+ movies.close
14
+
15
+ __END__
16
+
17
+ # irb session
18
+
19
+ require "gdbm"
20
+
21
+ movies = GDBM.new("movies.db")
22
+ movies.values.uniq