glimmer-dsl-web 0.6.9 → 0.6.12

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c255e190aed253bf44917907d1fa39c17b71f795054dedb33ca6912b9c798562
4
- data.tar.gz: 7448c70a081144086a1f0c9545c3e3f4dc8e17e0e03df4c1126f1a1b054e605d
3
+ metadata.gz: 4b8b62aab96fe0a15612d6592d6690e23cc0bbd4f0fe12b8dbaa409e80d5487f
4
+ data.tar.gz: 997e128f4c1df55175287f7ae0509d668dd9fdac19a49f9f2323ce38c4f9dd98
5
5
  SHA512:
6
- metadata.gz: f39baaa90a81e981b57c9012ba6c2e07de039f340427075e5b08f988ac068e1dc6ccebe0213c23d4c7c86269b1bc80598065ac6f6478f8fa425e25304b1e6abd
7
- data.tar.gz: 443bc0a99fed33be65e134077a26dfa1b19334b5d7a77ade6b0f7132f6efa256c1efc84571f97452c07d71077d8badbef6c7f0de2cad1add0a8e3d3342aad162
6
+ metadata.gz: 8c5bad9052a782a4d5d8b98f8ad2a9a99e5c368e8d3d54acdf1edcca49c34bcdef92df0d45f41f850767690a53546a8762797faa3eae1a0bae04af6cbf997196
7
+ data.tar.gz: c2a5e569726554e96eef3415be870a5198c8e19d958e1a87a64583066a6ccdb29199a4c6256ad759a54ba6dfc6c54b92f841295949fad2465e9af3a5f7d790b3
data/CHANGELOG.md CHANGED
@@ -1,8 +1,21 @@
1
1
  # Change Log
2
2
 
3
+ ## 0.6.12
4
+
5
+ - Fix issue with Glimmer Web Component Attribute Data-Binding crashing the Contact Manager sample
6
+
7
+ ## 0.6.11
8
+
9
+ - Set component attribute as a property in the Glimmer DSL by nesting 'propname value' inside component in consuming code
10
+ - Glimmer Web Component Attribute Data-Binding (by nesting data-binding declarations within consumed components)
11
+
12
+ ## 0.6.10
13
+
14
+ - Support Component Attribute Listeners including non-option attributes (like method-based attributes not generated by `option :someoption` like `attr_accessor :someattr`)
15
+
3
16
  ## 0.6.9
4
17
 
5
- - Support Component Option Listeners (nest a `on_some_attribute_update { ... }` listener inside the content block of a consumed Glimmer Web Component for any attribute/option on the Component, like `on_full_name_update` listener for `full_name` attribute update)
18
+ - Support Component Attribute (option-only) Listeners (nest a `on_some_attribute_update { ... }` listener inside the content block of a consumed Glimmer Web Component for any attribute/option on the Component, like `on_full_name_update` listener for `full_name` attribute update)
6
19
 
7
20
  ## 0.6.8
8
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.9 (Beta)
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.12 (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!!!
@@ -17,7 +17,7 @@
17
17
 
18
18
  **Endorsement:** *"I'd like to endorse Andy Maleh’s work (Glimmer DSL for Web). I got introduced to it at RubyConf 2024 and have been playing around with it pretty successfully. What I have found most interesting is that I have been writing inside of a rails app, where I have been running the same code for models and presenters inside of MRI rspec. That way I can write tests that verify behavior of the presenters and models and still see them run successfully in the browser. That allows me to have a very nice cycle of refactoring and being confident in my changes without even running it in browser. I just assume that the binding will work and it usually works perfectly."* - Steve Tuckner on January 9, 2024
19
19
 
20
- You can finally live in pure Rubyland on the Web in both the frontend and backend with [Glimmer DSL for Web](https://rubygems.org/gems/glimmer-dsl-web)! [Glimmer](https://github.com/AndyObtiva/glimmer) DSL for Web enables building Web Frontends (aka SPA: Single Page Applications) using [Ruby in the Browser](https://www.youtube.com/watch?v=4AdcfbI6A4c), as per [Matz's recommendation in his RubyConf 2022 keynote speech to replace JavaScript with Ruby](https://youtu.be/knutsgHTrfQ?t=789). It supports Rails' principle of the One Person Framework by not requiring any extra developers with JavaScript expertise, yet enabling Ruby (Backend) Software Engineers to develop the Frontend with Ruby code that is better than any JavaScript code produced by JS developers. 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](https://martinfowler.com/books/dsl.html) and [TIMTOWTDI](https://en.wiktionary.org/wiki/TMTOWTDI#English)) and the Rails way ([Convention over Configuration](https://rubyonrails.org/doctrine)) in building Isomorphic Ruby on Rails Applications. It provides a Ruby [HTML DSL](#usage) (including full support for [SVG](#hello-svg)), which uniquely enables writing both structure code and logic code in one language. It supports both Unidirectional (One-Way) [Data-Binding](#hello-data-binding) (using `<=`) and Bidirectional (Two-Way) [Data-Binding](#hello-data-binding) (using `<=>`). Dynamic rendering (and re-rendering) of HTML content is also supported via [Content Data-Binding](#hello-content-data-binding). Modular design is supported with [Glimmer Web Components](#hello-component), [Component Slots](#hello-component-slots), and [Component Custom Event Listeners](#hello-component-listeners). And, a Ruby CSS DSL is supported with the included [Glimmer DSL for CSS](https://github.com/AndyObtiva/glimmer-dsl-css). To automatically convert legacy HTML & CSS code to Glimmer DSL Ruby code, Software Engineers could use the included [`html_to_glimmer`](https://github.com/AndyObtiva/glimmer-dsl-xml#html-to-glimmer-converter) and [`css_to_glimmer`](https://github.com/AndyObtiva/glimmer-dsl-css#css-to-glimmer-converter) commands. Many [samples](#samples) are demonstrated in the [Rails sample app](https://github.com/AndyObtiva/sample-glimmer-dsl-web-rails7-app) (there is a very minimal [Standalone [No Rails] static site sample app](https://github.com/Largo/glimmer-dsl-web-standalone-demo) too).
20
+ You can finally live in pure Rubyland on the Web in both the frontend and backend with [Glimmer DSL for Web](https://rubygems.org/gems/glimmer-dsl-web)! [Glimmer](https://github.com/AndyObtiva/glimmer) DSL for Web enables building Web Frontends (aka SPA: Single Page Applications) using [Ruby in the Browser](https://www.youtube.com/watch?v=4AdcfbI6A4c), as per [Matz's recommendation in his RubyConf 2022 keynote speech to replace JavaScript with Ruby](https://youtu.be/knutsgHTrfQ?t=789). It supports Rails' principle of the One Person Framework by not requiring any extra developers with JavaScript expertise, yet enabling Ruby (Backend) Software Engineers to develop the Frontend with Ruby code that is better than any JavaScript code produced by JS developers. 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](https://martinfowler.com/books/dsl.html) and [TIMTOWTDI](https://en.wiktionary.org/wiki/TMTOWTDI#English)) and the Rails way ([Convention over Configuration](https://rubyonrails.org/doctrine)) in building Isomorphic Ruby on Rails Applications. It provides a Ruby [HTML DSL](#usage) (including full support for [SVG](#hello-svg)), which uniquely enables writing both structure code and logic code in one language. It supports both Unidirectional (One-Way) [Data-Binding](#hello-data-binding) (using `<=`) and Bidirectional (Two-Way) [Data-Binding](#hello-data-binding) (using `<=>`). Dynamic rendering (and re-rendering) of HTML content is also supported via [Content Data-Binding](#hello-content-data-binding). Modular design is supported with [Glimmer Web Components](#hello-component), [Component Slots](#hello-component-slots), Component Attribute Listeners, and [Component Custom Event Listeners](#hello-component-listeners). And, a Ruby CSS DSL is supported with the included [Glimmer DSL for CSS](https://github.com/AndyObtiva/glimmer-dsl-css). To automatically convert legacy HTML & CSS code to Glimmer DSL Ruby code, Software Engineers could use the included [`html_to_glimmer`](https://github.com/AndyObtiva/glimmer-dsl-xml#html-to-glimmer-converter) and [`css_to_glimmer`](https://github.com/AndyObtiva/glimmer-dsl-css#css-to-glimmer-converter) commands. Many [samples](#samples) are demonstrated in the [Rails sample app](https://github.com/AndyObtiva/sample-glimmer-dsl-web-rails7-app) (there is a very minimal [Standalone [No Rails] static site sample app](https://github.com/Largo/glimmer-dsl-web-standalone-demo) too).
21
21
 
22
22
  You can finally have Ruby developer happiness and productivity in the Frontend! No more wasting time splitting your resources across multiple languages, using badly engineered, over-engineered, or premature-optimization-obsessed JavaScript libraries, fighting JavaScript build issues (e.g. webpack), or rewriting Ruby Backend code in Frontend JavaScript. With [Ruby in the Browser](https://www.youtube.com/watch?v=4AdcfbI6A4c), you can have an exponential jump in development productivity (2x or higher), time-to-release (1/2 or less time), cost (1/2 or cheaper), and maintainability (~50% the code that is simpler and more readable) over JavaScript libraries like React, Angular, Ember, Vue, and Svelte, while being able to reuse Backend Ruby code as is in the Frontend for faster interactions when needed. Also, with Frontend Ruby SPA (Single Page Applications), companies can cut their hiring budget in half by having Backend Ruby Software Engineers do Frontend Development in Ruby! [Ruby in the Browser](https://www.youtube.com/watch?v=4AdcfbI6A4c) finally fulfills every smart highly-productive Rubyist's dream by bringing Ruby productivity fun to Frontend Development, the same productivity fun you had for years and decades in Backend Development.
23
23
 
@@ -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.9'
1411
+ gem 'glimmer-dsl-web', '~> 0.6.12'
1412
1412
  ```
1413
1413
 
1414
1414
  Run:
@@ -2977,6 +2977,8 @@ Component listeners enable consumers of components to listen to any custom event
2977
2977
 
2978
2978
  For example, an `AccordionSection` component might generate events `:expanded` and `:collapsed` when a user clicks on the section title to expand it or collapse it. Consumers can then use `on_expanded` and `on_collapsed` to listen to those events.
2979
2979
 
2980
+ Also, it is possible to listen to any component attribute by nesting `on_some_attribute_update`. And, it is possible to set component attributes by nesting `some_attribute value` or data-binding to them by nesting `some_attribute <=> [model, :attribute]`.
2981
+
2980
2982
  [lib/glimmer-dsl-web/samples/hello/hello_component_listeners.rb](/lib/glimmer-dsl-web/samples/hello/hello_component_listeners.rb)
2981
2983
 
2982
2984
  Glimmer HTML DSL Ruby code in the frontend:
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.6.9
1
+ 0.6.12
@@ -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.9 ruby lib
5
+ # stub: glimmer-dsl-web 0.6.12 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"
9
+ s.version = "0.6.12"
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-23"
14
+ s.date = "2025-03-01"
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 = [
@@ -7,7 +7,14 @@ module Glimmer
7
7
  module Web
8
8
  class PropertyExpression < Expression
9
9
  def can_interpret?(parent, keyword, *args, &block)
10
- parent.is_a?(Glimmer::Web::ElementProxy) and
10
+ # TODO add this condition once formatting elements become normal elements
11
+ # or delete this line if no longer needed:
12
+ # parent.is_a?(Glimmer::Web::FormattingElementProxy) ||
13
+ # Also, consider removing type check altogether (to generalize if good idea)
14
+ (
15
+ parent.is_a?(Glimmer::Web::ElementProxy) ||
16
+ parent.is_a?(Glimmer::Web::Component)
17
+ ) and
11
18
  (!args.empty?) and
12
19
  parent.respond_to?("#{keyword}=") and
13
20
  block.nil?
@@ -373,6 +373,7 @@ module Glimmer
373
373
 
374
374
  def can_add_attribute_observer?(attribute_name)
375
375
  has_option?(attribute_name) ||
376
+ has_read_write_attribute?(attribute_name) ||
376
377
  has_instance_method?(attribute_name) ||
377
378
  has_instance_method?("#{attribute_name}?")
378
379
  end
@@ -405,6 +406,7 @@ module Glimmer
405
406
  end
406
407
 
407
408
  def remove_observer(observer, attribute_or_event, options = {})
409
+ # TODO should we removing attribute observers? when removing component?
408
410
  if can_add_attribute_observer?(attribute_or_event)
409
411
  super(observer, attribute_or_event)
410
412
  elsif can_add_custom_event_listener?(attribute_or_event)
@@ -443,6 +445,10 @@ module Glimmer
443
445
  @markup_root.set_attribute(attribute_name, *args)
444
446
  end
445
447
  end
448
+
449
+ def has_read_write_attribute?(attribute)
450
+ respond_to?(attribute) && respond_to?("#{attribute}=")
451
+ end
446
452
 
447
453
  # This method ensures it has an instance method not coming from Glimmer DSL
448
454
  def has_instance_method?(method_name)
@@ -471,11 +477,24 @@ module Glimmer
471
477
  end
472
478
 
473
479
  def remove
480
+ remove_all_listeners
474
481
  @markup_root&.remove
475
482
  end
476
483
 
477
484
  def data_bind(property, model_binding)
478
- @markup_root&.data_bind(property, model_binding)
485
+ if has_option?(property) || (has_read_write_attribute?(property) && !@markup_root.respond_to?(property) && !@markup_root.respond_to?("#{property}="))
486
+ option_binding = Glimmer::DataBinding::ModelBinding.new(self, property)
487
+ #TODO make this options observer dependent and all similar observers in element specific data binding handlers
488
+ option_binding.observe(model_binding)
489
+ option_binding.call(model_binding.evaluate_property)
490
+ data_bindings[option_binding] = model_binding
491
+ if !model_binding.binding_options[:read_only]
492
+ model_binding.observe(option_binding)
493
+ model_binding.call(option_binding.evaluate_property)
494
+ end
495
+ else
496
+ @markup_root&.data_bind(property, model_binding)
497
+ end
479
498
  end
480
499
 
481
500
  def bind_content(*binding_args, &content_block)
@@ -503,6 +522,12 @@ module Glimmer
503
522
  end
504
523
  end
505
524
  end
525
+
526
+ def remove_all_listeners
527
+ data_bindings.each do |option_binding, model_binding|
528
+ option_binding.unregister_all_observables
529
+ end
530
+ end
506
531
 
507
532
  def method_missing(method_name, *args, &block)
508
533
  if can_handle_observation_request?(method_name)
@@ -551,6 +576,10 @@ module Glimmer
551
576
  def remove_style_block
552
577
  Glimmer::Web::Component.remove_component_style(self)
553
578
  end
579
+
580
+ def data_bindings
581
+ @data_bindings ||= {}
582
+ end
554
583
  end
555
584
  end
556
585
  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.9
4
+ version: 0.6.12
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-23 00:00:00.000000000 Z
11
+ date: 2025-03-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: glimmer