glimmer-dsl-web 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,67 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+ # stub: glimmer-dsl-web 0.0.1 ruby lib
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = "glimmer-dsl-web".freeze
9
+ s.version = "0.0.1".freeze
10
+
11
+ s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
+ s.require_paths = ["lib".freeze]
13
+ s.authors = ["Andy Maleh".freeze]
14
+ s.date = "2023-12-27"
15
+ s.description = "Glimmer DSL for Web (Ruby in the Browser Web GUI Library) - Enables frontend GUI development with Ruby by adopting a DSL that follows web-like HTML syntax, enabling the transfer of HTML/CSS/JS skills to Ruby frontend development. This library relies on Opal Ruby.".freeze
16
+ s.email = "andy.am@gmail.com".freeze
17
+ s.extra_rdoc_files = [
18
+ "CHANGELOG.md",
19
+ "LICENSE.txt",
20
+ "README.md"
21
+ ]
22
+ s.files = [
23
+ "CHANGELOG.md",
24
+ "LICENSE.txt",
25
+ "README.md",
26
+ "VERSION",
27
+ "app/assets/stylesheets/glimmer/glimmer.css",
28
+ "glimmer-dsl-web.gemspec",
29
+ "lib/glimmer-dsl-web.rb",
30
+ "lib/glimmer-dsl-web/ext/class.rb",
31
+ "lib/glimmer-dsl-web/ext/date.rb",
32
+ "lib/glimmer-dsl-web/ext/exception.rb",
33
+ "lib/glimmer-dsl-web/samples/hello/hello_world.rb",
34
+ "lib/glimmer-dsl-web/vendor/jquery.js",
35
+ "lib/glimmer/config/opal_logger.rb",
36
+ "lib/glimmer/data_binding/element_binding.rb",
37
+ "lib/glimmer/data_binding/observable_element.rb",
38
+ "lib/glimmer/dsl/web/dsl.rb",
39
+ "lib/glimmer/dsl/web/element_expression.rb",
40
+ "lib/glimmer/util/proc_tracker.rb",
41
+ "lib/glimmer/web.rb",
42
+ "lib/glimmer/web/element_proxy.rb",
43
+ "lib/glimmer/web/property_owner.rb"
44
+ ]
45
+ s.homepage = "http://github.com/AndyObtiva/glimmer-dsl-web".freeze
46
+ s.licenses = ["MIT".freeze]
47
+ s.rubygems_version = "3.5.3".freeze
48
+ s.summary = "Glimmer DSL for Web".freeze
49
+
50
+ s.specification_version = 4
51
+
52
+ s.add_runtime_dependency(%q<glimmer>.freeze, ["~> 2.4.1".freeze])
53
+ s.add_runtime_dependency(%q<glimmer-dsl-xml>.freeze, ["~> 1.3.2".freeze])
54
+ s.add_runtime_dependency(%q<glimmer-dsl-css>.freeze, ["~> 1.2.2".freeze])
55
+ s.add_runtime_dependency(%q<opal-async>.freeze, ["~> 1.4.0".freeze])
56
+ s.add_runtime_dependency(%q<to_collection>.freeze, [">= 2.0.1".freeze, "< 3.0.0".freeze])
57
+ s.add_runtime_dependency(%q<pure-struct>.freeze, [">= 1.0.2".freeze, "< 2.0.0".freeze])
58
+ s.add_development_dependency(%q<puts_debuggerer>.freeze, [">= 0".freeze])
59
+ s.add_development_dependency(%q<rake>.freeze, [">= 10.1.0".freeze, "< 14.0.0".freeze])
60
+ s.add_development_dependency(%q<rake-tui>.freeze, [">= 0".freeze])
61
+ s.add_development_dependency(%q<jeweler>.freeze, [">= 2.3.9".freeze, "< 3.0.0".freeze])
62
+ s.add_development_dependency(%q<rdoc>.freeze, [">= 6.2.1".freeze, "< 7.0.0".freeze])
63
+ s.add_development_dependency(%q<opal-rspec>.freeze, ["~> 0.8.0.alpha2".freeze])
64
+ s.add_development_dependency(%q<opal-rails>.freeze, ["~> 1.1.2".freeze])
65
+ s.add_development_dependency(%q<opal-jquery>.freeze, ["~> 0.4.4".freeze])
66
+ end
67
+
@@ -0,0 +1,16 @@
1
+ module Glimmer
2
+ module Config
3
+ class OpalLogger < Logger
4
+ alias add_without_opal_logger add
5
+ def add(severity, message = nil, progname = nil, &block)
6
+ original_logdev = @pipe
7
+ if severity == ERROR
8
+ @pipe = $stderr
9
+ else
10
+ @pipe = original_logdev
11
+ end
12
+ add_without_opal_logger(severity, message, progname, &block)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,36 @@
1
+ require 'glimmer/data_binding/observable'
2
+ require 'glimmer/data_binding/observer'
3
+
4
+ module Glimmer
5
+ module DataBinding
6
+ class ElementBinding
7
+ # TODO consider renaming to WidgetBinding since it's no longer dealing with elements directly yet widgets instead
8
+ include Glimmer
9
+ include Observable
10
+ include Observer
11
+
12
+ attr_reader :element, :property
13
+ def initialize(element, property, translator = nil)
14
+ @element = element
15
+ @property = property
16
+ @translator = translator || proc {|value| value}
17
+
18
+ # TODO see if this is needed in Opal
19
+ # if @element.respond_to?(:dispose)
20
+ # @element.on_widget_disposed do |dispose_event|
21
+ # unregister_all_observables
22
+ # end
23
+ # end
24
+ end
25
+
26
+ def call(value)
27
+ converted_value = translated_value = @translator.call(value)
28
+ @element.set_attribute(@property, converted_value) unless evaluate_property == converted_value
29
+ end
30
+
31
+ def evaluate_property
32
+ @element.send(@property)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,14 @@
1
+ module Glimmer
2
+ module DataBinding
3
+ module ObservableElement
4
+ def method_missing(method, *args, &block)
5
+ method_name = method.to_s
6
+ if method_name.start_with?('on_')
7
+ handle_observation_request(method_name, block)
8
+ else
9
+ super
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,24 @@
1
+ require 'glimmer/dsl/engine'
2
+ # Dir[File.expand_path('../*_expression.rb', __FILE__)].each {|f| require f}
3
+ require 'glimmer/dsl/web/element_expression'
4
+
5
+ module Glimmer
6
+ module DSL
7
+ module Web
8
+ # TODO implement all those expressions
9
+ # %w[
10
+ # event_listener
11
+ # data_binding
12
+ # attribute
13
+ # shine_data_binding
14
+ # element
15
+ # ]
16
+ Engine.add_dynamic_expressions(
17
+ Web,
18
+ %w[
19
+ element
20
+ ]
21
+ )
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,37 @@
1
+ require 'glimmer/dsl/expression'
2
+ require 'glimmer/dsl/parent_expression'
3
+ require 'glimmer/web/element_proxy'
4
+
5
+ module Glimmer
6
+ module DSL
7
+ module Web
8
+ class ElementExpression < Expression
9
+ include ParentExpression
10
+
11
+ def can_interpret?(parent, keyword, *args, &block)
12
+ # TODO automatically pass root as element if not passed instead of rejecting elements without a paraent nor root
13
+ # TODO raise a proper error if root is an element that is not found (maybe do this in model)
14
+ options = args.last.is_a?(Hash) ? args.last : {}
15
+ (parent or options[:root])
16
+ end
17
+
18
+ def interpret(parent, keyword, *args, &block)
19
+ Glimmer::Web::ElementProxy.for(keyword, parent, args, block)
20
+ end
21
+
22
+ def add_content(parent, keyword, *args, &block)
23
+ if parent.rendered? || parent.skip_content_on_render_blocks?
24
+ return_value = super(parent, keyword, *args, &block)
25
+ if return_value.is_a?(String)
26
+ parent.add_text_content(return_value)
27
+ end
28
+ parent.post_add_content
29
+ return_value
30
+ else
31
+ parent.add_content_on_render(&block)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,50 @@
1
+ # Copyright (c) 2020-2022 Andy Maleh
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ require 'delegate'
23
+
24
+ module Glimmer
25
+ module Util
26
+ # Decorator that provides tracking facilities for Ruby procs, tracking owner (string), invoked_form method name (symbol/string), and called? (boolean)
27
+ class ProcTracker < DelegateClass(Proc)
28
+ attr_reader :owner, :invoked_from
29
+
30
+ def initialize(proc = nil, owner: nil, invoked_from: nil, &block)
31
+ super(proc || block)
32
+ @owner = owner
33
+ @invoked_from = invoked_from
34
+ end
35
+
36
+ def call(*args)
37
+ __getobj__.call(*args)
38
+ @called = true
39
+ end
40
+
41
+ def called?
42
+ !!@called
43
+ end
44
+
45
+ def respond_to?(method_name, include_private = false)
46
+ %w[owner invoked_from called?].include?(method_name.to_s) || super(method_name, include_private)
47
+ end
48
+ end
49
+ end
50
+ end