adva-categories 0.0.2 → 0.0.3
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/lib/bundler/repository.rb +118 -0
- metadata +5 -25
- data/app/controllers/admin/categories_controller.rb +0 -4
- data/app/controllers/base_controller_slice.rb +0 -9
- data/app/helpers/url_helper_slice.rb +0 -16
- data/app/models/categorization.rb +0 -5
- data/app/models/category.rb +0 -8
- data/app/models/content_slice.rb +0 -15
- data/app/views/admin/categories/_form.html.rb +0 -17
- data/app/views/admin/categories/_menu.html.rb +0 -21
- data/app/views/admin/categories/edit.html.rb +0 -9
- data/app/views/admin/categories/index.html.rb +0 -20
- data/app/views/admin/categories/new.html.rb +0 -10
- data/config/locales/en.yml +0 -32
- data/config/redirects.rb +0 -4
- data/config/routes.rb +0 -13
- data/lib/adva/categories.rb +0 -11
- data/lib/adva/routing_filters/categories.rb +0 -81
- data/lib/adva-categories.rb +0 -1
- data/lib/adva_categories/version.rb +0 -3
- data/lib/testing/factories.rb +0 -4
- data/lib/testing/paths.rb +0 -15
- data/lib/testing/step_definitions.rb +0 -21
@@ -0,0 +1,118 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
|
3
|
+
# Bundler gemfile support for local/remote workspaces/repositories for work in
|
4
|
+
# development teams.
|
5
|
+
#
|
6
|
+
# Usage:
|
7
|
+
#
|
8
|
+
# # define paths to be searched for repositories:
|
9
|
+
# workspace '~/.projects ~/Development/{projects,work}'
|
10
|
+
#
|
11
|
+
# # define developer preferences for using local or remote repositories (uses ENV['user']):
|
12
|
+
# developer :sven, :prefer => :local
|
13
|
+
#
|
14
|
+
# # define repositories to be used for particular gems:
|
15
|
+
# adva_cms = repository('adva-cms2', :git => 'git@github.com:svenfuchs/adva-cms2.git', :ref => 'c2af0de')
|
16
|
+
# adva_shop = repository('adva-shop', :source => :local)
|
17
|
+
#
|
18
|
+
# # now use repositories to define gems:
|
19
|
+
# adva_cms.gem 'adva-core'
|
20
|
+
# adva_shop.gem 'adva-catalog'
|
21
|
+
#
|
22
|
+
# # The gem definition will now be proxied to Bundler with arguments according
|
23
|
+
# # to the setup defined earlier. E.g. as:
|
24
|
+
#
|
25
|
+
# gem 'adva-core', :path => 'Development/projects/adva-cms2/adva-core' # for developer 'sven'
|
26
|
+
# gem 'adva-core', :git => 'git@github.com:svenfuchs/adva-cms2.git', :ref => 'c2af0de' # for other developers
|
27
|
+
# gem 'adva-catalog', :path => 'Development/projects/adva-shop/adva-catalog' # for all developers
|
28
|
+
#
|
29
|
+
# One can also set an environment variable FORCE_REMOTE which will force remote
|
30
|
+
# repositories to be used *except* when a repository was defined with :source => :local
|
31
|
+
# which always forces the local repository to be used.
|
32
|
+
#
|
33
|
+
class Repository
|
34
|
+
class << self
|
35
|
+
def paths
|
36
|
+
@paths ||= []
|
37
|
+
end
|
38
|
+
|
39
|
+
def path(*paths)
|
40
|
+
paths.join(' ').split(' ').each do |path|
|
41
|
+
self.paths.concat(Pathname.glob(File.expand_path(path)))
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def developer(name, preferences)
|
46
|
+
developers[name] = preferences
|
47
|
+
workspaces(preferences[:workspace])
|
48
|
+
end
|
49
|
+
|
50
|
+
def current_developer
|
51
|
+
developers[ENV['USER'].to_sym] || {}
|
52
|
+
end
|
53
|
+
|
54
|
+
def developers(developers = nil)
|
55
|
+
@developers ||= {}
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
class Gem < Array
|
60
|
+
def initialize(name, repository)
|
61
|
+
if repository.local?
|
62
|
+
sub_path = repository.path.join(name)
|
63
|
+
super([name, { :path => sub_path.exist? ? sub_path.to_s : repository.path.to_s }])
|
64
|
+
else
|
65
|
+
super([name, repository.options.dup])
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
attr_reader :bundler, :name, :options, :source
|
71
|
+
|
72
|
+
def initialize(bundler, name, options)
|
73
|
+
@bundler = bundler
|
74
|
+
@name = name
|
75
|
+
@source = options.delete(:source)
|
76
|
+
@options = options
|
77
|
+
end
|
78
|
+
|
79
|
+
def gem(name)
|
80
|
+
bundler.gem(*Gem.new(name, self))
|
81
|
+
end
|
82
|
+
|
83
|
+
def local?
|
84
|
+
source == :local # && path
|
85
|
+
end
|
86
|
+
|
87
|
+
def source
|
88
|
+
@source ||= forced_source || preferred_source || :remote
|
89
|
+
end
|
90
|
+
|
91
|
+
def forced_source
|
92
|
+
:remote if ENV['FORCE_REMOTE']
|
93
|
+
end
|
94
|
+
|
95
|
+
def preferred_source
|
96
|
+
self.class.current_developer[:prefer] || self.class.current_developer[name.to_sym]
|
97
|
+
end
|
98
|
+
|
99
|
+
def path
|
100
|
+
@path ||= begin
|
101
|
+
path = self.class.paths.detect { |path| path.join(name).exist? }
|
102
|
+
path ? path.join(name) : Pathname.new('.')
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def workspace(*paths)
|
108
|
+
Repository.path(*paths)
|
109
|
+
end
|
110
|
+
alias :workspaces :workspace
|
111
|
+
|
112
|
+
def developer(name, preferences)
|
113
|
+
Repository.developer(name, preferences)
|
114
|
+
end
|
115
|
+
|
116
|
+
def repository(*args)
|
117
|
+
Repository.new(self, *args)
|
118
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: adva-categories
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 3
|
10
|
+
version: 0.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ingo Weiss
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-11-
|
19
|
+
date: 2010-11-19 00:00:00 +01:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -42,27 +42,7 @@ extensions: []
|
|
42
42
|
extra_rdoc_files: []
|
43
43
|
|
44
44
|
files:
|
45
|
-
-
|
46
|
-
- app/controllers/base_controller_slice.rb
|
47
|
-
- app/helpers/url_helper_slice.rb
|
48
|
-
- app/views/admin/categories/index.html.rb
|
49
|
-
- app/views/admin/categories/edit.html.rb
|
50
|
-
- app/views/admin/categories/new.html.rb
|
51
|
-
- app/views/admin/categories/_form.html.rb
|
52
|
-
- app/views/admin/categories/_menu.html.rb
|
53
|
-
- app/models/content_slice.rb
|
54
|
-
- app/models/category.rb
|
55
|
-
- app/models/categorization.rb
|
56
|
-
- config/redirects.rb
|
57
|
-
- config/routes.rb
|
58
|
-
- config/locales/en.yml
|
59
|
-
- lib/adva-categories.rb
|
60
|
-
- lib/adva_categories/version.rb
|
61
|
-
- lib/adva/categories.rb
|
62
|
-
- lib/adva/routing_filters/categories.rb
|
63
|
-
- lib/testing/factories.rb
|
64
|
-
- lib/testing/paths.rb
|
65
|
-
- lib/testing/step_definitions.rb
|
45
|
+
- lib/bundler/repository.rb
|
66
46
|
has_rdoc: true
|
67
47
|
homepage: http://github.com/svenfuchs/adva-cms2
|
68
48
|
licenses: []
|
@@ -1,16 +0,0 @@
|
|
1
|
-
require_dependency 'url_helper'
|
2
|
-
|
3
|
-
UrlHelper.module_eval do
|
4
|
-
include do
|
5
|
-
def public_url_for(resources, options = {})
|
6
|
-
reject = lambda { |resource| resource.is_a?(Category) }
|
7
|
-
rejected = resources.select(&reject)
|
8
|
-
rejected.map! { |resource| [resource.class.name.foreign_key, resource.id] }
|
9
|
-
|
10
|
-
resources.reject!(&reject)
|
11
|
-
options.merge!(Hash[*rejected.flatten])
|
12
|
-
super
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
data/app/models/category.rb
DELETED
data/app/models/content_slice.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
require_dependency 'category'
|
2
|
-
require_dependency 'content'
|
3
|
-
|
4
|
-
Category.has_many_polymorphs :categorizables, :through => :categorizations, :foreign_key => 'category_id', :from => [:contents]
|
5
|
-
|
6
|
-
Content.class_eval do
|
7
|
-
has_many :categories, :through => :categorizations, :as => :categorizable
|
8
|
-
accepts_nested_attributes_for :categorizations, :allow_destroy => true
|
9
|
-
|
10
|
-
class << self
|
11
|
-
def categorized(category_id)
|
12
|
-
includes(:categorizations).where(:categorizations => { :category_id => category_id })
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
class Admin::Categories::Menu < Adva::View::Menu::Admin::Actions
|
2
|
-
include do
|
3
|
-
def main
|
4
|
-
parent_resource_label
|
5
|
-
index
|
6
|
-
edit_parent
|
7
|
-
end
|
8
|
-
|
9
|
-
def right
|
10
|
-
collection? ? new : destroy
|
11
|
-
reorder if index? # TODO should only happen if we actually have more than 1 category
|
12
|
-
end
|
13
|
-
|
14
|
-
protected
|
15
|
-
|
16
|
-
def reorder
|
17
|
-
super( :'data-resource_type' => 'section', :'data-sortable_type' => 'categories')
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
@@ -1,20 +0,0 @@
|
|
1
|
-
class Admin::Categories::Index < Minimal::Template
|
2
|
-
include do
|
3
|
-
def to_html
|
4
|
-
table_for collection, :class => 'categories list tree' do |t|
|
5
|
-
t.column :category, :actions
|
6
|
-
|
7
|
-
t.row do |r, category|
|
8
|
-
r.options[:id] = dom_id(category)
|
9
|
-
r.options[:class] = "level_#{category.level.to_i}"
|
10
|
-
r.cell capture { link_to_edit(category.name, category) }
|
11
|
-
r.cell links_to_actions([:edit, :destroy], category)
|
12
|
-
end
|
13
|
-
|
14
|
-
t.empty :p, :class => 'categories list empty' do
|
15
|
-
self.t(:'.empty', :link => capture { link_to(:'.create_item', new_path(:category)) }).html_safe
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
data/config/locales/en.yml
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
en:
|
2
|
-
menu:
|
3
|
-
categories: Categories
|
4
|
-
columns:
|
5
|
-
category: Category
|
6
|
-
actions:
|
7
|
-
categories:
|
8
|
-
columns:
|
9
|
-
category: Category
|
10
|
-
actions:
|
11
|
-
admin:
|
12
|
-
categories:
|
13
|
-
# menu:
|
14
|
-
# index: Categories
|
15
|
-
# products: Products
|
16
|
-
# new: New Category
|
17
|
-
# edit_parent: Settings
|
18
|
-
# destroy: Delete
|
19
|
-
# reorder: Reorder
|
20
|
-
# confirm_destroy: Do you really want to delete this category?
|
21
|
-
index:
|
22
|
-
create_item: Create Category
|
23
|
-
edit: Edit
|
24
|
-
destroy: Delete
|
25
|
-
confirm_destroy: Do you really want to delete this category?
|
26
|
-
empty: "There are no categories. %{link}"
|
27
|
-
new:
|
28
|
-
title: Create a Category
|
29
|
-
edit:
|
30
|
-
title: Edit Category
|
31
|
-
tabs:
|
32
|
-
categories: Categories
|
data/config/redirects.rb
DELETED
data/config/routes.rb
DELETED
data/lib/adva/categories.rb
DELETED
@@ -1,81 +0,0 @@
|
|
1
|
-
require 'routing_filter'
|
2
|
-
|
3
|
-
module RoutingFilter
|
4
|
-
class Categories < Filter
|
5
|
-
cattr_accessor :default_port
|
6
|
-
self.default_port = '80'
|
7
|
-
|
8
|
-
cattr_accessor :exclude
|
9
|
-
self.exclude = %r(^/admin)
|
10
|
-
|
11
|
-
def around_recognize(path, env, &block)
|
12
|
-
# p "#{self.class.name}: #{path}"
|
13
|
-
unless excluded?(path)
|
14
|
-
category_id = extract_category_id(env, path)
|
15
|
-
yield.tap do |params|
|
16
|
-
params[:category_id] = category_id if category_id
|
17
|
-
end
|
18
|
-
else
|
19
|
-
yield
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def around_generate(params, &block)
|
24
|
-
category_id = params.delete('category_id') || params.delete(:category_id)
|
25
|
-
yield.tap do |path|
|
26
|
-
# p "#{self.class.name}: #{path}"
|
27
|
-
insert_category_path(path, category_id) if !excluded?(path) && category_id
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
protected
|
32
|
-
|
33
|
-
def excluded?(path)
|
34
|
-
path =~ exclude
|
35
|
-
end
|
36
|
-
|
37
|
-
def extract_category_id(env, path)
|
38
|
-
if section = section_for(env, path) and path =~ recognition_pattern(section)
|
39
|
-
if category = section.categories.where(:path => $2).first
|
40
|
-
path.gsub!("#{$1}#{$2}", '')
|
41
|
-
path.replace('/') if path.blank?
|
42
|
-
category.id.to_s
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def recognition_pattern(section)
|
48
|
-
paths = section.categories.map(&:path).reject(&:blank?)
|
49
|
-
paths = paths.sort { |a, b| b.size <=> a.size }.join('|')
|
50
|
-
paths.empty? ? %r(^$) : %r(^.*(/categories/)(#{paths})(?=/|\.|\?|$))
|
51
|
-
end
|
52
|
-
|
53
|
-
def insert_category_path(path, category_id)
|
54
|
-
category = Category.find(category_id)
|
55
|
-
if path =~ section_pattern
|
56
|
-
path.sub!("/#{$1}/#{$2}", "/#{$1}/#{$2}/categories/#{category.path}")
|
57
|
-
elsif category.section.root?
|
58
|
-
path.sub!(%r(^/), "/categories/#{category.path}")
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def section_pattern
|
63
|
-
types = Section.types.map { |type| type.downcase.pluralize }.join('|')
|
64
|
-
%r(/(sections|#{types})/(\d+)(?=/|\.|\?|$))
|
65
|
-
end
|
66
|
-
|
67
|
-
def section_for(env, path)
|
68
|
-
if path =~ section_pattern
|
69
|
-
Section.find($2)
|
70
|
-
elsif path =~ %r(^/categories/\w+) && site = Site.by_host(host(env))
|
71
|
-
site.sections.root
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def host(env)
|
76
|
-
host, port = env.values_at('SERVER_NAME', 'SERVER_PORT')
|
77
|
-
port == default_port ? host : [host, port].compact.join(':')
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
data/lib/adva-categories.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
require 'adva/categories'
|
data/lib/testing/factories.rb
DELETED
data/lib/testing/paths.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
module Adva::Categories::Paths
|
2
|
-
def path_to(page)
|
3
|
-
case page
|
4
|
-
when /^the admin "([^"]*)" section categories page$/
|
5
|
-
site = Site.first
|
6
|
-
section = Section.where(:name => $1).first || raise("could not find section named #{$1}")
|
7
|
-
polymorphic_path([:admin, site, section, :categories])
|
8
|
-
else
|
9
|
-
super
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
World(Adva::Categories::Paths)
|
15
|
-
|
@@ -1,21 +0,0 @@
|
|
1
|
-
When /^I drag the category "([^"]*)" below the category "([^"]*)"$/ do |category, target|
|
2
|
-
category = Category.find_by_name(category)
|
3
|
-
target = Category.find_by_name(target)
|
4
|
-
section = Section.first
|
5
|
-
put(admin_site_section_path(section.site, section), {
|
6
|
-
:section => { :categories_attributes => [{ :id => category.id, :left_id => target.id }] },
|
7
|
-
:return_to => @request.url
|
8
|
-
})
|
9
|
-
follow_redirect!
|
10
|
-
end
|
11
|
-
|
12
|
-
Then /^the ([\w]+) (name|title)d "([^"]+)" should be categorized as "([^"]+)"$/ do |model, attribute, value, category|
|
13
|
-
record = model.classify.constantize.where(attribute => value).first
|
14
|
-
assert record.categories.map(&:name).include?(category), "expected #{record.inspect} to be categorized as #{category}"
|
15
|
-
end
|
16
|
-
|
17
|
-
Then /^the ([\w]+) (name|title)d "([^"]+)" should not be categorized as "([^"]+)"$/ do |model, attribute, value, category|
|
18
|
-
record = model.classify.constantize.where(attribute => value).first
|
19
|
-
assert !record.categories.map(&:name).include?(category), "expected #{record.inspect} not to be categorized as #{category}"
|
20
|
-
end
|
21
|
-
|