crudle 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e7c7d6e3c38b738dc4131bbf8fdbc21566671d2a
4
- data.tar.gz: 29117c5f47c630aaef962702715b4031316f5b41
3
+ metadata.gz: b085645d20a6a26aa76a02f06b7ffdeaecbf236d
4
+ data.tar.gz: e233fac2137bde5dddfd95a81b31c1cdb7b98e3f
5
5
  SHA512:
6
- metadata.gz: a90fd56487f30106bbb1f1375e138e7f44b6462641cff48e1e26da02dd392c036c84e5a36a7b134d700bb2c838c08457d6b78b6001d3e99b3507a61f920eb7e2
7
- data.tar.gz: 667803add73c9d0c6d2b4d9c78baba2de01646b72a18861a99bf193e86ee61716a69ae5a8b275f48bde8cf88b2e5683baff93a1de462b72f32449d07b50766e3
6
+ metadata.gz: 52a40b6a01a03ad2c45cf1a709883a050fd43a1596e48e82116487ed00afea8e358d6d5953f12485cb3109eb0908c84aeb1396ab08575f6133530e8073dd0c0d
7
+ data.tar.gz: 5e991bd543f35f82a4f35307a952217094fba3969f1c52527074b67b31d21b8a5a4a4bf5e08b438551cd1362f2ba6fc06aa5fd2a3076a8f55a589d02e6a32a7a
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ /pkg/
2
+ *.gem
data/crudle.gemspec CHANGED
@@ -1,12 +1,15 @@
1
1
  # coding: utf-8
2
2
 
3
3
  Gem::Specification.new do |spec|
4
- spec.name, spec.version = %w[crudle 0.0.0]
4
+ spec.name, spec.version = %w[
5
+ crudle
6
+ 0.0.1
7
+ ]
5
8
  spec.authors = ['Slee Woo']
6
9
  spec.email = ['mail@sleewoo.com']
7
10
  spec.summary = [spec.name, spec.version]*'-',
8
11
  spec.description = 'Building blocks for opinionated CRUD interfaces'
9
- spec.homepage = 'https://github.com/sleewoo/' + spec.name
12
+ spec.homepage = 'https://github.com/crudle/ruby-server'
10
13
  spec.license = 'MIT'
11
14
 
12
15
  spec.files = Dir['**/{*,.[a-z]*}'].reject {|e| e =~ /(gem|lock)\z/}
@@ -14,7 +17,4 @@ Gem::Specification.new do |spec|
14
17
  spec.executables = Dir['bin/*'].map {|f| File.basename(f)}
15
18
 
16
19
  spec.required_ruby_version = '~> 2.0'
17
-
18
- spec.add_runtime_dependency 'rocketio', '~> 0'
19
- spec.add_runtime_dependency 'tubesock', '~> 0'
20
20
  end
data/lib/crudle.rb ADDED
@@ -0,0 +1,14 @@
1
+ require 'crudle/controller_setup'
2
+ require 'crudle/instance_methods'
3
+
4
+ module Crudle
5
+ NAME_QUERY = 'name ILIKE ?'.freeze
6
+ NAME_QUERY_FORMAT = '%s%%'.freeze
7
+ FILTER_METHOD_FORMAT = 'filter_by_%s'.freeze
8
+
9
+ module Controller
10
+ def self.included base
11
+ base.class_exec(&Crudle::ControllerSetup)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,44 @@
1
+ module Crudle
2
+ ControllerSetup = -> do
3
+ include Crudle::InstanceMethods
4
+
5
+ def list params = {}
6
+ dataset = filtered_dataset(params)
7
+ offset, pager = pager(params, dataset.count, items_per_page, side_pages)
8
+ {
9
+ items: fetch_items(dataset, offset, params[:id]).map {|i| list_serializer(i)},
10
+ pager: pager
11
+ }
12
+ end
13
+
14
+
15
+ def load id
16
+ editor_serializer(find_item(id))
17
+ end
18
+
19
+
20
+ def create
21
+ model.create.id
22
+ end
23
+
24
+
25
+ def save id, data
26
+ item = find_item(id)
27
+ data.each_pair {|k,v| item[k] = v}
28
+ item.valid? || halt(400, error: item.errors.each_with_object([]) {|e,o| o << e.join(': ')})
29
+ item.save
30
+ list_serializer(item)
31
+ end
32
+
33
+
34
+ def delete id
35
+ find_item(id).destroy
36
+ end
37
+
38
+
39
+ def delete_selected params, selected
40
+ model.where(id: selected).map(&:destroy)
41
+ list(params)
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,115 @@
1
+ module Crudle
2
+ module InstanceMethods
3
+
4
+ private
5
+ def find_item id
6
+ model.find_by(id: id) || halt(400, 'No item found with ID #%s' % escape_html(id.to_s))
7
+ end
8
+
9
+
10
+ def model
11
+ raise('Model not set. Please define a #model method that returns your model')
12
+ end
13
+
14
+
15
+ def items_per_page
16
+ 25
17
+ end
18
+
19
+
20
+ def side_pages
21
+ 4
22
+ end
23
+
24
+
25
+ def order
26
+ {id: :desc}
27
+ end
28
+
29
+
30
+ def list_serializer item
31
+ serializer(item)
32
+ end
33
+
34
+
35
+ def editor_serializer item
36
+ serializer(item)
37
+ end
38
+
39
+
40
+ def serializer item
41
+ item
42
+ end
43
+
44
+
45
+ def filter params, dataset
46
+ return if params[:q].nil? || params[:q].empty?
47
+ if id = params[:q].scan(/id=(\d+)/).flatten[0]
48
+ return dataset.where(id: id)
49
+ end
50
+ dataset.where(Crudle::NAME_QUERY, Crudle::NAME_QUERY_FORMAT % params[:q])
51
+ end
52
+
53
+
54
+ def filtered_dataset params
55
+ params.inject(filter(params, model) || model) do |dataset,(k,v)|
56
+ filter_method = Crudle::FILTER_METHOD_FORMAT % k
57
+ if respond_to?(filter_method)
58
+ send(filter_method, params, dataset) || dataset
59
+ else
60
+ dataset
61
+ end
62
+ end
63
+ end
64
+
65
+
66
+ def fetch_items dataset, offset, id = nil
67
+ items = model.unscoped do
68
+ dataset.order(order).offset(offset).limit(items_per_page).to_a
69
+ end
70
+ if id && item = model.find_by(id: id)
71
+ items.delete_if {|i| i.id == item.id}
72
+ items.unshift(item)
73
+ end
74
+ items
75
+ end
76
+
77
+
78
+ def pager params, total_items, items_per_page, side_pages
79
+ total_pages = (total_items.to_f / items_per_page.to_f).ceil
80
+
81
+ current_page = params[:p].to_i
82
+ current_page = 1 if current_page < 1
83
+ current_page = total_pages if current_page > total_pages
84
+
85
+ next_page = current_page + 1
86
+ next_page = nil if next_page > total_pages
87
+ prev_page = current_page - 1
88
+ prev_page = nil if prev_page < 1
89
+
90
+ min_page = current_page - side_pages
91
+ min_page = total_pages - (side_pages * 2) if (current_page + side_pages) > total_pages
92
+ min_page = 1 if min_page < 1
93
+
94
+ max_page = current_page + side_pages
95
+ max_page = side_pages * 2 if current_page < side_pages
96
+ max_page = total_pages if max_page > total_pages
97
+
98
+ offset = (current_page - 1) * items_per_page
99
+ offset = 0 if offset < 0
100
+
101
+ counter = {a: offset + 1, z: offset + items_per_page, total: total_items}
102
+ counter[:a] = offset if counter[:a] > total_items
103
+ counter[:z] = total_items if counter[:z] > total_items
104
+
105
+ [offset, {
106
+ current_page: current_page,
107
+ total_pages: total_pages,
108
+ next_page: next_page,
109
+ prev_page: prev_page,
110
+ pages_list: (min_page .. max_page).to_a,
111
+ counter: counter
112
+ }]
113
+ end
114
+ end
115
+ end
metadata CHANGED
@@ -1,43 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: crudle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Slee Woo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-18 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: rocketio
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: tubesock
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '0'
11
+ date: 2016-04-25 00:00:00.000000000 Z
12
+ dependencies: []
41
13
  description: Building blocks for opinionated CRUD interfaces
42
14
  email:
43
15
  - mail@sleewoo.com
@@ -45,10 +17,14 @@ executables: []
45
17
  extensions: []
46
18
  extra_rdoc_files: []
47
19
  files:
20
+ - ".gitignore"
48
21
  - Gemfile
49
22
  - Rakefile
50
23
  - crudle.gemspec
51
- homepage: https://github.com/sleewoo/crudle
24
+ - lib/crudle.rb
25
+ - lib/crudle/controller_setup.rb
26
+ - lib/crudle/instance_methods.rb
27
+ homepage: https://github.com/crudle/ruby-server
52
28
  licenses:
53
29
  - MIT
54
30
  metadata: {}
@@ -71,5 +47,5 @@ rubyforge_project:
71
47
  rubygems_version: 2.5.1
72
48
  signing_key:
73
49
  specification_version: 4
74
- summary: '["crudle-0.0.0", "Building blocks for opinionated CRUD interfaces"]'
50
+ summary: '["crudle-0.0.1", "Building blocks for opinionated CRUD interfaces"]'
75
51
  test_files: []