in_order 0.1.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.
Files changed (49) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +759 -0
  4. data/Rakefile +32 -0
  5. data/app/assets/config/in_order_manifest.js +2 -0
  6. data/app/assets/javascripts/in_order/application.js +15 -0
  7. data/app/assets/stylesheets/in_order/application.css +15 -0
  8. data/app/controllers/in_order/application_controller.rb +5 -0
  9. data/app/controllers/in_order/concerns/response_helpers.rb +33 -0
  10. data/app/controllers/in_order/elements_controller.rb +47 -0
  11. data/app/controllers/in_order/lists_controller.rb +86 -0
  12. data/app/helpers/in_order/application_helper.rb +4 -0
  13. data/app/jobs/in_order/application_job.rb +4 -0
  14. data/app/mailers/in_order/application_mailer.rb +6 -0
  15. data/app/models/in_order/add.rb +51 -0
  16. data/app/models/in_order/application_record.rb +5 -0
  17. data/app/models/in_order/aux/create_element.rb +17 -0
  18. data/app/models/in_order/aux/element_iterator.rb +39 -0
  19. data/app/models/in_order/aux/get_element.rb +17 -0
  20. data/app/models/in_order/aux/get_keys.rb +27 -0
  21. data/app/models/in_order/aux/keys.rb +58 -0
  22. data/app/models/in_order/aux/poly_find.rb +24 -0
  23. data/app/models/in_order/aux/poly_key.rb +117 -0
  24. data/app/models/in_order/aux/position_base.rb +25 -0
  25. data/app/models/in_order/aux/repair.rb +71 -0
  26. data/app/models/in_order/aux/sort_elements.rb +32 -0
  27. data/app/models/in_order/aux/var_keys.rb +20 -0
  28. data/app/models/in_order/create.rb +62 -0
  29. data/app/models/in_order/element.rb +119 -0
  30. data/app/models/in_order/fetch.rb +33 -0
  31. data/app/models/in_order/insert.rb +42 -0
  32. data/app/models/in_order/move.rb +15 -0
  33. data/app/models/in_order/purge.rb +71 -0
  34. data/app/models/in_order/queue.rb +65 -0
  35. data/app/models/in_order/remove.rb +29 -0
  36. data/app/models/in_order/stack.rb +12 -0
  37. data/app/models/in_order/trim.rb +74 -0
  38. data/app/models/in_order/update.rb +83 -0
  39. data/app/models/in_order.rb +9 -0
  40. data/app/views/in_order/lists/_list.html.erb +16 -0
  41. data/app/views/in_order/lists/index.html.erb +9 -0
  42. data/app/views/layouts/in_order/application.html.erb +16 -0
  43. data/config/routes.rb +10 -0
  44. data/db/migrate/20190814101433_create_in_order_elements.rb +15 -0
  45. data/lib/in_order/engine.rb +5 -0
  46. data/lib/in_order/version.rb +3 -0
  47. data/lib/in_order.rb +5 -0
  48. data/lib/tasks/in_order_tasks.rake +4 -0
  49. metadata +119 -0
@@ -0,0 +1,83 @@
1
+
2
+ module InOrder
3
+ # Adds new elements to an existing list, returning the whole new list.
4
+ # Effectively, it calls Create, Fetch Uniq and Trim.
5
+ class Update
6
+ include Aux::VarKeys
7
+
8
+ include Aux::SortElements
9
+
10
+ attr_accessor :append, :uniq, :max
11
+ alias append? append
12
+ alias uniq? uniq
13
+
14
+ def set_options(append: true, uniq: true, max: nil)
15
+ self.append = append
16
+
17
+ self.max = max&.to_i
18
+
19
+ self.uniq = uniq
20
+ end
21
+
22
+ def call(models, **options)
23
+ set_options(**options)
24
+
25
+ previous_elements = get_elements
26
+
27
+ if uniq? and previous_elements.any?
28
+ if purge_previous(previous_elements, models)
29
+ previous_elements = get_elements
30
+ end
31
+ end
32
+
33
+ new_elements = Create.new(keys).(models, append: append?)
34
+
35
+ if previous_elements.any?
36
+ new_elements = add_to_list(previous_elements, new_elements)
37
+ end
38
+
39
+ trim(new_elements)
40
+ end
41
+ alias elements call
42
+
43
+ def subjects(*args)
44
+ call(*args).map &:subject
45
+ end
46
+ alias records subjects
47
+
48
+ private
49
+
50
+ def purge_previous(previous_elements, models)
51
+ Purge.new(keys).remove(*models, elements: previous_elements)
52
+ end
53
+
54
+ def get_elements
55
+ sort_elements(InOrder::Element.fetch(keys).to_a)
56
+ end
57
+
58
+ def create_options
59
+ { append: append? }
60
+ end
61
+
62
+ def add_to_list(previous_elements, new_elements)
63
+ if append?
64
+ previous_elements.last.reload
65
+
66
+ previous_elements + new_elements
67
+ else
68
+ new_elements + previous_elements
69
+ end
70
+ end
71
+
72
+ def trim(elements)
73
+ if max.present?
74
+ take_from = append? ? :top : :bottom
75
+
76
+ elements = Trim.new(max, take_from: take_from).(elements)
77
+ end
78
+
79
+ elements
80
+ end
81
+ end
82
+ end
83
+
@@ -0,0 +1,9 @@
1
+
2
+ module InOrder
3
+ Key = Aux::Keys
4
+
5
+ Repair = Aux::Repair
6
+
7
+ Iterator = Aux::ElementIterator
8
+ end
9
+
@@ -0,0 +1,16 @@
1
+
2
+ <ol data-controller="list"
3
+ data-action="dragstart->list#dragstart
4
+ dragover->list#dragover
5
+ dragenter->list#dragenter
6
+ drop->list#drop
7
+ dragend->list#dragend">
8
+ <% @elements.each do |element| %>
9
+ <li draggable="true" data-element-id="<%= element.id %>">
10
+ <%= element.subject %>
11
+ </li>
12
+ <% end %>
13
+ </ol>
14
+
15
+ <div id='messages'></div>
16
+
@@ -0,0 +1,9 @@
1
+
2
+ <h4>Drag'n'Drop List</h4>
3
+
4
+ <br>
5
+ <%= render 'list' %>
6
+
7
+ <br>
8
+ <%= link_to 'Back', main_app.root_path %>
9
+
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>In order</title>
5
+ <%= csrf_meta_tags %>
6
+ <%= csp_meta_tag %>
7
+
8
+ <%= stylesheet_link_tag "in_order/application", media: "all" %>
9
+ <%= javascript_include_tag "in_order/application" %>
10
+ </head>
11
+ <body>
12
+
13
+ <%= yield %>
14
+
15
+ </body>
16
+ </html>
data/config/routes.rb ADDED
@@ -0,0 +1,10 @@
1
+
2
+ InOrder::Engine.routes.draw do
3
+ resources :elements, only: %i(create update destroy)
4
+
5
+ resources :lists, only: %i(index create destroy) do
6
+ post :add, on: :collection
7
+
8
+ post :remove, on: :collection
9
+ end
10
+ end
@@ -0,0 +1,15 @@
1
+
2
+ class CreateInOrderElements < ActiveRecord::Migration[5.2]
3
+ def change
4
+ create_table :in_order_elements do |t|
5
+ t.string :scope
6
+ t.references :owner, polymorphic: true
7
+ t.references :subject, polymorphic: true
8
+ t.references :element
9
+
10
+ t.timestamps
11
+ end
12
+
13
+ add_index :in_order_elements, :scope
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ module InOrder
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace InOrder
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ module InOrder
2
+ VERSION = '0.1.0'
3
+ end
data/lib/in_order.rb ADDED
@@ -0,0 +1,5 @@
1
+ require "in_order/engine"
2
+
3
+ module InOrder
4
+ # Your code goes here...
5
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :in_order do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,119 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: in_order
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Stephen Rycyk
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-08-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
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: sqlite3
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: Links ActiveRecord models together in one-to-many relationships in a
42
+ preset sequence.
43
+ email:
44
+ - stephen.rycyk@googlemail.com
45
+ executables: []
46
+ extensions: []
47
+ extra_rdoc_files: []
48
+ files:
49
+ - MIT-LICENSE
50
+ - README.md
51
+ - Rakefile
52
+ - app/assets/config/in_order_manifest.js
53
+ - app/assets/javascripts/in_order/application.js
54
+ - app/assets/stylesheets/in_order/application.css
55
+ - app/controllers/in_order/application_controller.rb
56
+ - app/controllers/in_order/concerns/response_helpers.rb
57
+ - app/controllers/in_order/elements_controller.rb
58
+ - app/controllers/in_order/lists_controller.rb
59
+ - app/helpers/in_order/application_helper.rb
60
+ - app/jobs/in_order/application_job.rb
61
+ - app/mailers/in_order/application_mailer.rb
62
+ - app/models/in_order.rb
63
+ - app/models/in_order/add.rb
64
+ - app/models/in_order/application_record.rb
65
+ - app/models/in_order/aux/create_element.rb
66
+ - app/models/in_order/aux/element_iterator.rb
67
+ - app/models/in_order/aux/get_element.rb
68
+ - app/models/in_order/aux/get_keys.rb
69
+ - app/models/in_order/aux/keys.rb
70
+ - app/models/in_order/aux/poly_find.rb
71
+ - app/models/in_order/aux/poly_key.rb
72
+ - app/models/in_order/aux/position_base.rb
73
+ - app/models/in_order/aux/repair.rb
74
+ - app/models/in_order/aux/sort_elements.rb
75
+ - app/models/in_order/aux/var_keys.rb
76
+ - app/models/in_order/create.rb
77
+ - app/models/in_order/element.rb
78
+ - app/models/in_order/fetch.rb
79
+ - app/models/in_order/insert.rb
80
+ - app/models/in_order/move.rb
81
+ - app/models/in_order/purge.rb
82
+ - app/models/in_order/queue.rb
83
+ - app/models/in_order/remove.rb
84
+ - app/models/in_order/stack.rb
85
+ - app/models/in_order/trim.rb
86
+ - app/models/in_order/update.rb
87
+ - app/views/in_order/lists/_list.html.erb
88
+ - app/views/in_order/lists/index.html.erb
89
+ - app/views/layouts/in_order/application.html.erb
90
+ - config/routes.rb
91
+ - db/migrate/20190814101433_create_in_order_elements.rb
92
+ - lib/in_order.rb
93
+ - lib/in_order/engine.rb
94
+ - lib/in_order/version.rb
95
+ - lib/tasks/in_order_tasks.rake
96
+ homepage: http://github.com/srycyk/in_order
97
+ licenses:
98
+ - MIT
99
+ metadata: {}
100
+ post_install_message:
101
+ rdoc_options: []
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ required_rubygems_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ requirements: []
115
+ rubygems_version: 3.0.3
116
+ signing_key:
117
+ specification_version: 4
118
+ summary: A Linked List in SQL
119
+ test_files: []