text_based_nested_set 0.0.1

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: 00dbca035b8e477e826841cbbda16c6648fdace6
4
+ data.tar.gz: aaed56d81da79ef4c0358820efb709c492c1c75f
5
+ SHA512:
6
+ metadata.gz: 3ba9f837ddb26838b7e825a7615127d5e27bf94464be68277425f2ff8183a8495bd5cbd50d499db349437bdf8522422b26264a021a7679a23af7647a370751b7
7
+ data.tar.gz: b6ef1f7ce94c5457940b727e9721146214f48986485ae1ddada2362fba01eb72b569deddf67104fdf46b6a63fbfd182f29be5ded576d41c5798f91db9fe46ca4
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in text_based_nested_set.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 beyondalbert
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,42 @@
1
+ # TextBasedNestedSet
2
+
3
+ this acts provides Text Based Nested Set functionality.
4
+ Text Based Nested Set is another way to implementation of an SQL Nested Set created by Trever Shick(http://threebit.net/tutorials/nestedset/varcharBasedNestedSet.html).
5
+ Compare to lft and rgt Nested Set, this implementation can updates and deletions without require all of the nodes to be updated.
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'text_based_nested_set'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install text_based_nested_set
22
+
23
+ ## Usage
24
+
25
+ set up:
26
+ 1. Add parent_id, path, position column to exsiting model
27
+ class AddTextBasedNestedSetToDemo < ActiveRecord::Migration
28
+ def change
29
+ add_column :demos, :parent_id, :integer, default: 0
30
+ add_column :demos, :path, :string, default: '/0/'
31
+ add_column :demos, position, :integer, default: 0
32
+ end
33
+ end
34
+ 2. add acts_as_text_based_nested_set method to target model
35
+
36
+ ## Contributing
37
+
38
+ 1. Fork it ( https://github.com/[my-github-username]/text_based_nested_set/fork )
39
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
40
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
41
+ 4. Push to the branch (`git push origin my-new-feature`)
42
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,224 @@
1
+ module BeyondAlbert
2
+ module Acts
3
+ module TextBasedNestedSet
4
+ module Model
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ end
9
+
10
+ module ClassMethods
11
+ def convert_from_awesome_nested_set
12
+ root_nodes = where(parent_id: nil)
13
+ root_nodes.each do |r|
14
+ r.update(parent_id: 0, path: '/0/')
15
+ r.rebuild
16
+ end
17
+ end
18
+ end
19
+
20
+ def move_to_root
21
+ in_tenacious_transaction do
22
+ # reset siblings' position
23
+ self.siblings.each do |s|
24
+ if s.position > self.position
25
+ s.position -= 1
26
+ s.save!
27
+ end
28
+ end
29
+
30
+ descendants = self.descendants
31
+
32
+ self.update(parent_id: 0, path: '/0/', position: 0)
33
+
34
+ # reset descendants' path
35
+ descendants.each do |d|
36
+ d.path = d.parent.path + d.parent_id.to_s + '/'
37
+ d.save!
38
+ end
39
+
40
+ end
41
+ end
42
+
43
+ def move_to_left_of(target)
44
+ in_tenacious_transaction do
45
+ descendants = self.descendants
46
+
47
+ # set new siblings's position
48
+ target.self_and_siblings.each do |s|
49
+ if s.position >= target.position
50
+ s.position += 1
51
+ s.save!
52
+ end
53
+ end
54
+ target.reload
55
+
56
+ # set old siblings's position
57
+ self.siblings.each do |s|
58
+ if s.position > self.position
59
+ s.position -= 1
60
+ s.save!
61
+ end
62
+ end
63
+
64
+ # set self attributes
65
+ self.update(path: target.path, parent_id: target.parent_id, position: target.position - 1)
66
+
67
+ # set descendants' path
68
+ descendants.each do |d|
69
+ d.path = d.parent.path + d.parent_id.to_s + '/'
70
+ d.save!
71
+ end
72
+ end
73
+ end
74
+
75
+ def move_to_right_of(target)
76
+ in_tenacious_transaction do
77
+ descendants = self.descendants
78
+
79
+ # set new siblings' position
80
+ target.self_and_siblings.each do |s|
81
+ if s.position > target.position
82
+ s.position += 1
83
+ s.save!
84
+ end
85
+ end
86
+
87
+ # set old siblings' position
88
+ self.siblings.each do |s|
89
+ if s.position > self.position
90
+ s.position -= 1
91
+ s.save!
92
+ end
93
+ end
94
+
95
+ # set self attributes
96
+ self.update(path: target.path, parent_id: target.parent_id, position: target.position + 1)
97
+
98
+ # set descendants' path
99
+ descendants.each do |d|
100
+ d.path = d.parent.path + d.parent_id.to_s + '/'
101
+ d.save!
102
+ end
103
+ end
104
+ end
105
+
106
+ def move_to_child_of(target)
107
+ in_tenacious_transaction do
108
+ descendants = self.descendants
109
+
110
+ # set old siblings' position
111
+ self.siblings.each do |s|
112
+ if s.position > self.position
113
+ s.position -= 1
114
+ s.save!
115
+ end
116
+ end
117
+
118
+ # set self attributes
119
+ self.update(path: target.path + target.id.to_s + '/', parent_id: target.id, position: target.children.size)
120
+
121
+ # set descendants' path
122
+ descendants.each do |d|
123
+ d.path = d.parent.path + d.parent_id.to_s + '/'
124
+ d.save!
125
+ end
126
+ end
127
+ end
128
+
129
+ def parent
130
+ if self.root?
131
+ nil
132
+ else
133
+ current_class.find(self.parent_id)
134
+ end
135
+ end
136
+
137
+ def ancestors
138
+ parent_ids = self.path.split('/').select {|v| v != "" && v != "0"}
139
+ current_class.where(id: parent_ids)
140
+ end
141
+
142
+ def children
143
+ children_path = self.path + self.id.to_s + '/'
144
+ current_class.where(path: children_path).order('position')
145
+ end
146
+
147
+ def descendants
148
+ descendants_path = self.path + self.id.to_s + '/%'
149
+ current_class.where("path LIKE ?", descendants_path)
150
+ end
151
+
152
+ def right_sibling
153
+ right_siblings = current_class.where(path: self.path, position: self.position + 1)
154
+ if right_siblings.empty?
155
+ nil
156
+ else
157
+ right_siblings.first
158
+ end
159
+ end
160
+
161
+ def left_sibling
162
+ left_siblings = current_class.where(path: self.path, position: self.position - 1 )
163
+ if left_siblings.empty?
164
+ nil
165
+ else
166
+ left_siblings.first
167
+ end
168
+ end
169
+
170
+ def siblings
171
+ current_class.where(path: self.path).select {|o| o.id != self.id}
172
+ end
173
+
174
+ def self_and_siblings
175
+ current_class.where(path: self.path)
176
+ end
177
+
178
+ def root?
179
+ self.parent_id == 0
180
+ end
181
+
182
+ def rebuild
183
+ in_tenacious_transaction do
184
+ children = current_class.where(parent_id: self.id)
185
+ if self.parent_id == 0
186
+ self.update!(path: '/0/')
187
+ end
188
+ unless children.empty?
189
+ children.each.with_index do |c, index|
190
+ c.update(path: self.path + self.id.to_s + '/', position: index)
191
+ c.rebuild
192
+ end
193
+ end
194
+ end
195
+ end
196
+
197
+ private
198
+
199
+ def in_tenacious_transaction(&block)
200
+ retry_count = 0
201
+ begin
202
+ transaction(&block)
203
+ rescue ActiveRecord::StatementInvalid => error
204
+ raise unless connection.open_transactions.zero?
205
+ raise unless error.message =~ /Deadlock found when trying to get lock|Lock wait timeout exceeded/
206
+ raise unless retry_count < 10
207
+ retry_count += 1
208
+ logger.info "Deadlock detected on retry #{retry_count}, restarting transaction"
209
+ sleep(rand(retry_count)*0.1) # Aloha protocol
210
+ retry
211
+ end
212
+ end
213
+
214
+ def current_class
215
+ self.class.base_class
216
+ end
217
+
218
+ def destroy_descendants
219
+ self.descendants.destroy_all
220
+ end
221
+ end
222
+ end
223
+ end
224
+ end
@@ -0,0 +1,32 @@
1
+ require 'text_based_nested_set/model'
2
+
3
+ module BeyondAlbert #:nodoc:
4
+ module Acts #:nodoc:
5
+ module TextBasedNestedSet #:nodoc:
6
+
7
+ # this acts provides Text Based Nested Set functionality.
8
+ # Text Based Nested Set is another way to implementation of an SQL Nested Set created by Trever Shick.
9
+ # Compare to lft and rgt Nested Set, this implementation can updates and deletions without require all of the nodes to be updated.
10
+ #
11
+ # set up:
12
+ # 1. Add parent_id, path, position column to exsiting model
13
+ # class AddTextBasedNestedSetToDemo < ActiveRecord::Migration
14
+ # def change
15
+ # add_column :demos, :parent_id, :integer, default: 0
16
+ # add_column :demos, :path, :string, default: '/0/'
17
+ # add_column :demos, position, :integer, default: 0
18
+ # end
19
+ # end
20
+ # 2. add acts_as_text_based_nested_set method to target model
21
+ #
22
+ # See BeyondAlbert::Acts::TextBasedNestedSet::Model
23
+ # for a list ofclass methods and instance methods
24
+ # added to acts_as_text_based_nested_set models.
25
+ def acts_as_text_based_nested_set(options = {})
26
+ include Model
27
+
28
+ before_destroy :destroy_descendants
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,3 @@
1
+ module TextBasedNestedSet
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,7 @@
1
+ require "text_based_nested_set/version"
2
+ require "text_based_nested_set/text_based_nested_set.rb"
3
+ ActiveRecord::Base.send :extend, BeyondAlbert::Acts::TextBasedNestedSet
4
+
5
+ module TextBasedNestedSet
6
+ # Your code goes here...
7
+ end
@@ -0,0 +1,7 @@
1
+ mysql:
2
+ adapter: 'mysql2'
3
+ host: localhost
4
+ encoding: utf8
5
+ database: tb_nested_set_gem_test
6
+ username: root
7
+ password: "albert"
data/spec/db/schema.rb ADDED
@@ -0,0 +1,10 @@
1
+ ActiveRecord::Schema.define do
2
+ self.verbose = false
3
+
4
+ create_table :categories, :force => true do |t|
5
+ t.string :name
6
+ t.integer :parent_id, default: 0
7
+ t.string :path, default: '/0/'
8
+ t.integer :position, default: 0
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ FactoryGirl.define do
2
+ factory :category do
3
+ name "root"
4
+ end
5
+ end
@@ -0,0 +1,33 @@
1
+ require 'bundler/setup'
2
+ Bundler.setup
3
+
4
+ require 'factory_girl'
5
+ require 'active_record'
6
+ require 'yaml'
7
+ require 'combustion/database'
8
+
9
+ ActiveRecord::Base.establish_connection(YAML.load_file(File.dirname(__FILE__) + '/db/database.yml')['mysql'])
10
+ Combustion::Database.create_database(YAML.load_file(File.dirname(__FILE__) + '/db/database.yml')['mysql'])
11
+ load File.dirname(__FILE__) + '/db/schema.rb'
12
+
13
+ require 'text_based_nested_set'
14
+ require 'support/models'
15
+ require 'factories/categories'
16
+ require 'database_cleaner'
17
+
18
+ RSpec.configure do |config|
19
+ config.include FactoryGirl::Syntax::Methods
20
+
21
+ config.before(:suite) do
22
+ DatabaseCleaner.strategy = :transaction
23
+ DatabaseCleaner.clean_with(:truncation)
24
+ end
25
+
26
+ config.before(:each) do
27
+ DatabaseCleaner.start
28
+ end
29
+
30
+ config.after(:each) do
31
+ DatabaseCleaner.clean
32
+ end
33
+ end
@@ -0,0 +1,3 @@
1
+ class Category < ActiveRecord::Base
2
+ acts_as_text_based_nested_set
3
+ end
@@ -0,0 +1,203 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'TextBasedNestedSet' do
4
+ before :each do
5
+ # test tree:
6
+ # root(1)
7
+ # |__child_1(2)
8
+ # | |__child_1_1(4)
9
+ # | | |__child_1_1_1(7)
10
+ # | |__child_1_2(5)
11
+ # | | |__child_1_2_1(8)
12
+ # | |__child_1_3(6)
13
+ # |__child_2(3)
14
+ @root = create(:category, id: 1, parent_id: 0, path: "/0/", position: 0)
15
+ @child_1 = create(:category, id: 2, name: "child_1", parent_id: 1, path: "/0/1/", position: 0)
16
+ @child_2 = create(:category, id: 3, name: "child_2", parent_id: 1, path: "/0/1/", position: 1)
17
+ @child_1_1 = create(:category, id: 4, name: "child_1_1", parent_id: 2, path: "/0/1/2/", position: 0)
18
+ @child_1_2 = create(:category, id: 5, name: "child_1_2", parent_id: 2, path: "/0/1/2/", position: 1)
19
+ @child_1_3 = create(:category, id: 6, name: "child_1_3", parent_id: 2, path: "/0/1/2/", position: 2)
20
+ @child_1_1_1 = create(:category, id: 7, name: "child_1_1_1", parent_id: 4, path: "/0/1/2/4/", position: 0)
21
+ @child_1_2_1 = create(:category, id: 8, name: "child_1_2_1", parent_id: 5, path: "/0/1/2/5/", position: 0)
22
+ end
23
+
24
+ describe 'move_to_root' do
25
+ it 'should move to the root of the tree' do
26
+ @child_1_2.move_to_root
27
+ @child_1_2.reload
28
+ @child_1_1.reload
29
+ @child_1_3.reload
30
+ @child_1_2_1.reload
31
+ expect(@child_1_2.path).to eq("/0/")
32
+ expect(@child_1_2.parent_id).to eq(0)
33
+ expect(@child_1_2.position).to eq(0)
34
+ expect(@child_1_1.position).to eq(0)
35
+ expect(@child_1_3.position).to eq(1)
36
+ expect(@child_1_2_1.path).to eq("/0/5/")
37
+ expect(@child_1.descendants).to eq([@child_1_1, @child_1_3, @child_1_1_1])
38
+ end
39
+ end
40
+
41
+ describe 'move_to_left_of' do
42
+ it 'should move to the left of target node' do
43
+ @child_1_2.move_to_left_of(@child_2)
44
+
45
+ @child_1_2.reload
46
+ @child_2.reload
47
+ @child_1_3.reload
48
+ @child_1_2_1.reload
49
+ expect(@child_1_2.path).to eq('/0/1/')
50
+ expect(@child_1_2.position).to eq(1)
51
+ expect(@child_2.position).to eq(2)
52
+ expect(@child_1_3.position).to eq(1)
53
+ expect(@child_1_2_1.path).to eq('/0/1/5/')
54
+ end
55
+ end
56
+
57
+ describe 'move_to_right_of' do
58
+ it 'should move to the right of target node' do
59
+ @child_1_1.move_to_right_of(@child_1)
60
+
61
+ @child_1_1.reload
62
+ @child_2.reload
63
+ @child_1_2.reload
64
+ @child_1_3.reload
65
+ expect(@child_1_1.path).to eq('/0/1/')
66
+ expect(@child_1_1.position).to eq(1)
67
+ expect(@child_2.position).to eq(2)
68
+ expect(@child_1_2.position).to eq(0)
69
+ expect(@child_1_3.position).to eq(1)
70
+ end
71
+ end
72
+
73
+ describe 'move_to_child_of' do
74
+ it 'should move to the child of target node' do
75
+ @child_1_2.move_to_child_of(@child_1_1)
76
+
77
+ @child_1_2.reload
78
+ @child_1_3.reload
79
+ @child_1_2_1.reload
80
+ expect(@child_1_2.path).to eq('/0/1/2/4/')
81
+ expect(@child_1_2.position).to eq(1)
82
+ expect(@child_1_3.position).to eq(1)
83
+ expect(@child_1_2_1.path).to eq('/0/1/2/4/5/')
84
+ end
85
+ end
86
+
87
+ describe 'parent' do
88
+ it "should return current node's parent node" do
89
+ expect(@child_1_1.parent.name).to eq("child_1")
90
+ end
91
+
92
+ it "should return nil when current node is root node" do
93
+ expect(@root.parent).to eq(nil)
94
+ end
95
+ end
96
+
97
+ describe 'ancestors' do
98
+ it "should return current node's ancestors node" do
99
+ expect(@child_1_1.ancestors).to eq([@root, @child_1])
100
+ end
101
+ end
102
+
103
+ describe 'children' do
104
+ it "should return current node's children node" do
105
+ expect(@child_1.children).to eq([@child_1_1, @child_1_2, @child_1_3])
106
+ end
107
+ end
108
+
109
+ describe 'descendants' do
110
+ it "should return current node's all descendants" do
111
+ expect(@child_1.descendants).to eq([@child_1_1, @child_1_2, @child_1_3, @child_1_1_1, @child_1_2_1])
112
+ expect(@root.descendants).to eq([@child_1, @child_2, @child_1_1, @child_1_2, @child_1_3, @child_1_1_1, @child_1_2_1])
113
+ end
114
+ end
115
+
116
+ describe 'right_sibling' do
117
+ it "should return current node's right sibling" do
118
+ expect(@child_1_2.right_sibling).to eq(@child_1_3)
119
+ end
120
+
121
+ it "should return nil when current node's right sibling is not existed" do
122
+ expect(@child_1_3.right_sibling).to eq(nil)
123
+ end
124
+ end
125
+
126
+ describe 'left_sibling' do
127
+ it "should return current node's left sibling" do
128
+ expect(@child_1_2.left_sibling).to eq(@child_1_1)
129
+ end
130
+
131
+ it "should return nil when current node's left sibling is not existed" do
132
+ expect(@child_1_1.left_sibling).to eq(nil)
133
+ end
134
+ end
135
+
136
+ describe 'root?' do
137
+ it "should return true if current node is root node" do
138
+ expect(@root.root?).to eq(true)
139
+ end
140
+
141
+ it "should return false if current node is not root node" do
142
+ expect(@child_1.root?).to eq(false)
143
+ end
144
+ end
145
+
146
+ describe 'convert_from_awesome_nested_set' do
147
+ it "should convert awesome nested set to text based nested set" do
148
+ @root.update(parent_id: nil)
149
+ @root.reload
150
+ Category.convert_from_awesome_nested_set
151
+ expect(@root.path).to eq('/0/')
152
+ end
153
+ end
154
+
155
+ describe 'rebuild' do
156
+ it "should rebuild current node's all descendants, set path and position again " do
157
+ @root.descendants.each do |d|
158
+ d.update(path: nil, position: nil)
159
+ end
160
+ @root.update(path: nil, position: nil)
161
+ @root.reload
162
+ @child_1.reload
163
+ @child_1_1.reload
164
+ @child_1_1_1.reload
165
+ @child_1_2.reload
166
+ @child_1_2_1.reload
167
+ @child_1_3.reload
168
+ @child_2.reload
169
+
170
+ @root.rebuild
171
+
172
+ @root.reload
173
+ @child_1.reload
174
+ @child_1_1.reload
175
+ @child_1_1_1.reload
176
+ @child_1_2.reload
177
+ @child_1_2_1.reload
178
+ @child_1_3.reload
179
+ @child_2.reload
180
+
181
+ expect(@child_1.path).to eq('/0/1/')
182
+ expect(@child_1.position).to eq(0)
183
+ expect(@child_1_1_1.path).to eq('/0/1/2/4/')
184
+ end
185
+ end
186
+
187
+ describe 'private destroy_descendants' do
188
+ it 'should destroy descendants when itself be destroyed' do
189
+ @child_1.destroy
190
+ expect(Category.find_by_id(4)).to eq(nil)
191
+ expect(Category.find_by_id(3).name).to eq('child_2')
192
+ end
193
+ end
194
+
195
+ describe 'default value test' do
196
+ it 'should create a root node' do
197
+ root1 = create(:category, name: 'root1')
198
+ expect(root1.parent_id).to eq(0)
199
+ expect(root1.path).to eq('/0/')
200
+ expect(root1.position).to eq(0)
201
+ end
202
+ end
203
+ end
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'text_based_nested_set/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "text_based_nested_set"
8
+ spec.version = TextBasedNestedSet::VERSION
9
+ spec.authors = ["beyondalbert"]
10
+ spec.email = ["beyondalbert@gmail.com"]
11
+ spec.summary = %q{Text based nested set.}
12
+ spec.description = %q{Text based nested set.}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.6"
22
+ spec.add_development_dependency "rake", "~> 10.0"
23
+ spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency "factory_girl", "~> 4.0"
25
+ spec.add_development_dependency "mysql2", "~> 0.3.17"
26
+ spec.add_development_dependency 'combustion', '>= 0.5.2'
27
+ spec.add_development_dependency 'database_cleaner', '~> 1.4.0'
28
+ spec.add_dependency "activerecord", "~> 4.0"
29
+ end
metadata ADDED
@@ -0,0 +1,179 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: text_based_nested_set
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - beyondalbert
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-01-22 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.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
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.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: factory_girl
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '4.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '4.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: mysql2
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.3.17
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.3.17
83
+ - !ruby/object:Gem::Dependency
84
+ name: combustion
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: 0.5.2
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: 0.5.2
97
+ - !ruby/object:Gem::Dependency
98
+ name: database_cleaner
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 1.4.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 1.4.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: activerecord
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '4.0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '4.0'
125
+ description: Text based nested set.
126
+ email:
127
+ - beyondalbert@gmail.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - ".gitignore"
133
+ - ".rspec"
134
+ - Gemfile
135
+ - LICENSE.txt
136
+ - README.md
137
+ - Rakefile
138
+ - lib/text_based_nested_set.rb
139
+ - lib/text_based_nested_set/model.rb
140
+ - lib/text_based_nested_set/text_based_nested_set.rb
141
+ - lib/text_based_nested_set/version.rb
142
+ - spec/db/database.yml
143
+ - spec/db/schema.rb
144
+ - spec/factories/categories.rb
145
+ - spec/spec_helper.rb
146
+ - spec/support/models.rb
147
+ - spec/text_based_nested_set_spec.rb
148
+ - text_based_nested_set.gemspec
149
+ homepage: ''
150
+ licenses:
151
+ - MIT
152
+ metadata: {}
153
+ post_install_message:
154
+ rdoc_options: []
155
+ require_paths:
156
+ - lib
157
+ required_ruby_version: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ required_rubygems_version: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ requirements: []
168
+ rubyforge_project:
169
+ rubygems_version: 2.2.2
170
+ signing_key:
171
+ specification_version: 4
172
+ summary: Text based nested set.
173
+ test_files:
174
+ - spec/db/database.yml
175
+ - spec/db/schema.rb
176
+ - spec/factories/categories.rb
177
+ - spec/spec_helper.rb
178
+ - spec/support/models.rb
179
+ - spec/text_based_nested_set_spec.rb