glimmer-dsl-web 0.6.6 → 0.6.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -1
- data/README.md +18 -12
- data/VERSION +1 -1
- data/glimmer-dsl-web.gemspec +3 -3
- data/lib/rails/resource_service.rb +43 -5
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9f078ee2fccbdecc49040923265ba09b4bff1a0c9c0fb7c062c4aae58b68873d
|
4
|
+
data.tar.gz: 7c3917e649acd80f9f20754b123b8cdd25a8bc435910dbc704d045b3174d2c27
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6e080034e25b6aff5b70213f6fa991ae5c8e37fe38796703f1863c702c6268a1f9a827f0fd07926a0ca88ff3d952e2fea63ce794cd606395a1faf622d521bdb1
|
7
|
+
data.tar.gz: 1c8135017efb0ba4b8815040cc8c5a9401360c84ea19d31af4d55f0565988480f8d58066dfe108d5e96d54cf91aeac8a4f9350ad40ccb78d1f6dbe0b1c6c06b1
|
data/CHANGELOG.md
CHANGED
@@ -1,10 +1,21 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## 0.6.8
|
4
|
+
|
5
|
+
- `Rails::ResourceService` provides `errors` as 3rd argument of `response_handler` block in erroneous web requests.
|
6
|
+
- Refactor/simplify code of Contact Manager sample with `Rails::ResourceService` enhancements to provide `errors` as `response_handler` 3rd argument
|
7
|
+
|
8
|
+
## 0.6.7
|
9
|
+
|
10
|
+
- `Rails::ResourceService` builds resource models using `resource_class` and provides `resources`/`resource` as 2nd argument of `response_handler` block in index/show/create/update calls.
|
11
|
+
- Refactor/simplify code of Contact Manager sample with `Rails::ResourceService` enhancements to provide resource models in `response_handler` 2nd argument
|
12
|
+
|
3
13
|
## 0.6.6
|
4
14
|
|
5
|
-
- `Rails::ResourceService` supports index/show/create/update/
|
15
|
+
- `Rails::ResourceService` supports index/show/create/update/destroy REST API calls for any Rails resources
|
6
16
|
- Support being able to set or data-bind `title` property on HTML elements
|
7
17
|
- Restrict use of `title` tag to within a `head` element only
|
18
|
+
- Contact Manager Sample: https://github.com/AndyObtiva/sample-glimmer-dsl-web-rails7-app/blob/master/app/assets/opal/contact_manager.rb
|
8
19
|
|
9
20
|
## 0.6.5
|
10
21
|
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# [<img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=85 />](https://github.com/AndyObtiva/glimmer) Glimmer DSL for Web 0.6.
|
1
|
+
# [<img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=85 />](https://github.com/AndyObtiva/glimmer) Glimmer DSL for Web 0.6.8 (Beta)
|
2
2
|
## Ruby-in-the-Browser Web Frontend Framework
|
3
3
|
### The "Rails" of Frontend Frameworks!!! ([Fukuoka Award Winning](https://andymaleh.blogspot.com/2025/01/glimmer-dsl-for-web-wins-in-fukuoka.html))
|
4
4
|
#### Finally, Ruby Developer Productivity, Happiness, and Fun in the Frontend!!!
|
@@ -1408,7 +1408,7 @@ rails new glimmer_app_server
|
|
1408
1408
|
Add the following to `Gemfile`:
|
1409
1409
|
|
1410
1410
|
```
|
1411
|
-
gem 'glimmer-dsl-web', '~> 0.6.
|
1411
|
+
gem 'glimmer-dsl-web', '~> 0.6.8'
|
1412
1412
|
```
|
1413
1413
|
|
1414
1414
|
Run:
|
@@ -1703,32 +1703,38 @@ you can use [Rails::ResourceService](/lib/rails/resource_service.rb) (`require '
|
|
1703
1703
|
the `Rails::ResourceService` class source code to find out what its API is. It can work with a basic Rails Scaffold of a Resource
|
1704
1704
|
if Developers would rather not write the Backend by hand.
|
1705
1705
|
|
1706
|
+
`Rails::ResourceService` API:
|
1707
|
+
- `index(resource: nil, resource_class: nil, singular_resource_name: nil, plural_resource_name: nil, index_resource_url: nil, params: nil) { |response| ... }`
|
1708
|
+
- `show(resource: nil, resource_class: nil, resource_id: nil, singular_resource_name: nil, plural_resource_name: nil, show_resource_url: nil, params: nil) { |response| ... }`
|
1709
|
+
- `create(resource: nil, resource_class: nil, resource_attributes: nil, singular_resource_name: nil, plural_resource_name: nil, create_resource_url: nil, params: nil) { |response, created_resource, errors| ... }`
|
1710
|
+
- `update(resource: nil, resource_class: nil, resource_id: nil, resource_attributes: nil, singular_resource_name: nil, plural_resource_name: nil, update_resource_url: nil, params: nil) { |response, updated_resource, errors| ... }`
|
1711
|
+
- `destroy(resource: nil, resource_class: nil, resource_id: nil, singular_resource_name: nil, plural_resource_name: nil, destroy_resource_url: nil, params: nil) { |response| ... }`
|
1712
|
+
|
1713
|
+
`Rails::ResourceService` follows the 'Convention over Configuration' Rails principle as it auto-derives the URL to call based on the `resource` class and data.
|
1714
|
+
|
1706
1715
|
Example from [ContactPresenter](https://github.com/AndyObtiva/sample-glimmer-dsl-web-rails7-app/blob/master/app/assets/opal/contact_manager/presenters/contact_presenter.rb) in the [Contact Manager](#contact-manager) sample:
|
1707
1716
|
|
1708
1717
|
`form_contact` is an instance of the [Contact](https://github.com/AndyObtiva/sample-glimmer-dsl-web-rails7-app/blob/master/app/assets/opal/contact_manager/models/contact.rb) class.
|
1709
1718
|
|
1710
1719
|
```ruby
|
1711
|
-
Rails::ResourceService.update(resource: form_contact) do |response|
|
1720
|
+
Rails::ResourceService.update(resource: form_contact) do |response, updated_contact, errors|
|
1712
1721
|
if response.ok?
|
1713
|
-
updated_contact_response_body = Native(response.body)
|
1714
|
-
updated_contact = form_contact.clone
|
1715
|
-
updated_contact.updated_at = updated_contact_response_body.updated_at
|
1716
1722
|
contacts[edit_index].load_with(updated_contact)
|
1717
1723
|
self.edit_index = nil
|
1718
1724
|
form_contact.reset
|
1719
1725
|
form_contact.errors = nil
|
1720
1726
|
else
|
1721
|
-
form_contact.errors =
|
1727
|
+
form_contact.errors = errors
|
1722
1728
|
end
|
1723
1729
|
end
|
1724
1730
|
```
|
1725
1731
|
|
1726
1732
|
Note that there are alternative ways of invoking the `Rails::ResourceService.update` call:
|
1727
|
-
- `Rails::ResourceService.update(resource: form_contact)`
|
1728
|
-
- `Rails::ResourceService.update(resource_class: Contact, resource_id: form_contact.id, resource_attributes: {first_name: form_contact.first_name, ...})`
|
1729
|
-
- `Rails::ResourceService.update(singular_resource_name: 'contact', resource_id: form_contact.id, resource_attributes: {first_name: form_contact.first_name, ...})`
|
1730
|
-
- `Rails::ResourceService.update(update_resource_url: "/contacts/#{form_contact.id}.json", resource_attributes: {first_name: form_contact.first_name, ...})`
|
1731
|
-
- `Rails::ResourceService.update(update_resource_url: "/contacts/#{form_contact.id}.json", params: {contact: {first_name: form_contact.first_name, ...}})`
|
1733
|
+
- `Rails::ResourceService.update(resource: form_contact) { |response, resource, errors| ... }`
|
1734
|
+
- `Rails::ResourceService.update(resource_class: Contact, resource_id: form_contact.id, resource_attributes: {first_name: form_contact.first_name, ...}) { |response, resource, errors| ... }`
|
1735
|
+
- `Rails::ResourceService.update(singular_resource_name: 'contact', resource_id: form_contact.id, resource_attributes: {first_name: form_contact.first_name, ...}) { |response, resource, errors| ... }`
|
1736
|
+
- `Rails::ResourceService.update(update_resource_url: "/contacts/#{form_contact.id}.json", resource_attributes: {first_name: form_contact.first_name, ...}) { |response, resource, errors| ... }`
|
1737
|
+
- `Rails::ResourceService.update(update_resource_url: "/contacts/#{form_contact.id}.json", params: {contact: {first_name: form_contact.first_name, ...}}) { |response, resource, errors| ... }`
|
1732
1738
|
|
1733
1739
|
## Supported Glimmer DSL Keywords
|
1734
1740
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.6.
|
1
|
+
0.6.8
|
data/glimmer-dsl-web.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: glimmer-dsl-web 0.6.
|
5
|
+
# stub: glimmer-dsl-web 0.6.8 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "glimmer-dsl-web".freeze
|
9
|
-
s.version = "0.6.
|
9
|
+
s.version = "0.6.8"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib".freeze]
|
13
13
|
s.authors = ["Andy Maleh".freeze]
|
14
|
-
s.date = "2025-02-
|
14
|
+
s.date = "2025-02-18"
|
15
15
|
s.description = "Glimmer DSL for Web (Ruby in the Browser Web Frontend Framework) enables building Web Frontends using Ruby in the Browser, as per Matz's recommendation in his RubyConf 2022 keynote speech to replace JavaScript with Ruby. It aims at providing the simplest, most intuitive, most straight-forward, and most productive frontend framework in existence. The framework follows the Ruby way (with DSLs and TIMTOWTDI) and the Rails way (Convention over Configuration) in building Isomorphic Ruby on Rails Applications. It provides a Ruby HTML DSL, which uniquely enables writing both structure code and logic code in one language. It supports both Unidirectional (One-Way) Data-Binding (using <=) and Bidirectional (Two-Way) Data-Binding (using <=>). Dynamic rendering (and re-rendering) of HTML content is also supported via Content Data-Binding. Modular design is supported with Glimmer Web Components, Component Slots, and Component Custom Event Listeners. And, a Ruby CSS DSL is supported with the included Glimmer DSL for CSS. Many samples are demonstrated in the Rails sample app (there is a very minimal Standalone [No Rails] sample app too). You can finally live in pure Rubyland on the Web in both the frontend and backend with Glimmer DSL for Web! This gem relies on Opal Ruby.".freeze
|
16
16
|
s.email = "andy.am@gmail.com".freeze
|
17
17
|
s.extra_rdoc_files = [
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Rails
|
2
|
-
# ResourceService supports index/show/create/update/
|
2
|
+
# ResourceService supports index/show/create/update/destroy REST API calls for any Rails resources
|
3
3
|
# Automatically loads the authenticity token from meta[name=csrf-token] content attribute
|
4
4
|
# Assumes a resource or resource class that matches the name of a Backend ActiveRecord Model (e.g. Contact class or instance)
|
5
5
|
class ResourceService
|
@@ -11,7 +11,13 @@ module Rails
|
|
11
11
|
singular_resource_name ||= singular_resource_name_for_resource_class(resource_class)
|
12
12
|
plural_resource_name ||= "#{singular_resource_name}s"
|
13
13
|
index_resource_url ||= "/#{plural_resource_name}.json"
|
14
|
-
HTTP.get(index_resource_url, payload: index_show_destroy_resource_params(params: params.to_h)
|
14
|
+
HTTP.get(index_resource_url, payload: index_show_destroy_resource_params(params: params.to_h)) do |response|
|
15
|
+
if response.ok? && !resource_class.nil?
|
16
|
+
resource_response_objects = Native(response.body)
|
17
|
+
resources = resource_response_objects.map { |resource_response_object| build_resource_from_response_object(resource_class:, resource_response_object:) }
|
18
|
+
end
|
19
|
+
response_handler.call(response, resources)
|
20
|
+
end
|
15
21
|
end
|
16
22
|
|
17
23
|
def show(resource: nil, resource_class: nil, resource_id: nil, singular_resource_name: nil, plural_resource_name: nil, show_resource_url: nil, params: nil, &response_handler)
|
@@ -20,7 +26,13 @@ module Rails
|
|
20
26
|
singular_resource_name ||= singular_resource_name_for_resource_class(resource_class)
|
21
27
|
plural_resource_name ||= "#{singular_resource_name}s"
|
22
28
|
show_resource_url ||= "/#{plural_resource_name}/#{resource_id}.json"
|
23
|
-
HTTP.get(show_resource_url, payload: index_show_destroy_resource_params(params: params.to_h)
|
29
|
+
HTTP.get(show_resource_url, payload: index_show_destroy_resource_params(params: params.to_h)) do |response|
|
30
|
+
if response.ok? && !resource_class.nil?
|
31
|
+
resource_response_object = Native(response.body)
|
32
|
+
resource = build_resource_from_response_object(resource_class:, resource_response_object:)
|
33
|
+
end
|
34
|
+
response_handler.call(response, resource)
|
35
|
+
end
|
24
36
|
end
|
25
37
|
|
26
38
|
def create(resource: nil, resource_class: nil, resource_attributes: nil, singular_resource_name: nil, plural_resource_name: nil, create_resource_url: nil, params: nil, &response_handler)
|
@@ -28,7 +40,17 @@ module Rails
|
|
28
40
|
singular_resource_name ||= singular_resource_name_for_resource_class(resource_class)
|
29
41
|
plural_resource_name ||= "#{singular_resource_name}s"
|
30
42
|
create_resource_url ||= "/#{plural_resource_name}.json"
|
31
|
-
HTTP.post(create_resource_url, payload: create_update_resource_params(resource:, resource_class:, resource_attributes:, singular_resource_name:, params: params.to_h)
|
43
|
+
HTTP.post(create_resource_url, payload: create_update_resource_params(resource:, resource_class:, resource_attributes:, singular_resource_name:, params: params.to_h)) do |response|
|
44
|
+
if response.ok?
|
45
|
+
if !resource_class.nil?
|
46
|
+
resource_response_object = Native(response.body)
|
47
|
+
resource = build_resource_from_response_object(resource_class:, resource_response_object:)
|
48
|
+
end
|
49
|
+
else
|
50
|
+
errors = JSON.parse(response.body)
|
51
|
+
end
|
52
|
+
response_handler.call(response, resource, errors)
|
53
|
+
end
|
32
54
|
end
|
33
55
|
|
34
56
|
def update(resource: nil, resource_class: nil, resource_id: nil, resource_attributes: nil, singular_resource_name: nil, plural_resource_name: nil, update_resource_url: nil, params: nil, &response_handler)
|
@@ -37,7 +59,17 @@ module Rails
|
|
37
59
|
singular_resource_name ||= singular_resource_name_for_resource_class(resource_class)
|
38
60
|
plural_resource_name ||= "#{singular_resource_name}s"
|
39
61
|
update_resource_url ||= "/#{plural_resource_name}/#{resource_id}.json"
|
40
|
-
HTTP.patch(update_resource_url, payload: create_update_resource_params(resource:, resource_class:, resource_attributes:, singular_resource_name:, params: params.to_h)
|
62
|
+
HTTP.patch(update_resource_url, payload: create_update_resource_params(resource:, resource_class:, resource_attributes:, singular_resource_name:, params: params.to_h)) do |response|
|
63
|
+
if response.ok?
|
64
|
+
if !resource_class.nil?
|
65
|
+
resource_response_object = Native(response.body)
|
66
|
+
resource = build_resource_from_response_object(resource_class:, resource_response_object:)
|
67
|
+
end
|
68
|
+
else
|
69
|
+
errors = JSON.parse(response.body)
|
70
|
+
end
|
71
|
+
response_handler.call(response, resource, errors)
|
72
|
+
end
|
41
73
|
end
|
42
74
|
|
43
75
|
def destroy(resource: nil, resource_class: nil, resource_id: nil, singular_resource_name: nil, plural_resource_name: nil, destroy_resource_url: nil, params: nil, &response_handler)
|
@@ -71,6 +103,12 @@ module Rails
|
|
71
103
|
return nil if resource_class.nil?
|
72
104
|
resource_class.to_s.split('::').last.downcase
|
73
105
|
end
|
106
|
+
|
107
|
+
def build_resource_from_response_object(resource_class:, resource_response_object:)
|
108
|
+
resource = resource_class.new
|
109
|
+
resource_response_object.each { |attribute, value| resource.send("#{attribute}=", value) rescue nil }
|
110
|
+
resource
|
111
|
+
end
|
74
112
|
end
|
75
113
|
end
|
76
114
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: glimmer-dsl-web
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Maleh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-02-
|
11
|
+
date: 2025-02-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: glimmer
|