Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .github/workflows/linters.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ jobs:
reviewdog:
name: Reviewdog
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write

steps:
- name: Checkout repository
Expand All @@ -19,7 +22,7 @@ jobs:
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: '3.0'
ruby-version: '3.2'
bundler-cache: true

- name: Set up Reviewdog
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:

strategy:
matrix:
ruby: ['3.0', '3.1', '3.2', '3.3', '3.4', '4.0']
ruby: ['3.2', '3.3', '3.4', '4.0']

steps:
- name: Checkout repository
Expand Down
2 changes: 1 addition & 1 deletion .rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ AllCops:
- vendor/**/*
NewCops: enable
SuggestExtensions: false
TargetRubyVersion: 3.0
TargetRubyVersion: 3.2

Lint/MissingSuper:
Exclude:
Expand Down
3 changes: 1 addition & 2 deletions lib/tiny_admin/context.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ module TinyAdmin
:repository,
:request,
:router,
:slug,
keyword_init: true
:slug
)
end
4 changes: 2 additions & 2 deletions lib/tiny_admin/views/default_layout.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ module Views
class DefaultLayout < BasicLayout
attr_accessor :flash_component, :head_component, :messages, :navbar_component, :options, :title

def view_template(&block)
def view_template
extra_styles = TinyAdmin.settings.extra_styles
flash_component&.messages = messages
head_component&.update_attributes(page_title: title, style_links: style_links, extra_styles: extra_styles)
Expand All @@ -20,7 +20,7 @@ def view_template(&block)
main_content {
render flash_component if flash_component

yield_content(&block)
yield
}

render_scripts
Expand Down
2 changes: 1 addition & 1 deletion lib/tiny_admin/views/pages/content.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ def view_template
super do
div(class: "content") {
div(class: "content-data") {
unsafe_raw(content)
raw(safe(content))
}

render TinyAdmin::Views::Components::Widgets.new(widgets)
Expand Down
2 changes: 2 additions & 0 deletions sig/tiny_admin/router.rbs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ module TinyAdmin

def authorization: () -> untyped

def authorize!: (Symbol, ?String?) { () -> void } -> void

def render_page: (untyped) -> void

def root_route: (untyped) -> void
Expand Down
3 changes: 2 additions & 1 deletion sig/tiny_admin/settings.rbs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@ module TinyAdmin
OPTIONS: Array[Symbol]

@options: Hash[Array[Symbol], untyped]
@loaded: bool

attr_reader store: Store
attr_reader store: Store?

# Dynamically defined accessors for OPTIONS
def authentication: () -> untyped
Expand Down
4 changes: 1 addition & 3 deletions sig/tiny_admin/views/actions/index.rbs
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,10 @@ module TinyAdmin
attr_accessor records: Enumerable[untyped]
attr_accessor slug: String

def view_template: () ?{ (untyped) -> void } -> void
def view_template: () ?{ () -> void } -> void

private

def actions_buttons: () -> void

def table_body: () -> void

def table_header: () -> void
Expand Down
6 changes: 1 addition & 5 deletions sig/tiny_admin/views/actions/show.rbs
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,7 @@ module TinyAdmin
attr_accessor reference: untyped
attr_accessor slug: String

def view_template: () ?{ (untyped) -> void } -> void

private

def actions_buttons: () -> void
def view_template: () ?{ () -> void } -> void
end
end
end
Expand Down
7 changes: 7 additions & 0 deletions sig/tiny_admin/views/attributes.rbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
module TinyAdmin
module Views
module Attributes
def update_attributes: (Hash[Symbol, untyped]) -> void
end
end
end
3 changes: 1 addition & 2 deletions sig/tiny_admin/views/basic_layout.rbs
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
module TinyAdmin
module Views
class BasicLayout
include Attributes
include Utils

attr_accessor content: untyped
attr_accessor params: untyped
attr_accessor widgets: untyped

def label_for: (String, options: Array[untyped]) -> String?

def update_attributes: (Hash[Symbol, untyped]) -> void
end
end
end
13 changes: 13 additions & 0 deletions sig/tiny_admin/views/components/actions_buttons.rbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
module TinyAdmin
module Views
module Components
class ActionsButtons < BasicComponent
attr_accessor actions: Hash[String, untyped]?
attr_accessor slug: String?
attr_accessor reference: untyped

def view_template: () -> void
end
end
end
end
2 changes: 1 addition & 1 deletion sig/tiny_admin/views/components/basic_component.rbs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ module TinyAdmin
module Views
module Components
class BasicComponent
def update_attributes: (Hash[Symbol, untyped]) -> void
include Attributes
end
end
end
Expand Down
2 changes: 1 addition & 1 deletion sig/tiny_admin/views/default_layout.rbs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ module TinyAdmin
attr_accessor options: Array[Symbol]?
attr_accessor title: String?

def view_template: () ?{ (untyped) -> void } -> void
def view_template: () ?{ () -> void } -> void

private

Expand Down
2 changes: 1 addition & 1 deletion sig/tiny_admin/views/pages/content.rbs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ module TinyAdmin
module Views
module Pages
class Content < DefaultLayout
def view_template: () ?{ () -> void } -> void
def view_template: () -> void
end
end
end
Expand Down
13 changes: 13 additions & 0 deletions sig/tiny_admin/views/pages/error_page.rbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
module TinyAdmin
module Views
module Pages
class ErrorPage < DefaultLayout
def view_template: () -> void

private

def css_class: () -> String
end
end
end
end
4 changes: 1 addition & 3 deletions sig/tiny_admin/views/pages/page_not_allowed.rbs
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
module TinyAdmin
module Views
module Pages
class PageNotAllowed < DefaultLayout
def view_template: () ?{ () -> void } -> void

class PageNotAllowed < ErrorPage
def title: () -> String
end
end
Expand Down
4 changes: 1 addition & 3 deletions sig/tiny_admin/views/pages/page_not_found.rbs
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
module TinyAdmin
module Views
module Pages
class PageNotFound < DefaultLayout
def view_template: () ?{ () -> void } -> void

class PageNotFound < ErrorPage
def title: () -> String
end
end
Expand Down
4 changes: 1 addition & 3 deletions sig/tiny_admin/views/pages/record_not_found.rbs
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
module TinyAdmin
module Views
module Pages
class RecordNotFound < DefaultLayout
def view_template: () ?{ () -> void } -> void

class RecordNotFound < ErrorPage
def title: () -> String
end
end
Expand Down
2 changes: 1 addition & 1 deletion sig/tiny_admin/views/pages/root.rbs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ module TinyAdmin
module Views
module Pages
class Root < DefaultLayout
def view_template: () ?{ () -> void } -> void
def view_template: () -> void
end
end
end
Expand Down
2 changes: 1 addition & 1 deletion sig/tiny_admin/views/pages/simple_auth_login.rbs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ module TinyAdmin
module Views
module Pages
class SimpleAuthLogin < DefaultLayout
def view_template: () ?{ () -> void } -> void
def view_template: () -> void

def title: () -> String
end
Expand Down
37 changes: 37 additions & 0 deletions spec/lib/tiny_admin/settings_idempotent_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# frozen_string_literal: true

require "dummy_rails_app"
require "rails_helper"

RSpec.describe "Load Settings idempotency" do # rubocop:disable RSpec/DescribeClass
let(:settings) { TinyAdmin::Settings.instance }

around do |example|
saved = settings.instance_variable_get(:@options)&.deep_dup
saved_store = settings.instance_variable_get(:@store)
saved_loaded = settings.instance_variable_get(:@loaded)
example.run
ensure
settings.instance_variable_set(:@options, saved)
settings.instance_variable_set(:@store, saved_store)
settings.instance_variable_set(:@loaded, saved_loaded)
end

it "does not re-run on subsequent calls" do
settings.reset!
settings.load_settings
store = settings.store
settings.load_settings
expect(settings.store).to equal(store)
end

it "runs again after reset!" do
settings.reset!
settings.load_settings
store = settings.store

settings.reset!
settings.load_settings
expect(settings.store).not_to equal(store)
end
end
56 changes: 56 additions & 0 deletions spec/lib/tiny_admin/views/components/actions_buttons_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# frozen_string_literal: true

require "dummy_rails_app"
require "rails_helper"

RSpec.describe TinyAdmin::Views::Components::ActionsButtons do
let(:settings) { TinyAdmin::Settings.instance }

before { settings.load_settings }

describe "with no actions" do
it "renders an empty nav list", :aggregate_failures do
component = described_class.new
component.update_attributes(actions: {}, slug: "posts")
html = component.call
expect(html).to include("nav")
expect(html).not_to include("nav-item")
end
end

describe "with actions" do
let(:action_class) do
Class.new do
def self.title
"Export"
end
end
end

it "renders action buttons with links", :aggregate_failures do
component = described_class.new
component.update_attributes(actions: { "export" => action_class }, slug: "posts")
html = component.call
expect(html).to include("Export")
expect(html).to include("export")
expect(html).to include("nav-item")
end

it "includes the reference in the URL when provided" do
component = described_class.new
component.update_attributes(actions: { "export" => action_class }, slug: "posts", reference: "42")
html = component.call
expect(html).to include("42")
end
end

describe "with an action class that does not respond to title" do
it "falls back to the action key as label" do
action_class = Class.new
component = described_class.new
component.update_attributes(actions: { "download" => action_class }, slug: "posts")
html = component.call
expect(html).to include("download")
end
end
end
20 changes: 10 additions & 10 deletions tiny_admin.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,17 @@ $:.push File.expand_path("lib", __dir__)
require "tiny_admin/version"

Gem::Specification.new do |spec|
spec.platform = Gem::Platform::RUBY
spec.name = "tiny_admin"
spec.version = TinyAdmin::VERSION
spec.summary = "Tiny Admin"
spec.platform = Gem::Platform::RUBY
spec.name = "tiny_admin"
spec.version = TinyAdmin::VERSION
spec.summary = "Tiny Admin"
spec.description = "A compact and composable dashboard component for Ruby"
spec.license = "MIT"
spec.license = "MIT"

spec.required_ruby_version = ">= 3.0.0"
spec.required_ruby_version = ">= 3.2.0"

spec.author = "Mattia Roccoberton"
spec.email = "mat@blocknot.es"
spec.author = "Mattia Roccoberton"
spec.email = "mat@blocknot.es"
spec.homepage = "https://github.com/blocknotes/tiny_admin"

spec.metadata = {
Expand All @@ -25,10 +25,10 @@ Gem::Specification.new do |spec|
"rubygems_mfa_required" => "true"
}

spec.files = Dir["{app,db,lib}/**/*", "LICENSE.txt", "README.md"]
spec.files = Dir["{app,db,lib}/**/*", "LICENSE.txt", "README.md"]
spec.require_paths = ["lib"]

spec.add_dependency "phlex", "~> 1", ">= 1.10.0"
spec.add_dependency "phlex", "~> 2"
spec.add_dependency "roda", "~> 3"
spec.add_dependency "tilt", "~> 2"
spec.add_dependency "zeitwerk", "~> 2"
Expand Down
Loading