has_hierarchy 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 847e83a51625d0206116e16591886ed4e1de0256
4
+ data.tar.gz: 5a8260b2193dffaff0ce364d00b1b430d101237f
5
+ SHA512:
6
+ metadata.gz: 5f42dfa82b6c6163e2971d6bcea27ef26fa3bd32915b8a101ca684366b357d09ce30727a22c25ef9d781a25e24ad7fe425af1b51906cd5af09c913a57bf4579c
7
+ data.tar.gz: 74d49e1607e3daf9a0e384fcf6f02d0b9caf6e74dfdf3a9898bf8d67c68d81cf2dfae56241ed7b5b7c31597c32da350d5c56ed1aa596665fc6b417bb7bc1e9c1
data/.editorconfig ADDED
@@ -0,0 +1,14 @@
1
+ root = true
2
+
3
+ [*]
4
+ indent_style = space
5
+ indent_size = 2
6
+
7
+ end_of_line = lf
8
+ charset = utf-8
9
+
10
+ trim_trailing_whitespace = true
11
+ insert_final_newline = true
12
+
13
+ [*.md]
14
+ trim_trailing_whitespace = false
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ /*.gem
2
+ /.bundle
3
+ /Gemfile.lock
4
+ /log
5
+ /tmp
6
+ /coverage
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format doc
data/CHANGELOG.md ADDED
@@ -0,0 +1,17 @@
1
+ # Changelog
2
+
3
+ ## 0.1.2
4
+
5
+ - Added README.md
6
+ - Updated dependencies.
7
+ - has_children-0.1.3
8
+ - has_order-0.1.2
9
+
10
+ ## 0.1.1
11
+
12
+ - has_children-0.1.2
13
+
14
+ ## 0.1.0
15
+
16
+ - Added `#set_default_position?` support.
17
+ - Updated dependencies.
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,87 @@
1
+ [![Gem Version](https://badge.fury.io/rb/has_hierarchy.svg)](http://badge.fury.io/rb/has_hierarchy)
2
+
3
+ # has_hierarchy
4
+
5
+ Provides sortable tree behavior to active_record models.
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ gem 'has_hierarchy'
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ ## Usage
18
+
19
+ $ rails g migration Item name:string \
20
+ parent:belongs_to \
21
+ position:string \
22
+ node_path:string
23
+
24
+ ```ruby
25
+ class Item < ActiveRecord::Base
26
+ has_hierarchy
27
+ end
28
+
29
+ foo = Item.create!(name: 'foo')
30
+ bar = Item.create!(name: 'bar')
31
+ qux = bar.children.create!(name: 'qux')
32
+ baz = bar.children.create!(name: 'baz')
33
+ quux = qux.children.create!(name: 'quux')
34
+
35
+ Item.tree
36
+ # {
37
+ # foo => {},
38
+ # bar => {
39
+ # qux => {
40
+ # quux => {}
41
+ # },
42
+ # baz => {}
43
+ # }
44
+ # }
45
+
46
+ foo.move_after(quux)
47
+
48
+ Item.tree
49
+ # {
50
+ # bar => {
51
+ # qux => {
52
+ # quux => {},
53
+ # foo => {}
54
+ # },
55
+ # baz => {}
56
+ # }
57
+ # }
58
+
59
+ ```
60
+
61
+ See [has_children](https://github.com/kolesnikovde/has_children) and
62
+ [has_order](https://github.com/kolesnikovde/has_order) for details.
63
+
64
+ ## License
65
+
66
+ Copyright (c) 2014 Kolesnikov Danil
67
+
68
+ MIT License
69
+
70
+ Permission is hereby granted, free of charge, to any person obtaining
71
+ a copy of this software and associated documentation files (the
72
+ "Software"), to deal in the Software without restriction, including
73
+ without limitation the rights to use, copy, modify, merge, publish,
74
+ distribute, sublicense, and/or sell copies of the Software, and to
75
+ permit persons to whom the Software is furnished to do so, subject to
76
+ the following conditions:
77
+
78
+ The above copyright notice and this permission notice shall be
79
+ included in all copies or substantial portions of the Software.
80
+
81
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
82
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
83
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
84
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
85
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
86
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
87
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
@@ -0,0 +1,31 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+
4
+ require 'has_hierarchy/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'has_hierarchy'
8
+ spec.version = HasHierarchy::VERSION
9
+
10
+ spec.authors = ['Kolesnikov Danil']
11
+ spec.email = ['kolesnikovde@gmail.com']
12
+ spec.description = 'Provides sortable tree behavior to active_record models.'
13
+ spec.summary = 'Provides sortable tree behavior to active_record models.'
14
+ spec.homepage = 'https://github.com/kolesnikovde/has_hierarchy'
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = `git ls-files`.split($/)
18
+ spec.test_files = spec.files.grep(%r{^spec/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_development_dependency 'bundler', '~> 1'
22
+ spec.add_development_dependency 'rake', '~> 10'
23
+ spec.add_development_dependency 'rspec', '~> 3'
24
+ spec.add_development_dependency 'sqlite3', '~> 1'
25
+ spec.add_development_dependency 'simplecov'
26
+
27
+ spec.add_runtime_dependency 'activerecord', '~> 4'
28
+ spec.add_runtime_dependency 'activesupport', '~> 4'
29
+ spec.add_runtime_dependency 'has_order', '~> 0.1'
30
+ spec.add_runtime_dependency 'has_children', '~> 0.1'
31
+ end
@@ -0,0 +1,3 @@
1
+ module HasHierarchy
2
+ VERSION = '0.1.2'
3
+ end
@@ -0,0 +1,44 @@
1
+ require 'active_record'
2
+ require 'has_order'
3
+ require 'has_children'
4
+ require 'has_hierarchy/version'
5
+
6
+ module HasHierarchy
7
+ def has_hierarchy options = {}
8
+ has_order options.merge(scope: :parent_id)
9
+ has_children options
10
+
11
+ after_save :reset_parent_acceptance
12
+
13
+ include InstanceMethods
14
+ end
15
+
16
+ module InstanceMethods
17
+ def move_before node
18
+ accept_parent(node)
19
+ super
20
+ end
21
+
22
+ def move_after node
23
+ accept_parent(node)
24
+ super
25
+ end
26
+
27
+ protected
28
+
29
+ def accept_parent node
30
+ self.parent_id = node.parent_id
31
+ @parent_accepted = true
32
+ end
33
+
34
+ def reset_parent_acceptance
35
+ @parent_accepted = false
36
+ end
37
+
38
+ def set_default_position?
39
+ super or parent_id_changed? and not @parent_accepted
40
+ end
41
+ end
42
+ end
43
+
44
+ ActiveRecord::Base.extend(HasHierarchy)
data/spec/db/schema.rb ADDED
@@ -0,0 +1,9 @@
1
+ ActiveRecord::Schema.define(version: 0) do
2
+ create_table :items, force: true do |t|
3
+ t.string :name
4
+ t.string :node_path
5
+ t.integer :position
6
+
7
+ t.belongs_to :parent
8
+ end
9
+ end
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+
3
+ describe HasHierarchy do
4
+ before(:each) do
5
+ @foo = Item.create!(name: 'foo')
6
+ @bar = Item.create!(name: 'bar')
7
+
8
+ @qux = @bar.children.create!(name: 'qux')
9
+ @baz = @bar.children.create!(name: 'baz')
10
+
11
+ @quux = @qux.children.create!(name: 'quux')
12
+ end
13
+
14
+ it do
15
+ expect(Item.tree).to be_arranged_like({
16
+ @foo => {},
17
+ @bar => {
18
+ @qux => {
19
+ @quux => {},
20
+ },
21
+ @baz => {}
22
+ }
23
+ })
24
+ end
25
+
26
+ it '#move_after' do
27
+ @quux.move_after(@foo)
28
+
29
+ [@foo, @bar, @baz, @qux, @quux].each(&:reload)
30
+
31
+ expect(Item.ordered.tree).to be_arranged_like({
32
+ @foo => {},
33
+ @quux => {},
34
+ @bar => {
35
+ @qux => {},
36
+ @baz => {}
37
+ }
38
+ })
39
+ end
40
+
41
+ it '#move_before' do
42
+ @baz.move_before(@quux)
43
+
44
+ [@foo, @bar, @baz, @qux, @quux].each(&:reload)
45
+
46
+ expect(Item.ordered.tree).to be_arranged_like({
47
+ @foo => {},
48
+ @bar => {
49
+ @qux => {
50
+ @baz => {},
51
+ @quux => {},
52
+ }
53
+ }
54
+ })
55
+ end
56
+ end
@@ -0,0 +1,29 @@
1
+ if ENV['SIMPLECOV']
2
+ require 'simplecov'
3
+ SimpleCov.start 'rails'
4
+ end
5
+
6
+ require 'fileutils'
7
+ require 'logger'
8
+ require 'sqlite3'
9
+ require 'active_record'
10
+
11
+ FileUtils.mkdir_p('tmp/logs/')
12
+ ActiveRecord::Base.logger = Logger.new('tmp/logs/test.log')
13
+ ActiveRecord::Base.logger.level = Logger::DEBUG
14
+ ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
15
+ ActiveRecord::Schema.verbose = false
16
+
17
+ require File.expand_path('../db/schema.rb', __FILE__)
18
+ require File.expand_path('../support/models.rb', __FILE__)
19
+ require File.expand_path('../support/matchers.rb', __FILE__)
20
+
21
+ RSpec.configure do |config|
22
+ config.around :each do |example|
23
+ ActiveRecord::Base.transaction do
24
+ example.run
25
+
26
+ raise ActiveRecord::Rollback
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,9 @@
1
+ RSpec::Matchers.define :be_arranged_like do |expected|
2
+ match do |actual|
3
+ deep_hash_to_a(actual) == deep_hash_to_a(expected)
4
+ end
5
+
6
+ def deep_hash_to_a hash
7
+ hash.map { |k, v| [ k, deep_hash_to_a(v) ] }
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ require 'has_hierarchy'
2
+
3
+ class Item < ActiveRecord::Base
4
+ has_hierarchy
5
+ end
metadata ADDED
@@ -0,0 +1,190 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: has_hierarchy
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ platform: ruby
6
+ authors:
7
+ - Kolesnikov Danil
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: sqlite3
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: activerecord
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '4'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '4'
97
+ - !ruby/object:Gem::Dependency
98
+ name: activesupport
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '4'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '4'
111
+ - !ruby/object:Gem::Dependency
112
+ name: has_order
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.1'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.1'
125
+ - !ruby/object:Gem::Dependency
126
+ name: has_children
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '0.1'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '0.1'
139
+ description: Provides sortable tree behavior to active_record models.
140
+ email:
141
+ - kolesnikovde@gmail.com
142
+ executables: []
143
+ extensions: []
144
+ extra_rdoc_files: []
145
+ files:
146
+ - ".editorconfig"
147
+ - ".gitignore"
148
+ - ".rspec"
149
+ - CHANGELOG.md
150
+ - Gemfile
151
+ - README.md
152
+ - Rakefile
153
+ - has_hierarchy.gemspec
154
+ - lib/has_hierarchy.rb
155
+ - lib/has_hierarchy/version.rb
156
+ - spec/db/schema.rb
157
+ - spec/has_hierarchy_spec.rb
158
+ - spec/spec_helper.rb
159
+ - spec/support/matchers.rb
160
+ - spec/support/models.rb
161
+ homepage: https://github.com/kolesnikovde/has_hierarchy
162
+ licenses:
163
+ - MIT
164
+ metadata: {}
165
+ post_install_message:
166
+ rdoc_options: []
167
+ require_paths:
168
+ - lib
169
+ required_ruby_version: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ required_rubygems_version: !ruby/object:Gem::Requirement
175
+ requirements:
176
+ - - ">="
177
+ - !ruby/object:Gem::Version
178
+ version: '0'
179
+ requirements: []
180
+ rubyforge_project:
181
+ rubygems_version: 2.2.2
182
+ signing_key:
183
+ specification_version: 4
184
+ summary: Provides sortable tree behavior to active_record models.
185
+ test_files:
186
+ - spec/db/schema.rb
187
+ - spec/has_hierarchy_spec.rb
188
+ - spec/spec_helper.rb
189
+ - spec/support/matchers.rb
190
+ - spec/support/models.rb