ki 0.1.2 → 0.2.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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.2
1
+ 0.2.0
@@ -1 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
1
3
  gem 'ki'
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'ki', :path => '../../'
@@ -0,0 +1,34 @@
1
+ PATH
2
+ remote: ../../
3
+ specs:
4
+ ki (0.1.2)
5
+ bson_ext
6
+ haml
7
+ mongo
8
+ rack
9
+ thin
10
+ thor
11
+
12
+ GEM
13
+ remote: https://rubygems.org/
14
+ specs:
15
+ bson (1.8.2)
16
+ bson_ext (1.8.2)
17
+ bson (~> 1.8.2)
18
+ daemons (1.1.9)
19
+ eventmachine (1.0.0)
20
+ haml (3.1.7)
21
+ mongo (1.8.2)
22
+ bson (~> 1.8.2)
23
+ rack (1.5.2)
24
+ thin (1.5.0)
25
+ daemons (>= 1.0.9)
26
+ eventmachine (>= 0.12.6)
27
+ rack (>= 1.0.0)
28
+ thor (0.17.0)
29
+
30
+ PLATFORMS
31
+ ruby
32
+
33
+ DEPENDENCIES
34
+ ki!
@@ -0,0 +1,40 @@
1
+ require 'ki'
2
+ require 'digest/md5'
3
+
4
+ def encrypt s
5
+ Digest::MD5.hexdigest(s)
6
+ end
7
+
8
+ class User < Ki::Model
9
+ requires :mail, :password
10
+ respond_to :json
11
+ forbid :delete, :update
12
+ unique :mail
13
+
14
+ def before_all
15
+ params['password'] = encrypt(params['password'])
16
+ end
17
+ end
18
+
19
+ class Storage < Ki::Model
20
+ respond_to :json
21
+ requires :mail
22
+
23
+ def before_all
24
+ ensure_authorization
25
+ end
26
+
27
+ private
28
+
29
+ def ensure_authorization
30
+ if params['mail'].nil? || params['password'].nil?
31
+ raise 'not authorized'
32
+ end
33
+ h = { 'mail' => params['mail'], 'password' => encrypt(params['password'])}
34
+ u = User.find(h)
35
+ if u.empty?
36
+ raise 'not authorized'
37
+ end
38
+ params.delete['password']
39
+ end
40
+ end
@@ -0,0 +1,6 @@
1
+ require './app'
2
+
3
+ use Rack::CommonLogger
4
+ use Rack::Reloader, 0
5
+
6
+ run Ki::Ki.new
@@ -0,0 +1,3 @@
1
+ host: 127.0.0.1
2
+ port: 27017
3
+ db_name: northpolero
File without changes
data/ki.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "ki"
8
- s.version = "0.1.2"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Cristian Mircea Messel"]
12
- s.date = "2013-02-10"
12
+ s.date = "2013-02-11"
13
13
  s.description = "Fuck setting up a database for your prototypes. Some call it an ORM with a RESTful interface. Some say its for prototyping."
14
14
  s.email = "mess110@gmail.com"
15
15
  s.executables = ["ki"]
@@ -33,6 +33,12 @@ Gem::Specification.new do |s|
33
33
  "examples/base/Gemfile.lock",
34
34
  "examples/base/app.rb",
35
35
  "examples/base/config.ru",
36
+ "examples/northpole.ro/Gemfile",
37
+ "examples/northpole.ro/Gemfile.lock",
38
+ "examples/northpole.ro/app.rb",
39
+ "examples/northpole.ro/config.ru",
40
+ "examples/northpole.ro/config.yml",
41
+ "examples/northpole.ro/views/index.haml",
36
42
  "examples/northpole/Gemfile",
37
43
  "examples/northpole/Gemfile.lock",
38
44
  "examples/northpole/app.rb",
@@ -48,6 +54,7 @@ Gem::Specification.new do |s|
48
54
  "lib/ki_cli.rb",
49
55
  "lib/model.rb",
50
56
  "lib/modules/callbacks.rb",
57
+ "lib/modules/model_helpers.rb",
51
58
  "lib/modules/query_interface.rb",
52
59
  "lib/modules/restrictions.rb",
53
60
  "lib/req.rb",
@@ -59,6 +66,7 @@ Gem::Specification.new do |s|
59
66
  "lib/views/index.haml",
60
67
  "logo.png",
61
68
  "spec/db_spec.rb",
69
+ "spec/integration/integration_spec.rb",
62
70
  "spec/ki_spec.rb",
63
71
  "spec/model_spec.rb",
64
72
  "spec/modules/callbacks_spec.rb",
@@ -71,7 +79,7 @@ Gem::Specification.new do |s|
71
79
  s.homepage = "http://github.com/mess110/ki"
72
80
  s.licenses = ["MIT"]
73
81
  s.require_paths = ["lib"]
74
- s.rubygems_version = "1.8.24"
82
+ s.rubygems_version = "1.8.17"
75
83
  s.summary = "Prototyping noSQL RESTful API cloud database"
76
84
 
77
85
  if s.respond_to? :specification_version then
data/lib/db.rb CHANGED
@@ -25,6 +25,7 @@ module Ki
25
25
  end
26
26
 
27
27
  def find_by name, hash
28
+ hash['_id'] = BSON::ObjectId(hash['_id']) if hash['_id']
28
29
  @db[name].find(hash).to_a
29
30
  end
30
31
 
data/lib/model.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'modules/callbacks'
2
2
  require 'modules/restrictions'
3
3
  require 'modules/query_interface'
4
+ require 'modules/model_helpers'
4
5
 
5
6
  require 'extensions/mail'
6
7
 
@@ -8,11 +9,12 @@ module Ki
8
9
  class Model
9
10
  extend Restrictions
10
11
  extend QueryInterface
11
- include InitRestrictions
12
+
12
13
  include Callbacks
14
+ include ModelHelpers
13
15
 
14
16
  attr_accessor :hash
15
- attr_reader :req
17
+ attr_accessor :req
16
18
 
17
19
  def initialize req
18
20
  @hash = {}
@@ -26,27 +28,19 @@ module Ki
26
28
 
27
29
  def find
28
30
  raise 'params missing' unless @req.params
29
-
30
- if @req.params['_id']
31
- unless @req.params.length == 1
32
- raise 'no other params allowed when querying _id'
33
- end
34
- @hash = @db.find(class_name, @req.params['_id'])
35
- else
36
- @hash = @db.find_by(class_name, @req.params)
37
- end
31
+ @hash = @db.find_by(class_name, @req.params)
38
32
  raise "#{class_name} not found" if @hash.nil?
39
33
  end
40
34
 
41
35
  def create
42
36
  check_for_required_attributes
37
+ check_for_unique_attributes
43
38
  @hash['_id'] = @db.create(class_name, @req.params)
44
39
  end
45
40
 
46
41
  def update
47
42
  raise 'params missing' unless @req.params
48
43
  raise 'param _id missing' unless @req.params['_id']
49
-
50
44
  check_for_required_attributes
51
45
  @hash['_id'] = @db.update(class_name, @req.params)
52
46
  end
@@ -54,7 +48,6 @@ module Ki
54
48
  def delete
55
49
  raise 'params missing' unless @req.params
56
50
  raise 'param _id missing' unless @req.params['_id']
57
-
58
51
  @hash = @db.delete(class_name, @req.params['_id'])
59
52
  end
60
53
 
@@ -70,12 +63,21 @@ module Ki
70
63
 
71
64
  def check_for_required_attributes
72
65
  required_attributes.each do |ra|
73
- unless @req.params.keys.include? ra.to_s
66
+ if !@req.params.keys.include?(ra.to_s)
74
67
  raise "#{ra.to_s} missing"
75
68
  end
76
69
  end
77
70
  end
78
71
 
72
+ def check_for_unique_attributes
73
+ unique_attributes.each do |ua|
74
+ u = self.class.find({ua.to_s => params[ua.to_s]})
75
+ unless u.empty?
76
+ raise "#{ua.to_s} not unique"
77
+ end
78
+ end
79
+ end
80
+
79
81
  def to_action req
80
82
  case req.request_method
81
83
  when 'GET'
@@ -93,9 +95,11 @@ module Ki
93
95
 
94
96
  # calls method m + before and after methods
95
97
  def ccall m
98
+ before_all
96
99
  send "before_#{m.to_s}".to_sym
97
100
  send m.to_sym
98
101
  send "after_#{m.to_s}".to_sym
102
+ after_all
99
103
  end
100
104
  end
101
105
  end
@@ -1,5 +1,8 @@
1
1
  module Ki
2
2
  module Callbacks
3
+ def before_all
4
+ end
5
+
3
6
  def before_find
4
7
  end
5
8
 
@@ -23,5 +26,8 @@ module Ki
23
26
 
24
27
  def after_delete
25
28
  end
29
+
30
+ def after_all
31
+ end
26
32
  end
27
33
  end
@@ -0,0 +1,43 @@
1
+ module Ki
2
+ module ModelHelpers
3
+ def params
4
+ @req.params
5
+ end
6
+
7
+ def get?
8
+ @req.get?
9
+ end
10
+
11
+ def post?
12
+ @req.post?
13
+ end
14
+
15
+ def put?
16
+ @req.put?
17
+ end
18
+
19
+ def delete?
20
+ @req.delete?
21
+ end
22
+
23
+ def forbidden_actions
24
+ []
25
+ end
26
+
27
+ def responds_to_formats
28
+ [:json, :html]
29
+ end
30
+
31
+ def required_attributes
32
+ []
33
+ end
34
+
35
+ def skipped_params
36
+ []
37
+ end
38
+
39
+ def unique_attributes
40
+ []
41
+ end
42
+ end
43
+ end
@@ -5,7 +5,11 @@ module Ki
5
5
  end
6
6
 
7
7
  def find id
8
- Db.instance.find class_name, 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
9
13
  end
10
14
 
11
15
  def create hash
@@ -15,17 +15,17 @@ module Ki
15
15
  end
16
16
  end
17
17
 
18
- def allowed_formats
18
+ def responds_to_formats
19
19
  [:json, :html]
20
20
  end
21
21
 
22
22
  def respond_to *formats
23
- send :define_method, :allowed_formats do
23
+ send :define_method, :responds_to_formats do
24
24
  formats
25
25
  end
26
26
 
27
27
  eigen_class = class << self; self; end
28
- eigen_class.send(:define_method, :allowed_formats) do
28
+ eigen_class.send(:define_method, :responds_to_formats) do
29
29
  formats
30
30
  end
31
31
  end
@@ -44,19 +44,20 @@ module Ki
44
44
  attributes
45
45
  end
46
46
  end
47
- end
48
47
 
49
- module InitRestrictions
50
- def forbidden_actions
48
+ def unique_attributes
51
49
  []
52
50
  end
53
51
 
54
- def allowed_formats
55
- [:json, :html]
56
- end
52
+ def unique *attributes
53
+ send :define_method, :unique_attributes do
54
+ attributes
55
+ end
57
56
 
58
- def required_attributes
59
- []
57
+ eigen_class = class << self; self; end
58
+ eigen_class.send(:define_method, :unique_attributes) do
59
+ attributes
60
+ end
60
61
  end
61
62
  end
62
63
  end
data/spec/db_spec.rb CHANGED
@@ -57,7 +57,7 @@ describe Ki::Db do
57
57
  end
58
58
 
59
59
  it "should find by an attribute" do
60
- @db.create 'zoidberg', { :foo => [1,2], :bar => 'highj' }
60
+ id = @db.create 'zoidberg', { :foo => [1,2], :bar => 'highj' }
61
61
  @db.create 'zoidberg', { :foo => [3,4], :bar => 'lowj' }
62
62
  @db.create 'zoidberg', { :foo => [5,6], :bar => 'lowj' }
63
63
  r = @db.find_by 'zoidberg', { :bar => 'lowj' }
@@ -68,4 +68,12 @@ describe Ki::Db do
68
68
  r.class.should == Array
69
69
  r.length.should == 1
70
70
  end
71
+
72
+ it "should transform _id in BSON::ObjectId when using find_by" do
73
+ hash = { :foo => [1,2], :bar => 'highj' }
74
+ id = @db.create 'zoidberg', hash
75
+ hash['_id'] = id
76
+ r = @db.find_by 'zoidberg', hash
77
+ r.length.should == 1
78
+ end
71
79
  end
@@ -0,0 +1,114 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ def encrypt s
4
+ s + '!'
5
+ end
6
+
7
+ describe 'Integration Tests' do
8
+ before :each do
9
+ @db = Ki::Db.instance
10
+ @db.remove_collections
11
+ end
12
+
13
+ it "should handle user and storage" do
14
+ class User < Ki::Model
15
+ requires :mail, :password
16
+ respond_to :json
17
+ forbid :delete, :update
18
+ unique :mail
19
+
20
+ def before_all
21
+ params['password'] = encrypt(params['password']) if params['password']
22
+ end
23
+ end
24
+
25
+ class Storage < Ki::Model
26
+ respond_to :json
27
+ requires :mail, :all_my_data
28
+
29
+ def before_all
30
+ ensure_authorization
31
+ end
32
+
33
+ private
34
+
35
+ def ensure_authorization
36
+ if params['mail'].nil? || params['password'].nil?
37
+ raise 'not authorized'
38
+ end
39
+ h = { 'mail' => params['mail'], 'password' => encrypt(params['password'])}
40
+ u = User.find(h)
41
+ if u.empty?
42
+ raise 'not authorized'
43
+ end
44
+ params.delete('password')
45
+ end
46
+ end
47
+
48
+ expect {
49
+ User.new(ReqFactory.new(:post, { 'mail' => 'cool@beans.com'})).hash['_id']
50
+ }.to raise_error 'password missing'
51
+
52
+ expect {
53
+ id = User.new(ReqFactory.new(:post, { 'mail' => 'cool@beans.com', 'password' => '123'})).hash['_id']
54
+ User.new(ReqFactory.new(:get, { '_id' => id })).hash[0]['password'].should == '123!'
55
+ }.to change(User, :count).by(1)
56
+
57
+ expect {
58
+ id = User.new(ReqFactory.new(:post, { 'mail' => 'cool@beans.com', 'password' => '123'})).hash['_id']
59
+ }.to raise_error 'mail not unique'
60
+
61
+ expect {
62
+ Storage.new(ReqFactory.new(:post, {}))
63
+ }.to raise_error 'not authorized'
64
+
65
+ expect {
66
+ Storage.new(ReqFactory.new(:post, {'mail' => 'cool@beans.com'}))
67
+ }.to raise_error 'not authorized'
68
+
69
+ # create storage
70
+ storage = Storage.new(ReqFactory.new(:post, {'mail' => 'cool@beans.com', 'password' => '123', 'all_my_data' => [1,2,3]}))
71
+ id = storage.hash['_id']
72
+ r = Storage.new(ReqFactory.new(:get, { 'mail' => 'cool@beans.com', 'password' => '123'}))
73
+ r.hash[0]['all_my_data'].should == [1,2,3]
74
+ r.hash[0]['password'].should == nil
75
+
76
+ expect {
77
+ Storage.new(ReqFactory.new(:delete, {}))
78
+ }.to raise_error 'not authorized'
79
+
80
+ expect {
81
+ Storage.new(ReqFactory.new(:delete, {'_id' => id}))
82
+ }.to raise_error 'not authorized'
83
+
84
+ expect {
85
+ Storage.new(ReqFactory.new(:delete, {'mail' => 'cool@beans.com', 'password' => '123'}))
86
+ }.to raise_error 'param _id missing'
87
+
88
+ # delete from storage
89
+ expect {
90
+ Storage.new(ReqFactory.new(:delete, {'_id' => id, 'mail' => 'cool@beans.com', 'password' => '123'}))
91
+ }.to change(Storage, :count).by(-1)
92
+
93
+ # not allowed to delete user
94
+ expect {
95
+ id = User.new(ReqFactory.new(:post, { 'mail' => 'other@beans.com', 'password' => '123'})).hash['_id']
96
+ p User.new(ReqFactory.new(:delete, { '_id' => id }))
97
+ }.to raise_error 'action forbidden'
98
+
99
+ storage = Storage.new(ReqFactory.new(:post, {'mail' => 'cool@beans.com', 'password' => '123', 'all_my_data' => [4,4,5]}))
100
+ id = storage.hash['_id']
101
+ expect {
102
+ Storage.new(ReqFactory.new(:put, {'mail' => 'cool@beans.com', 'password' => '123', 'all_my_data' => [1]}))
103
+ }.to raise_error 'param _id missing'
104
+
105
+ expect {
106
+ Storage.new(ReqFactory.new(:put, {'mail' => 'cool@beans.com', 'password' => '1234', 'all_my_data' => [1]}))
107
+ }.to raise_error 'not authorized'
108
+
109
+ storage = Storage.new(ReqFactory.new(:put, {'_id' => id, 'mail' => 'cool@beans.com', 'password' => '123', 'all_my_data' => [1]}))
110
+ storage.hash['_id'].should == id
111
+ storage = Storage.find(id)
112
+ storage['all_my_data'].should == [1]
113
+ end
114
+ end
data/spec/model_spec.rb CHANGED
@@ -24,7 +24,7 @@ describe Ki::Model do
24
24
  id = @db.create 'zoidberg', { :name => 'homer' }
25
25
 
26
26
  get = ReqFactory.new(:get, {'_id' => id})
27
- Zoidberg.new(get).hash['name'].should == 'homer'
27
+ Zoidberg.new(get).hash[0]['name'].should == 'homer'
28
28
  end
29
29
 
30
30
  it "should find objects depending on params" do
@@ -48,12 +48,6 @@ describe Ki::Model do
48
48
  r.length.should == 2
49
49
  end
50
50
 
51
- it "should raise error when _id and other params are given. it should be _id only" do
52
- expect {
53
- Zoidberg.new(ReqFactory.new(:get, { '_id' => 'hi', 'foo' => 'bar'}))
54
- }.to raise_error 'no other params allowed when querying _id'
55
- end
56
-
57
51
  it "should only accept valid object ids" do
58
52
  expect {
59
53
  Zoidberg.new(ReqFactory.new(:get_with_params, { :_id => 'homer' }))
@@ -9,6 +9,17 @@ describe Ki::Callbacks do
9
9
  end
10
10
 
11
11
  id = Foo.new(ReqFactory.new(:post, {:foo => 'bar'})).hash['_id']
12
- Foo.new(ReqFactory.new(:get, { '_id' => id })).hash['meaning_of_life'].should == 42
12
+ Foo.new(ReqFactory.new(:get, { '_id' => id })).hash[0]['meaning_of_life'].should == 42
13
+ end
14
+
15
+ it "should handle before and after all" do
16
+ class Foo < Ki::Model
17
+ def before_all
18
+ params[:cool] = true unless get?
19
+ end
20
+ end
21
+
22
+ id = Foo.new(ReqFactory.new(:post, {:foo => 'bar'})).hash['_id']
23
+ Foo.new(ReqFactory.new(:get, { '_id' => id })).hash[0]['cool'].should be_true
13
24
  end
14
25
  end
@@ -15,6 +15,21 @@ describe Ki::QueryInterface do
15
15
  waldo = Waldo.find(id)
16
16
  waldo['location'].should == 'amsterdam'
17
17
  end
18
+
19
+ it "should find by a hash" do
20
+ @db.create 'waldo', { :location => 'amsterdam', :cool => true, :value => 0 }
21
+ @db.create 'waldo', { :location => 'copenhagen', :cool => true, :value => 1 }
22
+ @db.create 'waldo', { :location => 'kronstadt', :cool => true, :value => 1 }
23
+
24
+ class Waldo < Ki::Model
25
+ end
26
+
27
+ r = Waldo.find({ :cool => true })
28
+ r.length.should == 3
29
+
30
+ r = Waldo.find({ :cool => true, :value => 1 })
31
+ r.length.should == 2
32
+ end
18
33
 
19
34
  it "should delete porn" do
20
35
  id = @db.create 'porn', { :website => 'youporn.com' }
@@ -1,6 +1,11 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
3
  describe Ki::Restrictions do
4
+ before :each do
5
+ @db = Ki::Db.instance
6
+ @db.remove_collections
7
+ end
8
+
4
9
  it "should only allow specified methods" do
5
10
  class Foo < Ki::Model
6
11
  end
@@ -30,15 +35,15 @@ describe Ki::Restrictions do
30
35
  it "should respond to html and json by default" do
31
36
  class Foo < Ki::Model
32
37
  end
33
- Foo.allowed_formats.should == [:json, :html]
38
+ Foo.responds_to_formats.should == [:json, :html]
34
39
  end
35
40
 
36
41
  it "should allow only json" do
37
42
  class Foo < Ki::Model
38
43
  respond_to :json
39
44
  end
40
- Foo.allowed_formats.include?(:json).should be_true
41
- Foo.allowed_formats.include?(:html).should be_false
45
+ Foo.responds_to_formats.include?(:json).should be_true
46
+ Foo.responds_to_formats.include?(:html).should be_false
42
47
  end
43
48
 
44
49
  it "should not have any required attributes" do
@@ -61,4 +66,23 @@ describe Ki::Restrictions do
61
66
  Foo.new(ReqFactory.new(:post, {'name' => 'bart' }))
62
67
  }.to change(Ki::Db.instance.db['foo'], :count).by(1)
63
68
  end
69
+
70
+ it "should handle unique attributes" do
71
+ class Foo < Ki::Model
72
+ end
73
+ Foo.unique_attributes.should == []
74
+
75
+ class Bar < Ki::Model
76
+ unique :foo
77
+ end
78
+ Bar.unique_attributes.should == [:foo]
79
+
80
+ expect {
81
+ Bar.new(ReqFactory.new(:post, { 'foo' => 'bar'}))
82
+ }.to change(Bar, :count).by(1)
83
+
84
+ expect {
85
+ Bar.new(ReqFactory.new(:post, { 'foo' => 'bar'}))
86
+ }.to raise_error 'foo not unique'
87
+ end
64
88
  end
data/spec/spec_helper.rb CHANGED
@@ -16,6 +16,22 @@ Ki::Db.instance.config DB_HOST, DB_PORT, DB_NAME
16
16
  class MockReq
17
17
  attr_accessor :request_method
18
18
  attr_accessor :params
19
+
20
+ def get?
21
+ request_method == 'GET'
22
+ end
23
+
24
+ def post?
25
+ request_method == 'POST'
26
+ end
27
+
28
+ def put?
29
+ request_method == 'PUT'
30
+ end
31
+
32
+ def delete?
33
+ request_method == 'DELETE'
34
+ end
19
35
  end
20
36
 
21
37
  class ReqFactory
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ki
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-10 00:00:00.000000000 Z
12
+ date: 2013-02-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
16
- requirement: !ruby/object:Gem::Requirement
16
+ requirement: &70671260 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,15 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ! '>='
28
- - !ruby/object:Gem::Version
29
- version: '0'
24
+ version_requirements: *70671260
30
25
  - !ruby/object:Gem::Dependency
31
26
  name: mongo
32
- requirement: !ruby/object:Gem::Requirement
27
+ requirement: &70670860 !ruby/object:Gem::Requirement
33
28
  none: false
34
29
  requirements:
35
30
  - - ! '>='
@@ -37,15 +32,10 @@ dependencies:
37
32
  version: '0'
38
33
  type: :runtime
39
34
  prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ! '>='
44
- - !ruby/object:Gem::Version
45
- version: '0'
35
+ version_requirements: *70670860
46
36
  - !ruby/object:Gem::Dependency
47
37
  name: bson_ext
48
- requirement: !ruby/object:Gem::Requirement
38
+ requirement: &70670500 !ruby/object:Gem::Requirement
49
39
  none: false
50
40
  requirements:
51
41
  - - ! '>='
@@ -53,15 +43,10 @@ dependencies:
53
43
  version: '0'
54
44
  type: :runtime
55
45
  prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
- requirements:
59
- - - ! '>='
60
- - !ruby/object:Gem::Version
61
- version: '0'
46
+ version_requirements: *70670500
62
47
  - !ruby/object:Gem::Dependency
63
48
  name: thor
64
- requirement: !ruby/object:Gem::Requirement
49
+ requirement: &70670150 !ruby/object:Gem::Requirement
65
50
  none: false
66
51
  requirements:
67
52
  - - ! '>='
@@ -69,15 +54,10 @@ dependencies:
69
54
  version: '0'
70
55
  type: :runtime
71
56
  prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
- requirements:
75
- - - ! '>='
76
- - !ruby/object:Gem::Version
77
- version: '0'
57
+ version_requirements: *70670150
78
58
  - !ruby/object:Gem::Dependency
79
59
  name: haml
80
- requirement: !ruby/object:Gem::Requirement
60
+ requirement: &70669770 !ruby/object:Gem::Requirement
81
61
  none: false
82
62
  requirements:
83
63
  - - ! '>='
@@ -85,15 +65,10 @@ dependencies:
85
65
  version: '0'
86
66
  type: :runtime
87
67
  prerelease: false
88
- version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
- requirements:
91
- - - ! '>='
92
- - !ruby/object:Gem::Version
93
- version: '0'
68
+ version_requirements: *70669770
94
69
  - !ruby/object:Gem::Dependency
95
70
  name: thin
96
- requirement: !ruby/object:Gem::Requirement
71
+ requirement: &70669240 !ruby/object:Gem::Requirement
97
72
  none: false
98
73
  requirements:
99
74
  - - ! '>='
@@ -101,15 +76,10 @@ dependencies:
101
76
  version: '0'
102
77
  type: :runtime
103
78
  prerelease: false
104
- version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
- requirements:
107
- - - ! '>='
108
- - !ruby/object:Gem::Version
109
- version: '0'
79
+ version_requirements: *70669240
110
80
  - !ruby/object:Gem::Dependency
111
81
  name: rspec
112
- requirement: !ruby/object:Gem::Requirement
82
+ requirement: &70668680 !ruby/object:Gem::Requirement
113
83
  none: false
114
84
  requirements:
115
85
  - - ! '>='
@@ -117,15 +87,10 @@ dependencies:
117
87
  version: '0'
118
88
  type: :development
119
89
  prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
- requirements:
123
- - - ! '>='
124
- - !ruby/object:Gem::Version
125
- version: '0'
90
+ version_requirements: *70668680
126
91
  - !ruby/object:Gem::Dependency
127
92
  name: guard-rspec
128
- requirement: !ruby/object:Gem::Requirement
93
+ requirement: &70668240 !ruby/object:Gem::Requirement
129
94
  none: false
130
95
  requirements:
131
96
  - - ! '>='
@@ -133,15 +98,10 @@ dependencies:
133
98
  version: '0'
134
99
  type: :development
135
100
  prerelease: false
136
- version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
- requirements:
139
- - - ! '>='
140
- - !ruby/object:Gem::Version
141
- version: '0'
101
+ version_requirements: *70668240
142
102
  - !ruby/object:Gem::Dependency
143
103
  name: rb-inotify
144
- requirement: !ruby/object:Gem::Requirement
104
+ requirement: &70667730 !ruby/object:Gem::Requirement
145
105
  none: false
146
106
  requirements:
147
107
  - - ~>
@@ -149,15 +109,10 @@ dependencies:
149
109
  version: 0.8.8
150
110
  type: :development
151
111
  prerelease: false
152
- version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
- requirements:
155
- - - ~>
156
- - !ruby/object:Gem::Version
157
- version: 0.8.8
112
+ version_requirements: *70667730
158
113
  - !ruby/object:Gem::Dependency
159
114
  name: rdoc
160
- requirement: !ruby/object:Gem::Requirement
115
+ requirement: &70667280 !ruby/object:Gem::Requirement
161
116
  none: false
162
117
  requirements:
163
118
  - - ! '>='
@@ -165,15 +120,10 @@ dependencies:
165
120
  version: '0'
166
121
  type: :development
167
122
  prerelease: false
168
- version_requirements: !ruby/object:Gem::Requirement
169
- none: false
170
- requirements:
171
- - - ! '>='
172
- - !ruby/object:Gem::Version
173
- version: '0'
123
+ version_requirements: *70667280
174
124
  - !ruby/object:Gem::Dependency
175
125
  name: bundler
176
- requirement: !ruby/object:Gem::Requirement
126
+ requirement: &70666920 !ruby/object:Gem::Requirement
177
127
  none: false
178
128
  requirements:
179
129
  - - ! '>='
@@ -181,15 +131,10 @@ dependencies:
181
131
  version: '0'
182
132
  type: :development
183
133
  prerelease: false
184
- version_requirements: !ruby/object:Gem::Requirement
185
- none: false
186
- requirements:
187
- - - ! '>='
188
- - !ruby/object:Gem::Version
189
- version: '0'
134
+ version_requirements: *70666920
190
135
  - !ruby/object:Gem::Dependency
191
136
  name: jeweler
192
- requirement: !ruby/object:Gem::Requirement
137
+ requirement: &70666450 !ruby/object:Gem::Requirement
193
138
  none: false
194
139
  requirements:
195
140
  - - ! '>='
@@ -197,15 +142,10 @@ dependencies:
197
142
  version: '0'
198
143
  type: :development
199
144
  prerelease: false
200
- version_requirements: !ruby/object:Gem::Requirement
201
- none: false
202
- requirements:
203
- - - ! '>='
204
- - !ruby/object:Gem::Version
205
- version: '0'
145
+ version_requirements: *70666450
206
146
  - !ruby/object:Gem::Dependency
207
147
  name: simplecov
208
- requirement: !ruby/object:Gem::Requirement
148
+ requirement: &70453200 !ruby/object:Gem::Requirement
209
149
  none: false
210
150
  requirements:
211
151
  - - ! '>='
@@ -213,12 +153,7 @@ dependencies:
213
153
  version: '0'
214
154
  type: :development
215
155
  prerelease: false
216
- version_requirements: !ruby/object:Gem::Requirement
217
- none: false
218
- requirements:
219
- - - ! '>='
220
- - !ruby/object:Gem::Version
221
- version: '0'
156
+ version_requirements: *70453200
222
157
  description: Fuck setting up a database for your prototypes. Some call it an ORM with
223
158
  a RESTful interface. Some say its for prototyping.
224
159
  email: mess110@gmail.com
@@ -244,6 +179,12 @@ files:
244
179
  - examples/base/Gemfile.lock
245
180
  - examples/base/app.rb
246
181
  - examples/base/config.ru
182
+ - examples/northpole.ro/Gemfile
183
+ - examples/northpole.ro/Gemfile.lock
184
+ - examples/northpole.ro/app.rb
185
+ - examples/northpole.ro/config.ru
186
+ - examples/northpole.ro/config.yml
187
+ - examples/northpole.ro/views/index.haml
247
188
  - examples/northpole/Gemfile
248
189
  - examples/northpole/Gemfile.lock
249
190
  - examples/northpole/app.rb
@@ -259,6 +200,7 @@ files:
259
200
  - lib/ki_cli.rb
260
201
  - lib/model.rb
261
202
  - lib/modules/callbacks.rb
203
+ - lib/modules/model_helpers.rb
262
204
  - lib/modules/query_interface.rb
263
205
  - lib/modules/restrictions.rb
264
206
  - lib/req.rb
@@ -270,6 +212,7 @@ files:
270
212
  - lib/views/index.haml
271
213
  - logo.png
272
214
  - spec/db_spec.rb
215
+ - spec/integration/integration_spec.rb
273
216
  - spec/ki_spec.rb
274
217
  - spec/model_spec.rb
275
218
  - spec/modules/callbacks_spec.rb
@@ -293,7 +236,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
293
236
  version: '0'
294
237
  segments:
295
238
  - 0
296
- hash: -3381699098757723557
239
+ hash: -16119203
297
240
  required_rubygems_version: !ruby/object:Gem::Requirement
298
241
  none: false
299
242
  requirements:
@@ -302,7 +245,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
302
245
  version: '0'
303
246
  requirements: []
304
247
  rubyforge_project:
305
- rubygems_version: 1.8.24
248
+ rubygems_version: 1.8.17
306
249
  signing_key:
307
250
  specification_version: 3
308
251
  summary: Prototyping noSQL RESTful API cloud database