ki 0.4.6 → 0.4.7

Sign up to get free protection for your applications and to get access to all the features.
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