Skip to content

Commit

Permalink
Refactor object title resolvation.
Browse files Browse the repository at this point in the history
  • Loading branch information
miks committed Feb 28, 2016
1 parent c5eba44 commit f7eaca4
Show file tree
Hide file tree
Showing 31 changed files with 149 additions and 123 deletions.
11 changes: 11 additions & 0 deletions CHANGELOG.md
@@ -1,6 +1,17 @@
## Changelog

### 2016.02.28
* Object title resolvation refactored.
From now `to_text` need to be renamed to `releaf_title` in existing
project.
Releaf will try to check whether method exist and then return its
result.
Resolvable methods list: `releaf_title`, `name`, `title`, `to_s`.
You can migrate you existing `to_text` methods with:
```
perl -p -i -e 's/to_text/releaf_title/g' `grep -ril "to_text" *`
```

* Translations models and tables renamed.

create migration `rails g migration RenameReleafI18nBackendTables`
Expand Down
3 changes: 0 additions & 3 deletions releaf-content/lib/releaf/content/node.rb
Expand Up @@ -265,9 +265,6 @@ def valid_node_content_classes parent_id=nil
validates_presence_of :parent, if: :parent_id?
validate :validate_parent_node_is_not_self
validate :validate_parent_is_not_descendant

alias_attribute :to_text, :name

belongs_to :content, polymorphic: true, dependent: :destroy
accepts_nested_attributes_for :content

Expand Down
6 changes: 2 additions & 4 deletions releaf-core/app/builders/releaf/builders/base.rb
Expand Up @@ -76,9 +76,7 @@ def default_translation_scope
controller_scope_name
end

# calls `#to_text` on resource if resource supports it. Otherwise calls
# `#to_s` method
def resource_to_text(resource)
resource.send(resource.respond_to?(:to_text) ? :to_text : :to_s)
def resource_title(resource)
Releaf::ResourceBase.title(resource)
end
end
Expand Up @@ -4,7 +4,7 @@ def question_content
end

def description_content
resource_to_text(resource)
resource_title(resource)
end

def section_header_text
Expand Down
Expand Up @@ -108,7 +108,7 @@ def releaf_has_many_association_field(reflector, destroyable)
def releaf_item_field_choices(name, options = {})
unless options.key? :select_options
options[:select_options] = releaf_item_field_collection(name, options)
.collect{|item| [resource_to_text(item), item.id]}
.collect{|item| [resource_title(item), item.id]}
end

if options[:select_options].is_a? Array
Expand Down
Expand Up @@ -2,10 +2,11 @@ class Releaf::Builders::RefusedDestroyDialogBuilder
include Releaf::Builders::ResourceDialog

def section_body
message = "Deletion of %{resource} restricted due to existing relations:"
tag(:div, class: "body") do
[
icon("ban"),
tag(:div, t("Deletion of %{resource} was refused due to existing relations:", default: "Deletion of %{resource} restricted, due to existing relations:", resource: resource_to_text(resource)), class: "description"),
tag(:div, t(message, default: message, resource: resource_title(resource)), class: "description"),
restricted_relations
]
end
Expand Down Expand Up @@ -42,9 +43,9 @@ def relation_objects(relation)
def relation_objects_item(item, relation)
tag(:li) do
unless relation[:controller].nil?
link_to(resource_to_text(item), controller: relation[:controller], action: "edit", id: item)
link_to(resource_title(item), controller: relation[:controller], action: "edit", id: item)
else
resource_to_text(item)
resource_title(item)
end
end
end
Expand Down
2 changes: 1 addition & 1 deletion releaf-core/app/builders/releaf/builders/resource_view.rb
Expand Up @@ -14,7 +14,7 @@ def section_content
end

def section_header_text
resource.new_record? ? t("Create new resource") : resource_to_text(resource)
resource.new_record? ? t("Create new resource") : resource_title(resource)
end

def section_header_extras
Expand Down
6 changes: 1 addition & 5 deletions releaf-core/app/builders/releaf/builders/table_builder.rb
Expand Up @@ -148,11 +148,7 @@ def format_text_content(resource, column)

def format_string_content(resource, column)
value = column_value(resource, column)
if value.respond_to? :to_text
value.to_text
else
value.to_s
end
resource_title(value)
end

def format_boolean_content(resource, column)
Expand Down
6 changes: 1 addition & 5 deletions releaf-core/app/lib/releaf/action_controller/breadcrumbs.rb
Expand Up @@ -28,11 +28,7 @@ def add_resource_breadcrumb resource, url = nil
name= I18n.t('New record', scope: 'admin.breadcrumbs')
url = url_for(action: :new, only_path: true) if url.nil?
else
if resource.respond_to?(:to_text)
name = resource.send(:to_text)
else
name = I18n.t('Edit record', scope: 'admin.breadcrumbs')
end
name = Releaf::ResourceBase.title(resource)
url = url_for(action: :edit, id: resource.id, only_path: true) if url.nil?
end
@breadcrumbs << { name: name, url: url }
Expand Down
10 changes: 10 additions & 0 deletions releaf-core/app/lib/releaf/resource_base.rb
Expand Up @@ -61,4 +61,14 @@ def includable_association_types
def excluded_associations
[:translations]
end

def self.title(resource)
title_methods.each do|method_name|
return resource.send(method_name) if resource.respond_to?(method_name)
end
end

def self.title_methods
[:releaf_title, :name, :title, :to_s]
end
end
2 changes: 1 addition & 1 deletion releaf-core/app/models/releaf/settings.rb
Expand Up @@ -3,7 +3,7 @@ class Releaf::Settings < RailsSettings::CachedSettings
cattr_accessor :registry
@@registry = {}.with_indifferent_access

def to_text
def releaf_title
var
end

Expand Down
Expand Up @@ -7,7 +7,7 @@ def render_book_sequels_sequel_id
def book_sequels_sequel_id_options
original_book = options[:parent_builder].object
books = Book.where(Book.arel_table[:id].not_eq(original_book.id))
options_from_collection_for_select(books, :id, :to_text, object.sequel_id)
options_from_collection_for_select(books, :id, :title, object.sequel_id)
end
end
end
4 changes: 2 additions & 2 deletions releaf-core/lib/generators/dummy/templates/models/author.rb
Expand Up @@ -4,7 +4,7 @@ class Author < ActiveRecord::Base

has_many :books, dependent: :restrict_with_exception

def to_text
return "#{name} #{surname}"
def releaf_title
"#{name} #{surname}"
end
end
2 changes: 0 additions & 2 deletions releaf-core/lib/generators/dummy/templates/models/book.rb
Expand Up @@ -14,6 +14,4 @@ class Book < ActiveRecord::Base
accepts_nested_attributes_for :book_sequels, allow_destroy: true

dragonfly_accessor :cover_image

alias_attribute :to_text, :title
end
2 changes: 0 additions & 2 deletions releaf-core/lib/generators/dummy/templates/models/chapter.rb
@@ -1,7 +1,5 @@
# TODO convert to arel
class Chapter < ActiveRecord::Base
validates_presence_of :title, :text, :book, :sample_html
belongs_to :book
alias_attribute :to_text, :title
default_scope { order('chapters.item_position ASC') }
end
@@ -1,9 +1,4 @@
class Publisher < ActiveRecord::Base
validates_presence_of :title

has_many :authors, dependent: :restrict_with_exception

def to_text
title
end
end
@@ -1,5 +1,4 @@
class TextPage < ActiveRecord::Base
acts_as_node
validates_presence_of :text_html
alias_attribute :to_text, :id
end
50 changes: 50 additions & 0 deletions releaf-core/lib/releaf/controller_configuration.rb
@@ -0,0 +1,50 @@
module Releaf
class Controller
attr_accessor :name, :url_helper, :items, :controller

def title
I18n.t(name, scope: "admin.controllers")
end

def path
@path ||= Rails.application.routes.url_helpers.send("#{url_helper}_path")
end

def self.configuration(controller_class)
end

def self.extract_controllers(list)
list.each.inject({}) do |controller_list, item|
controller_list[item[:controller]] = item if item.has_key? :controller
controller_list.merge!(extract_controllers(item[:items])) if item.has_key? :items
controller_list
end
end

def self.normalize_controllers(list)
list.map{|item| normalize_controller_item(item)}
end

def self.normalize_controller_item(item_configuration)
item = {controller: item} if item.is_a? String
item[:name] ||= item[:controller]

if item.has_key? :helper
item[:url_helper] = item[:helper].to_sym
elsif item.has_key? :controller
item[:url_helper] = item[:controller].tr('/', '_').to_sym
elsif item.has_key?(:items)
item[:items] = normalize_controllers(item[:items])
end

instance = Releaf::ControllerConfiguration.new

item.each_pair do |key, value|
instance.send("#{key}=", value)
end

instance
end
end
end

20 changes: 4 additions & 16 deletions releaf-core/spec/builders/releaf/builders/base_spec.rb
Expand Up @@ -254,22 +254,10 @@ class BuilderIncluder
end
end

describe "#resource_to_text" do
let(:resource){ Releaf::Permissions::User.new(name: "a", surname: "b") }

context "when given resource respond to #to_text method" do
it "returns resource #to_text output" do
expect(subject.resource_to_text(resource)).to eq("a b")
end
end

context "when given resource does not respond to #to_text method" do
it "returns resource #to_s output" do
allow(resource).to receive(:respond_to?).and_call_original
allow(resource).to receive(:respond_to?).with(:to_text).and_return(false)
allow(resource).to receive(:to_s).and_return("x")
expect(subject.resource_to_text(resource)).to eq("x")
end
describe "#resource_title" do
it "pass given resource to Releaf::ResourceBase.title and return result" do
allow(Releaf::ResourceBase).to receive(:title).with("x").and_return("ljhg")
expect(subject.resource_title("x")).to eq("ljhg")
end
end

Expand Down
Expand Up @@ -37,8 +37,8 @@ def request_forgery_protection_token
end

describe "#description_content" do
it "returns `resource_to_text` value" do
allow(subject).to receive(:resource_to_text).with(object).and_return("xx")
it "returns `resource_title` value" do
allow(subject).to receive(:resource_title).with(object).and_return("xx")
expect(subject.description_content).to eq("xx")
end
end
Expand Down
Expand Up @@ -47,7 +47,7 @@ class ResourceViewTestHelper < ActionView::Base
describe "#section_header_text" do
before do
allow(subject).to receive(:t).with("Create new resource").and_return("newww")
allow(subject).to receive(:resource_to_text).with(resource).and_return("existng")
allow(subject).to receive(:resource_title).with(resource).and_return("existng")
end

context "when resource is new object" do
Expand Down
21 changes: 5 additions & 16 deletions releaf-core/spec/builders/releaf/builders/table_builder_spec.rb
Expand Up @@ -369,26 +369,15 @@ def custom_title(resource); end
end

describe "#format_string_content" do
context "when resource column value respond to #to_text method" do
it "returns value #to_text" do
fake_obj = double
allow(fake_obj).to receive(:to_text).and_return("nineninine")

allow(subject).to receive(:column_value).with(resource, :id)
.and_return(fake_obj)
context "when resource column value respond to #resource_title method" do
it "returns resource to title result" do
another_obj = Book.new
allow(subject).to receive(:column_value).with(resource, :id).and_return(another_obj)
allow(subject).to receive(:resource_title).with(another_obj).and_return("nineninine")

expect(subject.format_string_content(resource, :id)).to eq("nineninine")
end
end

context "when resource column value do not respond to #to_text method" do
it "returns value casted to string" do
allow(subject).to receive(:column_value).with(resource, :id)
.and_return(99)

expect(subject.format_string_content(resource, :id)).to eq("99")
end
end
end

describe "#format_boolean_content" do
Expand Down
33 changes: 9 additions & 24 deletions releaf-core/spec/controllers/releaf/action_controller_spec.rb
Expand Up @@ -426,17 +426,14 @@ class FooFormBuilder; end
describe "GET #new" do
it "assigns the requested record to @resource" do
get :new

expect(assigns(:resource).new_record?).to be true
end

context "when the requested record responds to #to_text" do
it "uses the result of #to_text for resource's breadcrumb name" do
get :new
breadcrumbs = @breadcrumbs_base + [{name: "New record", url: new_admin_book_path}]
it "assigns special breadcrumb part for new record" do
get :new
breadcrumbs = @breadcrumbs_base + [{name: "New record", url: new_admin_book_path}]

expect(assigns(:breadcrumbs)).to eq(breadcrumbs)
end
expect(assigns(:breadcrumbs)).to eq(breadcrumbs)
end
end

Expand All @@ -451,24 +448,12 @@ class FooFormBuilder; end
expect(assigns(:resource)).to eq(@resource)
end

context "when the requested record responds to #to_text" do
it "uses the result of #to_text for resource's breadcrumb name" do
get :edit, id: @resource
breadcrumbs = @breadcrumbs_base + [{name: @resource.to_text, url: edit_admin_book_path(@resource.id)}]

expect(assigns(:breadcrumbs)).to eq(breadcrumbs)
end
end

context "when the requested record does not respond to #to_text" do
it "uses default translation for resource's breadcrumb name" do
skip "Find out way how to stub loaded resource #respond_to?(:to_text)"
allow_any_instance_of(Book).to receive(:respond_to?).with(:to_text).and_return(false)
get :edit, id: @resource
breadcrumbs = @breadcrumbs_base + [{name: "Edit resource", url: edit_admin_book_path(@resource.id)}]
it "assigns breadcrumb for resource" do
allow(Releaf::ResourceBase).to receive(:title).with(@resource).and_return("xxx")
get :edit, id: @resource
breadcrumbs = @breadcrumbs_base + [{name: "xxx", url: edit_admin_book_path(@resource.id)}]

expect(assigns(:breadcrumbs)).to eq(breadcrumbs)
end
expect(assigns(:breadcrumbs)).to eq(breadcrumbs)
end
end
end
4 changes: 2 additions & 2 deletions releaf-core/spec/features/ajaxbox_spec.rb
Expand Up @@ -8,7 +8,7 @@
user = Releaf::Permissions::User.last
visit releaf_permissions_users_path
click_link user.name
expect(page).to have_header(text: user.to_text)
expect(page).to have_header(text: user.releaf_title)

open_toolbox_dialog "Delete"
within_dialog{ click_link "No" }
Expand Down Expand Up @@ -79,7 +79,7 @@
user = Releaf::Permissions::User.last
visit releaf_permissions_users_path
click_link user.name
expect(page).to have_header(text: user.to_text)
expect(page).to have_header(text: user.releaf_title)
open_toolbox_dialog "Delete"

expect(page).to have_css(".mfp-bg")
Expand Down

0 comments on commit f7eaca4

Please sign in to comment.