Skip to content

Commit

Permalink
🧹 Furniture: Consolidate to Furniture to prep to drop `FurnitureP…
Browse files Browse the repository at this point in the history
…lacement` (#1208)

* 🧹 `Furniture`: Streamline routing & instantiation

- #709

This helps prepare us to rename from `FurniturePlacement` down to
`Furniture` by getting rid of some unnecessary fiddly bits.

Theoretically, our next step is to inline the `Furniture` namespace into
`FurniturePlacement` to make space at the `Furniture` namespace; then
rename `FurniturePlacement` to `Furniture`...

And then we don't have `Placement` anymore! Just `Furniture`!

* `Furniture`: Inline `Furniture` into `FurniturePlacement`

This gets us almost all the way to the rename; since we don't have the
`Furniture` namespace in the way...

* 🧹 `Furniture`: Dynamic registry to get around circular class-load dependency

So:

```app/furniture/form.rb
class Form < FurniturePlacement
end
```

loads
```app/models/furniture_placement.rb
class FurniturePlacement
  REGISTRY = { Form }
end

```
Which loads...

You guessed it!

```app/furniture/form.rb
class Form < FurniturePlacement
end
```

Pulling the registry definition out of interpret-time and into runtime
fixes that; since the `Form` constant isn't referenced until the
`FurniturePlacement.registry` method is accessed.
  • Loading branch information
zspencer authored Mar 11, 2023
1 parent 60054b2 commit 0bf243d
Show file tree
Hide file tree
Showing 10 changed files with 33 additions and 51 deletions.
4 changes: 0 additions & 4 deletions app/furniture/embedded_form.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,4 @@ def attribute_names
def form_template
"embedded_forms/form"
end

def self.from_placement(placement)
placement.becomes(self)
end
end
27 changes: 0 additions & 27 deletions app/furniture/furniture.rb

This file was deleted.

3 changes: 0 additions & 3 deletions app/furniture/journal.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,4 @@

# @see features/furniture/journal.feature.md
class Journal
def self.from_placement(placement)
placement.becomes(Journal)
end
end
4 changes: 0 additions & 4 deletions app/furniture/livestream.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,4 @@ def form_template
def attribute_names
%w[channel layout provider]
end

def self.from_placement(placement)
placement.becomes(self)
end
end
4 changes: 0 additions & 4 deletions app/furniture/markdown_text_block.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,4 @@ def attribute_names
def form_template
"markdown_text_blocks/form"
end

def self.from_placement(placement)
placement.becomes(self)
end
end
6 changes: 1 addition & 5 deletions app/furniture/marketplace.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,2 @@
# @see features/furniture/marketplace.feature.md
class Marketplace
def self.from_placement(placement)
placement.becomes(Marketplace)
end
end
class Marketplace; end
2 changes: 1 addition & 1 deletion app/lib/space_routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ def self.append_routes(router)
router.resource :rsvp, only: %i[show update]
end
router.resources :rooms, only: %i[show edit update new create destroy] do
Furniture.append_routes(router)
FurniturePlacement.append_routes(router)
router.resources :furniture_placements, only: %i[create edit update destroy]
end

Expand Down
30 changes: 29 additions & 1 deletion app/models/furniture_placement.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class FurniturePlacement < ApplicationRecord
delegate :attributes=, to: :furniture, prefix: true

def furniture
@furniture ||= Furniture.from_placement(self)
@furniture ||= FurniturePlacement.from_placement(self)
end

def title
Expand All @@ -48,4 +48,32 @@ def write_attribute(name, value)
rescue ActiveModel::MissingAttributeError => _e
settings[name] = value
end

def self.router
return const_get(:Routes) if const_defined?(:Routes)
return class_name.constantize.const_get(:Routes) if class_name.constantize.const_defined?(:Routes)
end

def self.registry
@registry ||= {
journal: ::Journal::Journal,
markdown_text_block: ::MarkdownTextBlock,
marketplace: ::Marketplace::Marketplace,
livestream: ::Livestream,
embedded_form: EmbeddedForm
}
end

# Appends each Furnitures CRUD actions within the {Room}
def self.append_routes(router)
registry.each_value do |furniture|
furniture.router&.append_routes(router)
end
end

# @return [FurniturePlacement]
def self.from_placement(placement)
furniture_class = registry.fetch(placement.furniture_kind.to_sym)
placement.becomes(furniture_class)
end
end
2 changes: 1 addition & 1 deletion app/policies/furniture_placement_policy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,6 @@ def permitted_attributes(_params)
end

def furniture_params
Furniture::REGISTRY.values.flat_map { |f| f.new.try(:attribute_names) }.compact
FurniturePlacement.registry.values.flat_map { |f| f.new.try(:attribute_names) }.compact
end
end
2 changes: 1 addition & 1 deletion app/views/furniture_placements/_new.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<h3><%= t('rooms.place_furniture_heading') %></h3>
<%= form_with model: furniture_placement.location do | placement_form | %>
<%= placement_form.hidden_field :slot, value: furniture_placement.room.furniture_placements.count %>
<%= placement_form.select :furniture_kind, Furniture::REGISTRY.keys.map { |k| [k.to_s.titleize, k] } %>
<%= placement_form.select :furniture_kind, FurniturePlacement.registry.keys.map { |k| [k.to_s.titleize, k] } %>
<footer>
<%= placement_form.submit %>
</footer>
Expand Down

0 comments on commit 0bf243d

Please sign in to comment.