ki 0.4.6 → 0.4.7

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 (54) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +24 -0
  3. data/Gemfile.lock +25 -6
  4. data/Guardfile +11 -5
  5. data/README.md +78 -0
  6. data/Rakefile +4 -4
  7. data/ki.gemspec +24 -23
  8. data/lib/ki.rb +7 -4
  9. data/lib/ki/base_request.rb +2 -2
  10. data/lib/ki/helpers.rb +7 -7
  11. data/lib/ki/ki.rb +12 -18
  12. data/lib/ki/ki_app.rb +16 -0
  13. data/lib/ki/ki_cli.rb +11 -12
  14. data/lib/ki/ki_config.rb +12 -8
  15. data/lib/ki/middleware/admin_interface_generator.rb +1 -1
  16. data/lib/ki/middleware/api_handler.rb +7 -8
  17. data/lib/ki/middleware/base_middleware.rb +1 -1
  18. data/lib/ki/middleware/coffee_compiler.rb +2 -2
  19. data/lib/ki/middleware/doc_generator.rb +5 -4
  20. data/lib/ki/middleware/haml_compiler.rb +4 -22
  21. data/lib/ki/{modules/format_of.rb → middleware/helpers/format_of_helper.rb} +3 -3
  22. data/lib/ki/middleware/helpers/haml_compiler_helper.rb +27 -0
  23. data/lib/ki/{modules → middleware/helpers}/public_file_helper.rb +2 -2
  24. data/lib/ki/{modules → middleware/helpers}/view_helper.rb +3 -3
  25. data/lib/ki/middleware/init_middleware.rb +1 -1
  26. data/lib/ki/middleware/public_file_server.rb +1 -1
  27. data/lib/ki/middleware/sass_compiler.rb +3 -3
  28. data/lib/ki/model.rb +10 -11
  29. data/lib/ki/modules/{model_helpers.rb → model_helper.rb} +1 -1
  30. data/lib/ki/modules/query_interface.rb +7 -7
  31. data/lib/ki/modules/restrictions.rb +4 -5
  32. data/lib/ki/orm.rb +11 -11
  33. data/lib/ki/utils/api_error.rb +4 -4
  34. data/lib/ki/utils/extra_ruby.rb +3 -3
  35. data/lib/ki/utils/indifferent_hash.rb +1 -1
  36. data/lib/ki/version.rb +1 -1
  37. data/lib/ki/views/404.haml +1 -0
  38. data/lib/ki/views/instadmin.haml +47 -4
  39. data/spec/examples/base/app.rb +5 -0
  40. data/spec/examples/json.northpole.ro/Gemfile +1 -1
  41. data/spec/lib/ki/base_request_spec.rb +24 -24
  42. data/spec/lib/ki/helpers_spec.rb +1 -1
  43. data/spec/lib/ki/ki_app_spec.rb +13 -0
  44. data/spec/lib/ki/ki_config_spec.rb +16 -2
  45. data/spec/lib/ki/ki_spec.rb +11 -0
  46. data/spec/lib/ki/middleware/haml_compiler_spec.rb +6 -4
  47. data/spec/lib/ki/{modules/format_of_spec.rb → middleware/helpers/format_of_helper_spec.rb} +4 -1
  48. data/spec/lib/ki/model_spec.rb +14 -14
  49. data/spec/lib/ki/modules/model_helper_spec.rb +4 -0
  50. data/spec/lib/ki/orm_spec.rb +25 -25
  51. data/spec/spec_helper.rb +6 -4
  52. data/spec/util_spec.rb +2 -2
  53. metadata +36 -14
  54. data/spec/lib/ki/modules/model_helpers_spec.rb +0 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 15b4a578063b70b747d42d5f0326bcd79865351a
4
- data.tar.gz: 942f6272d7b8a256cc4c469f6fa4ac82d6c4b82c
3
+ metadata.gz: 506138e83d5016227ef6acdf6a5f7bf29e6191e8
4
+ data.tar.gz: c79f376faf3bca31d325f41d0e760ab9fb774861
5
5
  SHA512:
6
- metadata.gz: 9ab148975be190e176f344ecbfc7ece85d79dc728730e7bc30189099ce770c054ac20fef8500ca69d409d0c9e333c58195dd0f932b4e7ad079f79c9d3b6550c4
7
- data.tar.gz: b649dad7d5ce844da1da67df28f4e88a92702705dcb68fa123587dc64ee7297fd6b000e2ec350dd2ba4d4e069a0330b9cc960bfee1050fb6c1dadb00a3eb158b
6
+ metadata.gz: 00331f90e93a2dab923bf5d3131c773fd5ffdd1f6e6bf0a914cabcd5069ff24c6e2b3a27aa99758ad25ed062cda3c995cfbb1bf88b806e13a399023f68da49c9
7
+ data.tar.gz: b7d60288bbb44bdf9e7a0aa4b3502117bf36e5254131d762d514e951fcdcd163d0fe9f589b0168027f9d3aee248fe2ce39de73e4968d5093b819ff8a4998ae86
@@ -0,0 +1,24 @@
1
+ AllCops:
2
+ Exclude:
3
+ - 'spec/examples/**/*'
4
+
5
+ Style/BracesAroundHashParameters:
6
+ Enabled: false
7
+
8
+ Style/Documentation:
9
+ Enabled: false
10
+
11
+ Style/BlockDelimiters:
12
+ Enabled: false
13
+
14
+ Metrics/LineLength:
15
+ Enabled: false
16
+
17
+ Metrics/MethodLength:
18
+ Enabled: false
19
+
20
+ Metrics/AbcSize:
21
+ Enabled: false
22
+
23
+ Lint/UnusedMethodArgument:
24
+ Enabled: false
@@ -1,12 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ki (0.4.6)
4
+ ki (0.4.7)
5
5
  bson_ext
6
6
  bundler (~> 1.5)
7
7
  coffee-script
8
8
  haml
9
- mongo
9
+ mongo (= 1.9.2)
10
10
  rack
11
11
  rack-cors
12
12
  rack-parser
@@ -16,8 +16,12 @@ PATH
16
16
  GEM
17
17
  remote: https://rubygems.org/
18
18
  specs:
19
- bson (3.0.1)
20
- bson_ext (1.5.1)
19
+ ast (2.0.0)
20
+ astrolabe (1.3.0)
21
+ parser (>= 2.2.0.pre.3, < 3.0)
22
+ bson (1.9.2)
23
+ bson_ext (1.9.2)
24
+ bson (~> 1.9.2)
21
25
  celluloid (0.15.2)
22
26
  timers (~> 1.1.0)
23
27
  celluloid-io (0.15.0)
@@ -44,6 +48,9 @@ GEM
44
48
  guard-rspec (4.2.8)
45
49
  guard (~> 2.1)
46
50
  rspec (>= 2.14, < 4.0)
51
+ guard-rubocop (1.2.0)
52
+ guard (~> 2.0)
53
+ rubocop (~> 0.20)
47
54
  haml (4.0.6)
48
55
  tilt
49
56
  listen (2.7.1)
@@ -53,10 +60,13 @@ GEM
53
60
  rb-inotify (>= 0.9)
54
61
  lumberjack (1.0.5)
55
62
  method_source (0.8.2)
56
- mongo (2.0.2)
57
- bson (~> 3.0)
63
+ mongo (1.9.2)
64
+ bson (~> 1.9.2)
58
65
  multi_json (1.11.0)
59
66
  nio4r (1.0.0)
67
+ parser (2.2.2.1)
68
+ ast (>= 1.1, < 3.0)
69
+ powerpack (0.1.0)
60
70
  pry (0.9.12.6)
61
71
  coderay (~> 1.0)
62
72
  method_source (~> 0.8)
@@ -67,6 +77,7 @@ GEM
67
77
  rack
68
78
  rack-test (0.6.2)
69
79
  rack (>= 1.0)
80
+ rainbow (2.0.0)
70
81
  rake (10.1.1)
71
82
  rb-fsevent (0.9.4)
72
83
  rb-inotify (0.9.3)
@@ -79,6 +90,13 @@ GEM
79
90
  rspec-expectations (2.14.5)
80
91
  diff-lcs (>= 1.1.3, < 2.0)
81
92
  rspec-mocks (2.14.6)
93
+ rubocop (0.30.1)
94
+ astrolabe (~> 1.3)
95
+ parser (>= 2.2.2.1, < 3.0)
96
+ powerpack (~> 0.1)
97
+ rainbow (>= 1.99.1, < 3.0)
98
+ ruby-progressbar (~> 1.4)
99
+ ruby-progressbar (1.7.5)
82
100
  sass (3.4.13)
83
101
  simplecov (0.9.2)
84
102
  docile (~> 1.1.0)
@@ -96,6 +114,7 @@ PLATFORMS
96
114
  DEPENDENCIES
97
115
  codeclimate-test-reporter
98
116
  guard-rspec
117
+ guard-rubocop
99
118
  ki!
100
119
  rack-test
101
120
  rake
data/Guardfile CHANGED
@@ -1,9 +1,15 @@
1
1
  # A sample Guardfile
2
2
  # More info at https://github.com/guard/guard#readme
3
3
 
4
- guard :rspec do
5
- watch(%r{^spec/.+_spec\.rb$})
6
- watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
- watch('spec/spec_helper.rb') { "spec" }
8
- end
4
+ group :red_green_refactor, halt_on_fail: true do
5
+ guard :rspec do
6
+ watch(%r{^spec/.+_spec\.rb$})
7
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
8
+ watch('spec/spec_helper.rb') { 'spec' }
9
+ end
9
10
 
11
+ guard :rubocop, cli: ['--config=.rubocop.yml', '--display-cop-names'] do
12
+ watch(/.+\.rb$/)
13
+ watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
14
+ end
15
+ end
data/README.md CHANGED
@@ -9,6 +9,36 @@ Tiny REST JSON ORM framework with MongoDB.
9
9
  Ki's goal is to help you protoype your ideas blazing fast. It has a db backend
10
10
  and provides a fullblown REST api on top.
11
11
 
12
+ **Table of Contents**
13
+
14
+ - [TLDR](#tldr)
15
+ - [Install](#install)
16
+ - [Getting started](#getting-started)
17
+ - [Create a new app](#create-a-new-app)
18
+ - [Adding a view](#adding-a-view)
19
+ - [Adding assets](#adding-assets)
20
+ - [View layout](#view-layout)
21
+ - [Middleware](#middleware)
22
+ - [Helpers](#helpers)
23
+ - [Adding a resource](#adding-a-resource)
24
+ - [Create](#create)
25
+ - [Get all](#get-all)
26
+ - [Get by id](#get-by-id)
27
+ - [Get advanced queries](#advanced-queries)
28
+ - [Update](#update)
29
+ - [Delete](#delete)
30
+ - [Required attributes](#required-attributes)
31
+ - [Unique attributes](#unique-attributes)
32
+ - [Restricting resource requests](#restricting-resource-requests)
33
+ - [Before/after callbacks](#beforeafter-callbacks)
34
+ - [Accessing the json object within the callback](#accessing-the-json-object-within-the-callback)
35
+ - [Exceptions](#exceptions)
36
+ - [Deploy](#deploy)
37
+ - [Heroku deployment](#heroku-deployment)
38
+ - [CORS enabled](#cors-enabled)
39
+ - [Documentation](#documentation)
40
+ - [Administration Interface](#administration-interface)
41
+
12
42
  ## TLDR
13
43
 
14
44
  To create an api endpoint '/todo.json' with GET/POST/PATCH and restricting
@@ -198,6 +228,30 @@ curl -X GET http://localhost:9292/todo.json
198
228
  curl -X GET http://localhost:9292/todo.json?id=ITEM_ID
199
229
  ```
200
230
 
231
+ #### Advanced queries
232
+
233
+ Mongo syntax is supported. See [here](http://docs.mongodb.org/manual/tutorial/query-documents/) for more details.
234
+
235
+ Some examples:
236
+
237
+ Search in array
238
+
239
+ ```
240
+ curl -k -X GET -d '{"category": {"$in": ["music"]}}' "https://json.northpole.ro/storage.json?api_key=guest&secret=guest"
241
+ ```
242
+
243
+ Greater than number
244
+
245
+ ```
246
+ curl -k -X GET -d '{"i": {"$gt": 0}}' "https://json.northpole.ro/storage.json?api_key=guest&secret=guest"
247
+ ```
248
+
249
+ OR Query
250
+
251
+ ```
252
+ curl -k -X GET -d '{"$or": [{"category": "music"}, {"category": "band"}]}' "https://json.northpole.ro/storage.json?api_key=secret&secret=secret"
253
+ ```
254
+
201
255
  #### Update
202
256
 
203
257
  ```shell
@@ -224,6 +278,21 @@ end
224
278
  This will make sure a Todo item can not be saved or updated in the database
225
279
  without a title attribute.
226
280
 
281
+ ### Unique attributes
282
+
283
+ You can add unique attributes on resources with the *unique* method. It
284
+ takes one parameter or an array of parameters as an argument.
285
+
286
+ ```ruby
287
+ class Todo < Ki::Model
288
+ unique :title
289
+ end
290
+ ```
291
+
292
+ This will make sure a Todo item can not be saved or updated in the database
293
+ if it is not unique.
294
+
295
+
227
296
  ### Restricting resource requests
228
297
 
229
298
  Let's say you want to forbid access to deleting items. You can do that with
@@ -304,7 +373,16 @@ git push heroku master
304
373
  heroku open
305
374
  ```
306
375
 
376
+ ## CORS enabled
377
+
378
+ Yes.
379
+
307
380
  ## Documentation
308
381
 
309
382
  Ki offers instant documentation. Add the middleware 'DocGenerator' and access
310
383
  */instadoc*.
384
+
385
+ ## Administration Interface
386
+
387
+ Ki offers an instant administration interface. Add the middleware 'AdminIntefaceGenerator'
388
+ and access */instadmin*.
data/Rakefile CHANGED
@@ -3,12 +3,12 @@ require 'rspec/core/rake_task'
3
3
  require 'rdoc/task'
4
4
 
5
5
  RDoc::Task.new do |rdoc|
6
- rdoc.main = "README.md"
7
- rdoc.rdoc_files.
8
- include("README.md", "lib/**/*.rb")
6
+ rdoc.main = 'README.md'
7
+ rdoc.rdoc_files
8
+ .include('README.md', 'lib/**/*.rb')
9
9
  rdoc.rdoc_dir = 'doc'
10
10
  end
11
11
 
12
12
  RSpec::Core::RakeTask.new(:spec)
13
13
 
14
- task :default => :spec
14
+ task default: :spec
data/ki.gemspec CHANGED
@@ -4,34 +4,35 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'ki/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = "ki"
7
+ spec.name = 'ki'
8
8
  spec.version = Ki::VERSION
9
- spec.authors = ["Cristian Mircea Messel"]
10
- spec.email = ["mess110@gmail.com"]
11
- spec.summary = %q{it said optional}
12
- spec.description = %q{it said optional}
13
- spec.homepage = "https://github.com/mess110/ki"
14
- spec.license = "MIT"
9
+ spec.authors = ['Cristian Mircea Messel']
10
+ spec.email = ['mess110@gmail.com']
11
+ spec.summary = 'it said optional'
12
+ spec.description = 'it said optional'
13
+ spec.homepage = 'https://github.com/mess110/ki'
14
+ spec.license = 'MIT'
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0")
17
17
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
- spec.require_paths = ["lib", "examples"]
19
+ spec.require_paths = %w(lib examples)
20
20
 
21
- spec.add_runtime_dependency "bundler", "~> 1.5"
22
- spec.add_runtime_dependency "rack"
23
- spec.add_runtime_dependency "rack-parser"
24
- spec.add_runtime_dependency "thor"
25
- spec.add_runtime_dependency "haml"
26
- spec.add_runtime_dependency "sass"
27
- spec.add_runtime_dependency "coffee-script"
28
- spec.add_runtime_dependency "mongo"
29
- spec.add_runtime_dependency "bson_ext"
30
- spec.add_runtime_dependency "rack-cors"
21
+ spec.add_runtime_dependency 'bundler', '~> 1.5'
22
+ spec.add_runtime_dependency 'rack'
23
+ spec.add_runtime_dependency 'rack-parser'
24
+ spec.add_runtime_dependency 'thor'
25
+ spec.add_runtime_dependency 'haml'
26
+ spec.add_runtime_dependency 'sass'
27
+ spec.add_runtime_dependency 'coffee-script'
28
+ spec.add_runtime_dependency 'mongo', '1.9.2'
29
+ spec.add_runtime_dependency 'bson_ext'
30
+ spec.add_runtime_dependency 'rack-cors'
31
31
 
32
- spec.add_development_dependency "rake"
33
- spec.add_development_dependency "rack-test"
34
- spec.add_development_dependency "rspec"
35
- spec.add_development_dependency "guard-rspec"
36
- spec.add_development_dependency "codeclimate-test-reporter"
32
+ spec.add_development_dependency 'rake'
33
+ spec.add_development_dependency 'rack-test'
34
+ spec.add_development_dependency 'rspec'
35
+ spec.add_development_dependency 'guard-rspec'
36
+ spec.add_development_dependency 'guard-rubocop'
37
+ spec.add_development_dependency 'codeclimate-test-reporter'
37
38
  end
data/lib/ki.rb CHANGED
@@ -19,10 +19,12 @@ require 'ki/utils/indifferent_hash'
19
19
  require 'ki/modules/query_interface'
20
20
  require 'ki/modules/restrictions'
21
21
  require 'ki/modules/callbacks'
22
- require 'ki/modules/model_helpers'
23
- require 'ki/modules/view_helper'
24
- require 'ki/modules/format_of'
25
- require 'ki/modules/public_file_helper'
22
+ require 'ki/modules/model_helper'
23
+
24
+ require 'ki/middleware/helpers/format_of_helper'
25
+ require 'ki/middleware/helpers/public_file_helper'
26
+ require 'ki/middleware/helpers/haml_compiler_helper'
27
+ require 'ki/middleware/helpers/view_helper'
26
28
 
27
29
  require 'ki/middleware/base_middleware'
28
30
  require 'ki/middleware/init_middleware'
@@ -39,5 +41,6 @@ require 'ki/helpers'
39
41
  require 'ki/orm'
40
42
  require 'ki/model'
41
43
  require 'ki/base_request'
44
+ require 'ki/ki_app'
42
45
 
43
46
  require 'ki/ki'
@@ -19,7 +19,7 @@ module Ki
19
19
  end
20
20
 
21
21
  def to_ki_model_class
22
- self.path.to_s.gsub('/','').gsub(format_of(path), '').gsub('.', '').to_class
22
+ path.to_s.gsub('/', '').gsub(format_of(path), '').gsub('.', '').to_class
23
23
  end
24
24
 
25
25
  def to_action
@@ -35,7 +35,7 @@ module Ki
35
35
  when 'SEARCH'
36
36
  :find
37
37
  else
38
- raise 'unkown action'
38
+ fail 'unkown action'
39
39
  end
40
40
  end
41
41
  end
@@ -2,24 +2,24 @@ module Ki
2
2
  module Helpers
3
3
  include Middleware::Helpers::View
4
4
 
5
- def css url
6
- render_haml "%link{:href => '#{url}', :rel => 'stylesheet'}"
5
+ def css(url)
6
+ haml "%link{:href => '#{url}', :rel => 'stylesheet'}"
7
7
  end
8
8
 
9
- def js url
10
- render_haml "%script{:src => '#{url}'}"
9
+ def js(url)
10
+ haml "%script{:src => '#{url}'}"
11
11
  end
12
12
 
13
- def render_haml s
13
+ def haml(s)
14
14
  Haml::Engine.new(s).render
15
15
  end
16
16
 
17
- def partial s
17
+ def partial(s)
18
18
  path = view_path(s)
19
19
  if File.file?(path)
20
20
  render_haml(File.read(path))
21
21
  else
22
- raise PartialNotFoundError.new path
22
+ fail PartialNotFoundError, path
23
23
  end
24
24
  end
25
25
  end
@@ -1,13 +1,4 @@
1
1
  module Ki
2
- class KiApp
3
- # should never reach this
4
- # middleware should catch all the requests
5
- def call env
6
- s = 'misplaced in space'
7
- Rack::Response.new(s).finish
8
- end
9
- end
10
-
11
2
  class Ki
12
3
  PUBLIC_PATH = 'public'
13
4
  VIEWS_PATH = 'views'
@@ -17,17 +8,20 @@ module Ki
17
8
 
18
9
  @app = Rack::Builder.new do
19
10
  use Middleware::InitMiddleware
20
- # TODO what happens with invalid json?
21
- use Rack::Parser, :content_types => { 'application/json' => Proc.new { |body| ::MultiJson.decode body } }
11
+ use Rack::Parser, content_types: {
12
+ 'application/json' => proc { |body| ::MultiJson.decode body }
13
+ }
14
+ if KiConfig.instance.cors?
15
+ use Rack::Cors do
16
+ allow do
17
+ origins '*'
18
+ resource '*', headers: :any, methods: [:get, :search, :put, :post, :delete]
19
+ end
20
+ end
21
+ end
22
22
  KiConfig.instance.middleware.each do |middleware|
23
23
  use middleware
24
24
  end
25
- use Rack::Cors do
26
- allow do
27
- origins '*'
28
- resource '*', headers: :any, methods: :any
29
- end
30
- end
31
25
  run KiApp.new
32
26
  end
33
27
  end
@@ -41,7 +35,7 @@ module Ki
41
35
  ENV['RACK_ENV'] || 'development'
42
36
  end
43
37
 
44
- def call env
38
+ def call(env)
45
39
  @app.call env
46
40
  end
47
41
  end