ki 0.3.3 → 0.4.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.
Files changed (170) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.rspec +1 -1
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/Gemfile +2 -21
  7. data/Gemfile.lock +60 -100
  8. data/Guardfile +1 -1
  9. data/LICENSE.md +21 -0
  10. data/README.md +63 -0
  11. data/Rakefile +3 -45
  12. data/bin/ki +1 -1
  13. data/ki.gemspec +31 -137
  14. data/lib/ki.rb +21 -21
  15. data/lib/ki/api_error.rb +28 -0
  16. data/lib/ki/base_request.rb +34 -0
  17. data/lib/ki/helpers.rb +55 -0
  18. data/lib/ki/ki.rb +40 -0
  19. data/lib/ki/ki_cli.rb +46 -0
  20. data/lib/ki/ki_config.rb +20 -0
  21. data/lib/ki/middleware.rb +155 -0
  22. data/lib/ki/model.rb +70 -0
  23. data/lib/{modules → ki/modules}/callbacks.rb +0 -0
  24. data/lib/ki/modules/format_of.rb +10 -0
  25. data/lib/{modules → ki/modules}/model_helpers.rb +0 -12
  26. data/lib/ki/modules/public_file_helper.rb +13 -0
  27. data/lib/ki/modules/query_interface.rb +36 -0
  28. data/lib/{modules → ki/modules}/restrictions.rb +0 -30
  29. data/lib/ki/modules/view_helper.rb +13 -0
  30. data/lib/ki/orm.rb +65 -0
  31. data/lib/ki/version.rb +3 -0
  32. data/spec/examples/base/.ruby-gemset +1 -0
  33. data/spec/examples/base/.ruby-version +1 -0
  34. data/spec/examples/base/Gemfile +4 -0
  35. data/spec/examples/base/app.rb +1 -0
  36. data/{examples → spec/examples}/base/config.ru +0 -3
  37. data/spec/examples/base/config.yml +17 -0
  38. data/spec/examples/base/public/favicon.ico +0 -0
  39. data/spec/examples/base/public/javascripts/.gitkeep +0 -0
  40. data/spec/examples/base/public/stylesheets/.gitkeep +0 -0
  41. data/spec/examples/base/views/index.haml +6 -0
  42. data/spec/examples/couch-lock/.ruby-gemset +1 -0
  43. data/spec/examples/couch-lock/.ruby-version +1 -0
  44. data/spec/examples/couch-lock/Gemfile +4 -0
  45. data/spec/examples/couch-lock/Gemfile.lock +48 -0
  46. data/spec/examples/couch-lock/app.rb +42 -0
  47. data/spec/examples/couch-lock/config.ru +3 -0
  48. data/spec/examples/couch-lock/config.yml +17 -0
  49. data/spec/examples/couch-lock/install.sh +3 -0
  50. data/spec/examples/couch-lock/public/favicon.ico +0 -0
  51. data/spec/examples/couch-lock/public/javascripts/.gitkeep +0 -0
  52. data/spec/examples/couch-lock/public/stylesheets/.gitkeep +0 -0
  53. data/spec/examples/couch-lock/views/index.haml +18 -0
  54. data/spec/examples/json.northpole.ro/.ruby-gemset +1 -0
  55. data/spec/examples/json.northpole.ro/.ruby-version +1 -0
  56. data/spec/examples/json.northpole.ro/Capfile +25 -0
  57. data/spec/examples/json.northpole.ro/Gemfile +6 -0
  58. data/spec/examples/json.northpole.ro/Gemfile.lock +68 -0
  59. data/spec/examples/json.northpole.ro/app.rb +79 -0
  60. data/spec/examples/json.northpole.ro/client.rb +25 -0
  61. data/spec/examples/json.northpole.ro/config.ru +3 -0
  62. data/spec/examples/json.northpole.ro/config.yml +17 -0
  63. data/spec/examples/json.northpole.ro/config/deploy.rb +59 -0
  64. data/spec/examples/json.northpole.ro/config/deploy/production.rb +39 -0
  65. data/spec/examples/json.northpole.ro/foo.rb +10 -0
  66. data/spec/examples/json.northpole.ro/public/JNorthPole.jar +0 -0
  67. data/spec/examples/json.northpole.ro/public/favicon.ico +0 -0
  68. data/spec/examples/json.northpole.ro/public/font/FontAwesome.otf +0 -0
  69. data/spec/examples/json.northpole.ro/public/font/fontawesome-webfont.eot +0 -0
  70. data/spec/examples/json.northpole.ro/public/font/fontawesome-webfont.svg +284 -0
  71. data/spec/examples/json.northpole.ro/public/font/fontawesome-webfont.ttf +0 -0
  72. data/spec/examples/json.northpole.ro/public/font/fontawesome-webfont.woff +0 -0
  73. data/spec/examples/json.northpole.ro/public/images/bear.png +0 -0
  74. data/spec/examples/json.northpole.ro/public/images/bg.png +0 -0
  75. data/spec/examples/json.northpole.ro/public/images/cloud.png +0 -0
  76. data/spec/examples/json.northpole.ro/public/images/dotnet.png +0 -0
  77. data/spec/examples/json.northpole.ro/public/images/dotnet_small.png +0 -0
  78. data/spec/examples/json.northpole.ro/public/images/footer.png +0 -0
  79. data/spec/examples/json.northpole.ro/public/images/glyphicons-halflings-white.png +0 -0
  80. data/spec/examples/json.northpole.ro/public/images/glyphicons-halflings.png +0 -0
  81. data/spec/examples/json.northpole.ro/public/images/ice.png +0 -0
  82. data/spec/examples/json.northpole.ro/public/images/java.png +0 -0
  83. data/spec/examples/json.northpole.ro/public/images/java_small.png +0 -0
  84. data/spec/examples/json.northpole.ro/public/images/json.png +0 -0
  85. data/spec/examples/json.northpole.ro/public/images/json_small.png +0 -0
  86. data/spec/examples/json.northpole.ro/public/images/logo.png +0 -0
  87. data/spec/examples/json.northpole.ro/public/images/mobile.png +0 -0
  88. data/spec/examples/json.northpole.ro/public/images/php.png +0 -0
  89. data/spec/examples/json.northpole.ro/public/images/php_small.png +0 -0
  90. data/spec/examples/json.northpole.ro/public/images/python.png +0 -0
  91. data/spec/examples/json.northpole.ro/public/images/python_small.png +0 -0
  92. data/spec/examples/json.northpole.ro/public/images/ruby.png +0 -0
  93. data/spec/examples/json.northpole.ro/public/images/ruby_small.png +0 -0
  94. data/spec/examples/json.northpole.ro/public/images/shell.png +0 -0
  95. data/spec/examples/json.northpole.ro/public/images/shell_small.png +0 -0
  96. data/spec/examples/json.northpole.ro/public/javascripts/analytics.js +9 -0
  97. data/spec/examples/json.northpole.ro/public/javascripts/app.coffee +133 -0
  98. data/spec/examples/json.northpole.ro/public/javascripts/docs.min.js +16 -0
  99. data/spec/examples/json.northpole.ro/public/javascripts/jnorthpole.coffee +34 -0
  100. data/spec/examples/json.northpole.ro/public/javascripts/util.coffee +31 -0
  101. data/spec/examples/json.northpole.ro/public/stylesheets/app.sass +23 -0
  102. data/spec/examples/json.northpole.ro/public/stylesheets/application.sass +222 -0
  103. data/spec/examples/json.northpole.ro/public/stylesheets/cover.css +154 -0
  104. data/spec/examples/json.northpole.ro/views/curl.haml +19 -0
  105. data/spec/examples/json.northpole.ro/views/doc.haml +16 -0
  106. data/spec/examples/json.northpole.ro/views/doc_table.haml +45 -0
  107. data/spec/examples/json.northpole.ro/views/dotnet.haml +24 -0
  108. data/spec/examples/json.northpole.ro/views/examples.haml +28 -0
  109. data/spec/examples/json.northpole.ro/views/faq.haml +32 -0
  110. data/spec/examples/json.northpole.ro/views/foo.haml +7 -0
  111. data/spec/examples/json.northpole.ro/views/index.haml +4 -0
  112. data/spec/examples/json.northpole.ro/views/java.haml +0 -0
  113. data/spec/examples/json.northpole.ro/views/layout.haml +42 -0
  114. data/spec/examples/json.northpole.ro/views/php.haml +37 -0
  115. data/spec/examples/json.northpole.ro/views/playground.haml +38 -0
  116. data/spec/examples/json.northpole.ro/views/python.haml +17 -0
  117. data/spec/examples/json.northpole.ro/views/ruby.haml +12 -0
  118. data/spec/examples/json.northpole.ro/views/signup.haml +2 -0
  119. data/spec/examples/json.northpole.ro/views/thanks.haml +12 -0
  120. data/spec/functional_spec.rb +4 -0
  121. data/spec/lib/ki/base_request_spec.rb +88 -0
  122. data/spec/lib/ki/helpers_spec.rb +12 -0
  123. data/spec/lib/ki/ki_config_spec.rb +7 -0
  124. data/spec/lib/ki/middleware_spec.rb +11 -0
  125. data/spec/lib/ki/model_spec.rb +100 -0
  126. data/spec/lib/ki/modules/format_of_spec.rb +15 -0
  127. data/spec/lib/ki/orm_spec.rb +83 -0
  128. data/spec/spec_helper.rb +18 -5
  129. data/spec/util_spec.rb +7 -36
  130. metadata +269 -193
  131. data/.document +0 -5
  132. data/.rvmrc +0 -1
  133. data/LICENSE.txt +0 -20
  134. data/README.rdoc +0 -3
  135. data/VERSION +0 -1
  136. data/examples/base/Gemfile +0 -3
  137. data/examples/base/Gemfile.lock +0 -24
  138. data/examples/base/app.rb +0 -4
  139. data/examples/base/config.yml +0 -16
  140. data/gfx/colors.xcf +0 -0
  141. data/gfx/ki3.eps +0 -0
  142. data/gfx/logo.png +0 -0
  143. data/ki_wrap.rb +0 -35
  144. data/lib/conf.rb +0 -28
  145. data/lib/db.rb +0 -73
  146. data/lib/helpers.rb +0 -34
  147. data/lib/ki_cli.rb +0 -76
  148. data/lib/mockreq.rb +0 -45
  149. data/lib/model.rb +0 -110
  150. data/lib/modules/email.rb +0 -51
  151. data/lib/modules/query_interface.rb +0 -42
  152. data/lib/req.rb +0 -57
  153. data/lib/resp.rb +0 -70
  154. data/lib/static_file.rb +0 -68
  155. data/lib/util.rb +0 -114
  156. data/lib/views/404.haml +0 -1
  157. data/lib/views/406.haml +0 -1
  158. data/lib/views/index.haml +0 -7
  159. data/lib/views/layout.haml +0 -1
  160. data/spec/conf_spec.rb +0 -6
  161. data/spec/db_spec.rb +0 -93
  162. data/spec/integration/integration_spec.rb +0 -114
  163. data/spec/ki_spec.rb +0 -7
  164. data/spec/model_spec.rb +0 -91
  165. data/spec/modules/callbacks_spec.rb +0 -25
  166. data/spec/modules/email_spec.rb +0 -19
  167. data/spec/modules/query_interface_spec.rb +0 -93
  168. data/spec/modules/restrictions_spec.rb +0 -110
  169. data/spec/performance/performance.sh +0 -1
  170. data/spec/req_spec.rb +0 -29
@@ -1,51 +0,0 @@
1
- require 'mail'
2
- require 'net/smtp'
3
-
4
- module Ki
5
- module Email
6
- def valid_mail? s
7
- return false if s == '' || s.nil?
8
- r = /^[a-z0-9\+\-\.]+@[a-z0-9]+\.[a-z0-9\.\-]+$/i =~ s
9
- !r.nil?
10
- end
11
-
12
- def send_mail *params
13
- params = params[0] if params.class == Array
14
-
15
- if params.length != 4
16
- raise 'params missing'
17
- end
18
-
19
- params.each do |elem|
20
- if !self.class.required_attributes.include? elem
21
- raise "invalid attribute #{elem.to_s}"
22
- end
23
- end
24
-
25
- from = @req[params[0].to_s]
26
- to = @req[params[1].to_s]
27
- subject = @req[params[2].to_s]
28
- body = @req[params[3].to_s]
29
-
30
- really_send from, to, subject, body
31
- end
32
-
33
- def really_send f, t, s, b
34
- mail = Mail.new do
35
- from f
36
- to t
37
- subject s
38
- body b
39
- end
40
- mail.deliver
41
- end
42
-
43
- def really_send2 f, t, s, b
44
- msgstr = "From: #{f}\nTo: #{t}\nSubject: #{s}\n\n#{b}\n"
45
- Net::SMTP.start('localhost', 25) do |smtp|
46
- smtp.send_message msgstr, f, t
47
- end
48
- end
49
-
50
- end
51
- end
@@ -1,42 +0,0 @@
1
- module Ki
2
- module QueryInterface
3
- def count
4
- Db.instance.db[class_name].count
5
- end
6
-
7
- def find id
8
- if id.class == String
9
- Db.instance.find class_name, id
10
- else
11
- Db.instance.find_by class_name, id
12
- end
13
- end
14
-
15
- def find_or_create hash
16
- elem = find(hash)
17
- if elem.empty?
18
- elem_id = create(hash)
19
- elem = find(elem_id)
20
- end
21
- elem
22
- end
23
-
24
- def create hash
25
- Db.instance.create class_name, hash
26
- end
27
-
28
- def update hash
29
- Db.instance.update class_name, hash
30
- end
31
-
32
- def delete id
33
- Db.instance.delete class_name, id
34
- end
35
-
36
- private
37
-
38
- def class_name
39
- self.to_s.downcase
40
- end
41
- end
42
- end
data/lib/req.rb DELETED
@@ -1,57 +0,0 @@
1
- module Ki
2
- class Req < Rack::Request
3
- attr_accessor :code, :klass, :format
4
-
5
- def initialize env
6
- super env
7
- end
8
-
9
- def serve
10
- unless static_path_requested?
11
- route
12
- Resp.new(self).finish
13
- else
14
- StaticFile.new(self).finish
15
- end
16
- end
17
-
18
- def route
19
- @klass = Util.base(path).to_class
20
- @format = content_type == 'application/json' ? :json : Util.format(path)
21
- if @klass || path == '/' || has_view?
22
- @code = 200
23
- else
24
- @code = 404
25
- end
26
- end
27
-
28
- def json?
29
- @format == :json
30
- end
31
-
32
- def html?
33
- @format == :html
34
- end
35
-
36
- def index?
37
- path == '/'
38
- end
39
-
40
- def content_type_for_result
41
- {
42
- :json => 'application/json',
43
- :html => 'text/html'
44
- }[@format]
45
- end
46
-
47
- def has_view?
48
- File.exists?(Util.root_view_path(Util.base(path)))
49
- end
50
-
51
- private
52
-
53
- def static_path_requested?
54
- path.start_with? '/public/'
55
- end
56
- end
57
- end
@@ -1,70 +0,0 @@
1
- require 'json'
2
-
3
- module Ki
4
- class Resp < Rack::Response
5
- include Helpers
6
-
7
- attr_accessor :req
8
-
9
- def initialize req
10
- @req = req
11
- headers = {
12
- 'Content-Type' => @req.content_type_for_result
13
- }
14
-
15
- # TODO think of a way to clean this up
16
- # here be dragons. don't try to understand this because it is a nested mess
17
- # it is my duty to clean it. one day
18
- klass = @req.klass
19
- if klass.responds_to_formats.include? @req.format
20
- if @req.code == 404
21
- body = @req.html? ? partial('404') : { :error => 404 }
22
- else
23
- if @req.index?
24
- body = @req.html? ? partial('index') : { :index => 200 }
25
- else
26
- if @req.html?
27
- if klass == nil # if route is /ruby it means ruby.haml exists in views
28
- body = Util.render_partial Util.base(@req.path), { 'env' => @req.env }, 'layout'
29
- else
30
- klass_view = Util.root_view_path(klass.to_s.downcase)
31
- body = File.exists?(klass_view) ? partial(klass.to_s.downcase) : partial('index')
32
- end
33
- else
34
- begin
35
- interpret_json_params
36
- body = klass.new(@req).to_json
37
- rescue Exception => e
38
- @req.code = 400
39
- body = { :error => e.to_s }.to_json
40
- end
41
- end
42
- end
43
- end
44
- else
45
- @req.code = 406
46
- body = @req.html? ? partial('406') : { :error => 'format not allowed' }.to_json
47
- end
48
-
49
- super [body], @req.code, headers
50
- end
51
-
52
- private
53
-
54
- def partial s
55
- Util.render_partial s, { 'env' => @req.env }, @req.klass.selected_layout
56
- end
57
-
58
- def interpret_json_params
59
- if @req.json? && @req.body.length > 0
60
- begin
61
- @req.body.rewind
62
- @req.env.update('rack.request.form_hash' => JSON.parse(@req.body.string),
63
- 'rack.request.form_input' => @req.env['rack.input'])
64
- rescue JSON::ParserError
65
- raise "json body invalid: #{@req.body.string}"
66
- end
67
- end
68
- end
69
- end
70
- end
@@ -1,68 +0,0 @@
1
- module Ki
2
- # serve files from public folder
3
- # and compile them if they are coffee of sass
4
- class StaticFile < Rack::File
5
- attr_reader :env
6
-
7
- def initialize req
8
- super Util.root
9
- @env = req.env
10
-
11
- if ENV['RACK_ENV'] == 'development'
12
- StaticFile.compile_css(@env['REQUEST_PATH'])
13
- StaticFile.compile_js(@env['REQUEST_PATH'])
14
- end
15
-
16
- @env
17
- end
18
-
19
- def finish
20
- call(@env)
21
- end
22
-
23
- def self.compile_js filename
24
- if filename.end_with? '.js'
25
- js_path = File.join(Util.root, filename)
26
- coffee_path = js_path.gsub('.js', '.coffee')
27
- coffee_to_js coffee_path, js_path
28
- elsif filename.end_with? '.coffee'
29
- coffee_path = File.join(Util.root, filename)
30
- js_path = coffee_path.gsub('.coffee', '.js')
31
- coffee_to_js coffee_path, js_path
32
- end
33
- end
34
-
35
- def self.compile_css filename
36
- if filename.end_with? '.css'
37
- css_path = File.join(Util.root, filename)
38
- sass_path = css_path.gsub('.css', '.sass')
39
- sass_to_css sass_path, css_path
40
- elsif filename.end_with? '.sass'
41
- sass_path = File.join(Util.root, filename)
42
- css_path = sass_path.gsub('.sass', '.css')
43
- sass_to_css sass_path, css_path
44
- end
45
- end
46
-
47
- private
48
-
49
- def self.sass_to_css sass_path, css_path
50
- if File.exists? sass_path
51
- eng = Sass::Engine.new(File.read(sass_path), :syntax => :sass)
52
- File.open(css_path, 'w') do |f|
53
- f.puts eng.render
54
- end
55
- end
56
- end
57
-
58
- def self.coffee_to_js coffee_path, js_path
59
- if File.exists? coffee_path
60
- coffee_file = File.read(coffee_path)
61
- cont = CoffeeScript.compile(coffee_file)
62
- File.open(js_path, 'w') do |f|
63
- f.puts cont
64
- end
65
- end
66
- end
67
- end
68
- end
@@ -1,114 +0,0 @@
1
- class Array
2
- def stringify_ids
3
- self.collect do |e|
4
- e['id'] = e['_id'].to_s
5
- e.delete('_id')
6
- e
7
- end
8
- end
9
- end
10
-
11
- class NilClass
12
- def responds_to_formats
13
- [:json, :html]
14
- end
15
-
16
- def selected_layout
17
- :layout
18
- end
19
- end
20
-
21
- class String
22
- def to_class
23
- chain = self.split "::"
24
- klass = Kernel
25
- chain.each do |klass_string|
26
- klass = klass.const_get klass_string.capitalize
27
- end
28
- klass.is_a?(Class) ? klass : nil
29
- rescue NameError
30
- nil
31
- end
32
- end
33
-
34
- module Ki
35
- class Util
36
- def self.base s
37
- if s == '/'
38
- return ''
39
- end
40
-
41
- s = s.split('/')[1]
42
-
43
- iq = s.index '?'
44
- ip = s.index '.'
45
-
46
- if ip.nil? && iq.nil?
47
- return s
48
- end
49
-
50
- if !ip.nil?
51
- return s[0...ip]
52
- end
53
-
54
- if !iq.nil?
55
- return s[0...iq]
56
- end
57
- end
58
-
59
- def self.root_view_path name
60
- File.join(root, 'views', name) + '.haml'
61
- end
62
-
63
- def self.format s
64
- if s == '/'
65
- return :html
66
- end
67
-
68
- base = s.split('/')[1]
69
- if base.include? '.'
70
- base.split('.')[1].split('?')[0].to_sym rescue :html
71
- else
72
- :html
73
- end
74
- end
75
-
76
- def self.src_path
77
- File.join(File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib')))
78
- end
79
-
80
- def self.root
81
- Dir.getwd
82
- end
83
-
84
- def self.app_name
85
- File.basename(root)
86
- end
87
-
88
- def self.render_partial s, hash={}, l=:layout
89
- contents = file_contents(s)
90
- case l
91
- when :none
92
- layout_contents = "= yield"
93
- else
94
- layout_contents = file_contents(l.to_s)
95
- end
96
-
97
- haml(layout_contents).render do
98
- haml(contents).render(Object.new(), hash)
99
- end
100
- end
101
-
102
- def self.haml contents
103
- Haml::Engine.new("- extend Ki::Helpers\n" + contents)
104
- end
105
-
106
- def self.file_contents s
107
- path = Util.root_view_path s
108
- unless File.exists? path
109
- path = File.join(Util.src_path, 'views', s) + '.haml'
110
- end
111
- File.read(path)
112
- end
113
- end
114
- end
@@ -1 +0,0 @@
1
- %center 404 - Not Found
@@ -1 +0,0 @@
1
- %center 406 - Not Acceptable Format
@@ -1,7 +0,0 @@
1
- !!!
2
- %html
3
- %head
4
- %title 200 - Hello World
5
- %meta{"http-equiv" => "Content-Type", :content => "text/html; charset=utf-8"}
6
- %body
7
- %center 200 - Hello World
@@ -1 +0,0 @@
1
- = yield
@@ -1,6 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
-
3
- describe Ki::Conf do
4
- it "should work" do
5
- end
6
- end
@@ -1,93 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
-
3
- describe Ki::Db do
4
- before :each do
5
- @db = Ki::Db.instance
6
- @db.remove_collections
7
- end
8
-
9
- it "should start with an empty database" do
10
- @db.collection_names.empty?.should be_true
11
- end
12
-
13
- it "should create a collection" do
14
- @db.collection_names.empty?.should be_true
15
- @db.create 'zoidberg', { :foo => 'bar' }
16
- @db.collection_names.empty?.should be_false
17
- @db.collection_names.include?('zoidberg').should be_true
18
- end
19
-
20
- it "should create an model" do
21
- @db.db['zoidberg'].count.should == 0
22
- @db.create 'zoidberg', { :foo => [1,2] }
23
- @db.db['zoidberg'].count.should == 1
24
- end
25
-
26
- it "should return doc id when creating a model" do
27
- post_id = @db.create 'zoidberg', { :foo => [1,2] }
28
- post_id.class.should == String
29
- bson_id = BSON::ObjectId.from_string(post_id)
30
- @db.db['zoidberg'].find('_id' => bson_id).first['foo'].should == [1,2]
31
- end
32
-
33
- it "should find a specific document" do
34
- post_id = @db.create 'zoidberg', { :foo => [1,2] }
35
- @db.find('zoidberg', post_id)['foo'].should == [1,2]
36
- end
37
-
38
- it "should find by _id, id, and objid" do
39
- post_id = @db.create 'zoidberg', { :foo => [1,2] }
40
- @db.find_by('zoidberg', {'id' => post_id})[0]['id'].should == post_id
41
- end
42
-
43
- it "should update a document" do
44
- post_id = @db.create 'zoidberg', { :foo => [1,2], :bar => 'highj' }
45
- @db.update 'zoidberg', { 'id' => post_id, :foo => 3.1415 }
46
- doc = @db.find('zoidberg', post_id)
47
- doc['foo'].should == 3.1415
48
- doc['bar'].should == nil
49
- end
50
-
51
- it "should delete a document" do
52
- post_id = @db.create 'zoidberg', { :foo => [1,2], :bar => 'highj' }
53
- @db.db['zoidberg'].count.should == 1
54
- @db.delete('zoidberg', post_id)
55
- @db.db['zoidberg'].count.should == 0
56
- end
57
-
58
- it "should find all documents in collection" do
59
- @db.create 'zoidberg', { :foo => [1,2], :bar => 'highj' }
60
- @db.create 'zoidberg', { :foo => [3,4], :bar => 'lowj' }
61
- @db.find_all('zoidberg').count.should == @db.db['zoidberg'].count
62
- end
63
-
64
- it "should find by an attribute" do
65
- id = @db.create 'zoidberg', { :foo => [1,2], :bar => 'highj' }
66
- @db.create 'zoidberg', { :foo => [3,4], :bar => 'lowj' }
67
- @db.create 'zoidberg', { :foo => [5,6], :bar => 'lowj' }
68
- r = @db.find_by 'zoidberg', { :bar => 'lowj' }
69
- r.class.should == Array
70
- r.length.should == 2
71
-
72
- r = @db.find_by 'zoidberg', { :bar => 'lowj', :foo => [3,4] }
73
- r.class.should == Array
74
- r.length.should == 1
75
- end
76
-
77
- it "should transform _id in BSON::ObjectId when using find_by" do
78
- hash = { :foo => [1,2], :bar => 'highj' }
79
- id = @db.create 'zoidberg', hash
80
- hash['id'] = id
81
- r = @db.find_by 'zoidberg', hash
82
- r.length.should == 1
83
- end
84
-
85
- it "should be able to change db name" do
86
- new_db_name = 'test_ki_change_name'
87
- @db.db.name.should == DB_NAME
88
-
89
- @db.db_name new_db_name
90
-
91
- @db.db.name.should == new_db_name
92
- end
93
- end