crudle 0.0.0 → 0.0.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.
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: []