cells-dependencies 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.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/README.md +33 -0
- data/Rakefile +5 -0
- data/cells-dependencies.gemspec +25 -0
- data/lib/cell/dependencies.rb +49 -0
- data/lib/cell/dependencies/version.rb +5 -0
- data/spec/cell/dependencies_spec.rb +64 -0
- data/spec/spec_helper.rb +5 -0
- metadata +108 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
|
2
|
+
# Cell Dependencies
|
3
|
+
|
4
|
+
This is little gemmy what let's you declare ahead of render-time
|
5
|
+
what other cells a cell depends on.
|
6
|
+
|
7
|
+
Let's say you've got a hot banner that you put in all of your widgets
|
8
|
+
|
9
|
+
class BannerCell < Cell::Rails
|
10
|
+
#... your banner is awesome, and does great stuff.
|
11
|
+
end
|
12
|
+
|
13
|
+
You can now declare in your other cells that they use this banner cell
|
14
|
+
|
15
|
+
class WeatherCell < Cell::Rails
|
16
|
+
uses :banner
|
17
|
+
#other great stuff...
|
18
|
+
end
|
19
|
+
|
20
|
+
and then query your cell to find out which cells it depends on
|
21
|
+
|
22
|
+
WeatherCell.dependencies #=> [BannerCell]
|
23
|
+
|
24
|
+
Dependencies are transitive
|
25
|
+
|
26
|
+
class BannerCell < Cell::Rails
|
27
|
+
uses :logo
|
28
|
+
end
|
29
|
+
|
30
|
+
WeatherCell.dependencies #=> [BannerCell, LogoCell]
|
31
|
+
|
32
|
+
# Why is this useful?
|
33
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "cell/dependencies/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "cells-dependencies"
|
7
|
+
s.version = Cell::Dependencies::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Charles Lowell"]
|
10
|
+
s.email = ["cowboyd@thefrontside.net"]
|
11
|
+
s.homepage = "http://github.com/cowboyd/cells-dependencies"
|
12
|
+
s.summary = "Say which cells depend on other cells"
|
13
|
+
s.description = "Sometimes its useful to know which cells depend on each other before you actually render them"
|
14
|
+
|
15
|
+
s.rubyforge_project = "cells-dependencies"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
s.add_dependency "cells", ">= 3.5.0"
|
23
|
+
|
24
|
+
s.add_development_dependency "rspec", ">= 2.0.0"
|
25
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'cells'
|
2
|
+
require 'cell/dependencies/version'
|
3
|
+
require 'active_support/core_ext/class/subclasses'
|
4
|
+
|
5
|
+
module Cell
|
6
|
+
module Dependencies
|
7
|
+
|
8
|
+
def inherited(cls)
|
9
|
+
super
|
10
|
+
cls.extend(Cell::Dependencies)
|
11
|
+
end
|
12
|
+
|
13
|
+
def uses(*names)
|
14
|
+
@dependencies ||= []
|
15
|
+
@dependencies += names
|
16
|
+
end
|
17
|
+
|
18
|
+
def dependencies(seen = Set.new([self]))
|
19
|
+
@dependencies ||= []
|
20
|
+
resolved = @dependencies.map {|n| Cell::Base.class_from_cell_name(n)}
|
21
|
+
resolved.inject(resolved) do |all, dep|
|
22
|
+
if seen.include?(dep)
|
23
|
+
all
|
24
|
+
else
|
25
|
+
seen << dep
|
26
|
+
dep.dependencies(seen) - [self] + all
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
module TotalOrder
|
32
|
+
def total_order
|
33
|
+
seen = Set.new
|
34
|
+
order = []
|
35
|
+
cells = Cell::Base.descendants.sort_by {|cell| cell.cell_name}
|
36
|
+
cells.each do |cell|
|
37
|
+
next if seen.include?(cell)
|
38
|
+
order += cell.dependencies.select {|dep| !seen.include?(dep)} + [cell]
|
39
|
+
seen += order
|
40
|
+
end
|
41
|
+
return order.uniq
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
Cell::Rails.extend(self)
|
46
|
+
Cell::Rails.extend(TotalOrder)
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Cell::Dependencies do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@cells = {}
|
7
|
+
Cell::Base.stub(:class_from_cell_name) do |name|
|
8
|
+
@cells[name.to_s] or raise "no such cell #{name}"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
it "starts out empty" do
|
13
|
+
mock_cell(:A).dependencies.should == []
|
14
|
+
end
|
15
|
+
|
16
|
+
it "can enumerate dependencies" do
|
17
|
+
a = mock_cell(:A)
|
18
|
+
b = mock_cell(:B) do
|
19
|
+
uses :A
|
20
|
+
end
|
21
|
+
c = mock_cell(:C) do
|
22
|
+
uses :B
|
23
|
+
end
|
24
|
+
c.dependencies.should == [a,b]
|
25
|
+
end
|
26
|
+
|
27
|
+
it "can order all cells in order of dependencies" do
|
28
|
+
a = mock_cell(:A) do
|
29
|
+
uses :B, :G
|
30
|
+
end
|
31
|
+
b = mock_cell(:B) do
|
32
|
+
uses :C
|
33
|
+
end
|
34
|
+
c = mock_cell(:C)
|
35
|
+
d = mock_cell(:D)
|
36
|
+
f = mock_cell(:F)
|
37
|
+
g = mock_cell(:G)
|
38
|
+
h = mock_cell(:H) do
|
39
|
+
uses :A,:D
|
40
|
+
end
|
41
|
+
i = mock_cell(:I) do
|
42
|
+
uses :H
|
43
|
+
end
|
44
|
+
Cell::Base.stub(:descendants).and_return(@cells.values)
|
45
|
+
Cell::Rails.total_order.should == [c,b,g,a,d,f,h,i]
|
46
|
+
end
|
47
|
+
|
48
|
+
def mock_cell(name, &body)
|
49
|
+
Class.new(Cell::Rails).tap do |cell|
|
50
|
+
mc = class << cell;self;end
|
51
|
+
mc.send(:define_method, :to_s) do
|
52
|
+
"#{name}"
|
53
|
+
end
|
54
|
+
mc.send(:define_method, :cell_name) do
|
55
|
+
"#{name}"
|
56
|
+
end
|
57
|
+
@cells[name.to_s] = cell
|
58
|
+
def cell.view_paths
|
59
|
+
["/mock/cells"]
|
60
|
+
end
|
61
|
+
cell.class_eval(&body) if block_given?
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cells-dependencies
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Charles Lowell
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-02-23 00:00:00 -06:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: cells
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 19
|
30
|
+
segments:
|
31
|
+
- 3
|
32
|
+
- 5
|
33
|
+
- 0
|
34
|
+
version: 3.5.0
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: rspec
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 15
|
46
|
+
segments:
|
47
|
+
- 2
|
48
|
+
- 0
|
49
|
+
- 0
|
50
|
+
version: 2.0.0
|
51
|
+
type: :development
|
52
|
+
version_requirements: *id002
|
53
|
+
description: Sometimes its useful to know which cells depend on each other before you actually render them
|
54
|
+
email:
|
55
|
+
- cowboyd@thefrontside.net
|
56
|
+
executables: []
|
57
|
+
|
58
|
+
extensions: []
|
59
|
+
|
60
|
+
extra_rdoc_files: []
|
61
|
+
|
62
|
+
files:
|
63
|
+
- .gitignore
|
64
|
+
- Gemfile
|
65
|
+
- README.md
|
66
|
+
- Rakefile
|
67
|
+
- cells-dependencies.gemspec
|
68
|
+
- lib/cell/dependencies.rb
|
69
|
+
- lib/cell/dependencies/version.rb
|
70
|
+
- spec/cell/dependencies_spec.rb
|
71
|
+
- spec/spec_helper.rb
|
72
|
+
has_rdoc: true
|
73
|
+
homepage: http://github.com/cowboyd/cells-dependencies
|
74
|
+
licenses: []
|
75
|
+
|
76
|
+
post_install_message:
|
77
|
+
rdoc_options: []
|
78
|
+
|
79
|
+
require_paths:
|
80
|
+
- lib
|
81
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
hash: 3
|
87
|
+
segments:
|
88
|
+
- 0
|
89
|
+
version: "0"
|
90
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
91
|
+
none: false
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
hash: 3
|
96
|
+
segments:
|
97
|
+
- 0
|
98
|
+
version: "0"
|
99
|
+
requirements: []
|
100
|
+
|
101
|
+
rubyforge_project: cells-dependencies
|
102
|
+
rubygems_version: 1.5.2
|
103
|
+
signing_key:
|
104
|
+
specification_version: 3
|
105
|
+
summary: Say which cells depend on other cells
|
106
|
+
test_files:
|
107
|
+
- spec/cell/dependencies_spec.rb
|
108
|
+
- spec/spec_helper.rb
|