fron 0.1.4 → 0.2.0rc1
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 +4 -4
- data/.gitignore +3 -0
- data/.reek +11 -0
- data/.rubocop.yml +54 -0
- data/.travis.yml +11 -0
- data/.yardopts +4 -0
- data/Changelog.md +7 -0
- data/Gemfile +3 -1
- data/Gemfile.lock +106 -15
- data/Rakefile +19 -15
- data/Readme.md +23 -0
- data/fron.gemspec +2 -2
- data/lib/fron/version.rb +2 -1
- data/opal/fron.rb +5 -5
- data/opal/fron/core.rb +3 -10
- data/opal/fron/core/behaviors/components.rb +42 -0
- data/opal/fron/core/behaviors/events.rb +27 -0
- data/opal/fron/core/behaviors/routes.rb +59 -0
- data/opal/fron/core/component.rb +64 -90
- data/opal/fron/core/eventable.rb +18 -0
- data/opal/fron/core/logger.rb +10 -1
- data/opal/fron/core_ext.rb +9 -0
- data/opal/fron/core_ext/array.rb +12 -0
- data/opal/fron/core_ext/date.rb +57 -0
- data/opal/fron/core_ext/hash.rb +52 -0
- data/opal/fron/core_ext/kernel.rb +57 -0
- data/opal/fron/core_ext/nil.rb +7 -0
- data/opal/fron/core_ext/numeric.rb +19 -0
- data/opal/fron/core_ext/object.rb +11 -0
- data/opal/fron/core_ext/proc.rb +19 -0
- data/opal/fron/{core-ext → core_ext}/string.rb +4 -0
- data/opal/fron/dom.rb +15 -13
- data/opal/fron/dom/document.rb +22 -6
- data/opal/fron/dom/element.rb +105 -67
- data/opal/fron/dom/event.rb +110 -40
- data/opal/fron/dom/{file-reader.rb → file_reader.rb} +6 -1
- data/opal/fron/dom/fragment.rb +2 -0
- data/opal/fron/dom/modules/attributes.rb +43 -0
- data/opal/fron/dom/modules/classlist.rb +26 -13
- data/opal/fron/dom/modules/dimensions.rb +79 -9
- data/opal/fron/dom/modules/element_accessor.rb +35 -0
- data/opal/fron/dom/modules/events.rb +67 -20
- data/opal/fron/dom/node.rb +98 -39
- data/opal/fron/dom/nodelist.rb +9 -2
- data/opal/fron/dom/style.rb +23 -2
- data/opal/fron/dom/text.rb +4 -0
- data/opal/fron/dom/window.rb +31 -2
- data/opal/fron/event_mock.rb +54 -0
- data/opal/fron/js/syntetic_event.js +16 -0
- data/opal/fron/request.rb +2 -2
- data/opal/fron/request/request.rb +77 -14
- data/opal/fron/request/response.rb +33 -6
- data/opal/fron/storage.rb +1 -1
- data/opal/fron/storage/local_storage.rb +54 -0
- data/opal/fron/utils/drag.rb +135 -0
- data/opal/fron/utils/keyboard.rb +70 -0
- data/opal/fron/utils/point.rb +78 -0
- data/opal/fron/utils/render_proc.rb +27 -0
- data/spec/core-ext/array_spec.rb +15 -0
- data/spec/core-ext/date_spec.rb +54 -0
- data/spec/core-ext/hash_spec.rb +18 -2
- data/spec/core-ext/kernel_spec.rb +57 -0
- data/spec/core-ext/nil_spec.rb +9 -0
- data/spec/core-ext/numeric_spec.rb +25 -0
- data/spec/core-ext/proc_spec.rb +15 -0
- data/spec/core-ext/string_spec.rb +11 -0
- data/spec/core/behaviors/events_spec.rb +25 -0
- data/spec/core/behaviors/routes_spec.rb +59 -0
- data/spec/core/component_inheritance_spec.rb +26 -16
- data/spec/core/component_spec.rb +25 -29
- data/spec/core/eventable_spec.rb +19 -19
- data/spec/core/logger_spec.rb +5 -6
- data/spec/dom/document_spec.rb +4 -5
- data/spec/dom/element_spec.rb +106 -15
- data/spec/dom/event_spec.rb +101 -61
- data/spec/dom/file_reader_spec.rb +11 -0
- data/spec/dom/fragment_spec.rb +3 -4
- data/spec/dom/instance_retaining_spec.rb +58 -0
- data/spec/dom/modules/classlist_spec.rb +18 -19
- data/spec/dom/modules/dimensions_spec.rb +87 -22
- data/spec/dom/modules/events_spec.rb +22 -8
- data/spec/dom/node_spec.rb +25 -17
- data/spec/dom/nodelist_spec.rb +2 -3
- data/spec/dom/style_spec.rb +6 -5
- data/spec/dom/text_spec.rb +4 -3
- data/spec/dom/window_spec.rb +24 -9
- data/spec/js/mocks.js +14 -0
- data/spec/request/request_spec.rb +34 -15
- data/spec/request/response_spec.rb +9 -10
- data/spec/spec_helper.rb +11 -0
- data/spec/storage/{local-storage_spec.rb → local_storage_spec.rb} +6 -7
- data/spec/utils/drag_spec.rb +136 -0
- data/spec/utils/keyboard_spec.rb +75 -0
- data/spec/utils/point_spec.rb +55 -0
- data/spec/utils/render_proc_spec.rb +18 -0
- metadata +58 -36
- data/docs/application.md +0 -7
- data/docs/configuration.md +0 -29
- data/docs/controllers.md +0 -35
- data/docs/routing.md +0 -63
- data/opal/fron/core-ext.rb +0 -5
- data/opal/fron/core-ext/hash.rb +0 -31
- data/opal/fron/core-ext/kernel.rb +0 -10
- data/opal/fron/core-ext/numeric.rb +0 -9
- data/opal/fron/core-ext/proc.rb +0 -9
- data/opal/fron/core/adapters/local.rb +0 -43
- data/opal/fron/core/adapters/rails.rb +0 -65
- data/opal/fron/core/application.rb +0 -42
- data/opal/fron/core/configuration.rb +0 -29
- data/opal/fron/core/controller.rb +0 -41
- data/opal/fron/core/model.rb +0 -90
- data/opal/fron/core/router.rb +0 -86
- data/opal/fron/storage/local-storage.rb +0 -34
- data/spec/core/adapter/local_spec.rb +0 -65
- data/spec/core/adapter/rails_spec.rb +0 -77
- data/spec/core/application_spec.rb +0 -35
- data/spec/core/configuration_spec.rb +0 -20
- data/spec/core/controlller_spec.rb +0 -68
- data/spec/core/model_spec.rb +0 -125
- data/spec/core/router_spec.rb +0 -124
data/opal/fron/core/component.rb
CHANGED
@@ -1,110 +1,84 @@
|
|
1
|
+
require 'fron/core/behaviors/components'
|
2
|
+
require 'fron/core/behaviors/events'
|
3
|
+
require 'fron/core/behaviors/routes'
|
4
|
+
|
1
5
|
module Fron
|
6
|
+
# Component
|
2
7
|
class Component < DOM::Element
|
3
|
-
attr_reader :model
|
4
|
-
|
5
8
|
class << self
|
6
|
-
|
9
|
+
# @return [String] The tagname of the component
|
7
10
|
attr_reader :tagname
|
8
|
-
attr_reader :components
|
9
|
-
attr_reader :delegates
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
12
|
+
# @return [Hash] The hash of behaviors
|
13
|
+
attr_reader :behaviors
|
14
|
+
|
15
|
+
# Creates a new class with the specific tag
|
16
|
+
#
|
17
|
+
# @param tag [String] The tag
|
18
|
+
#
|
19
|
+
# @return [Fron::Component] The new component
|
20
|
+
def create(tag)
|
21
|
+
klass = Class.new self
|
22
|
+
klass.tag tag
|
23
|
+
klass
|
23
24
|
end
|
24
25
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
end
|
41
|
-
|
42
|
-
def initialize(*args)
|
43
|
-
case args.length
|
44
|
-
when 1
|
45
|
-
@model = args[0]
|
46
|
-
when 2
|
47
|
-
tag, @model = args
|
48
|
-
when 3
|
49
|
-
tag, options, @model = args
|
26
|
+
# Register a behavior
|
27
|
+
#
|
28
|
+
# @param behavior [Module] The behavior
|
29
|
+
# @param methods [Array] The methods to register
|
30
|
+
def register(behavior, methods)
|
31
|
+
@behaviors ||= {}
|
32
|
+
@behaviors[behavior] = methods
|
33
|
+
|
34
|
+
methods.each do |name|
|
35
|
+
instance_variable_set "@#{name}", []
|
36
|
+
meta_def name do |*args, &block|
|
37
|
+
args << block if block_given?
|
38
|
+
instance_variable_get("@#{name}") << args
|
39
|
+
end
|
40
|
+
end
|
50
41
|
end
|
51
42
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
43
|
+
# Handles inheritance
|
44
|
+
#
|
45
|
+
# @param subclass [Class] The subclass
|
46
|
+
def inherited(subclass)
|
47
|
+
# Copy behaviours
|
48
|
+
subclass.instance_variable_set '@behaviors', @behaviors.dup
|
49
|
+
|
50
|
+
# Copy registries
|
51
|
+
@behaviors.values.reduce(&:+).each do |type|
|
52
|
+
next unless (var = instance_variable_get("@#{type}"))
|
53
|
+
inst_var = subclass.instance_variable_get("@#{type}") || []
|
54
|
+
subclass.instance_variable_set("@#{type}", inst_var.concat(var))
|
61
55
|
end
|
62
56
|
end
|
63
57
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
def component(name,comp,options,&block)
|
70
|
-
c = comp.is_a?(Class) ? comp.new(nil,options,@model) : Component.new(comp, options, @model)
|
71
|
-
c.instance_eval(&block) if block
|
72
|
-
self << c
|
73
|
-
self.instance_variable_set "@#{name}", c
|
74
|
-
end
|
75
|
-
|
76
|
-
private
|
77
|
-
|
78
|
-
def createComponents
|
79
|
-
return unless self.class.components
|
80
|
-
self.class.components.each do |args|
|
81
|
-
arguments = args.dup
|
82
|
-
block = arguments.last.is_a?(Proc) ? arguments.pop : nil
|
83
|
-
component *arguments, &block
|
58
|
+
# Sets the tag name of the component
|
59
|
+
#
|
60
|
+
# @param tag [String] The tag name
|
61
|
+
def tag(tag)
|
62
|
+
@tagname = tag
|
84
63
|
end
|
85
64
|
end
|
86
65
|
|
87
|
-
|
88
|
-
|
89
|
-
self.class.delegates.each do |args|
|
90
|
-
method, target = args
|
91
|
-
self.class.define_method(method) do
|
92
|
-
instance_variable_get("@#{target}").send(method)
|
93
|
-
end
|
66
|
+
include Behaviors::Components
|
67
|
+
include Behaviors::Events
|
94
68
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
69
|
+
# Initalizs the component
|
70
|
+
#
|
71
|
+
# @param tag [String] The tagname
|
72
|
+
def initialize(tag = nil)
|
73
|
+
klass = self.class
|
74
|
+
|
75
|
+
super tag || klass.tagname || klass.name.split('::').last
|
100
76
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
else
|
107
|
-
on(args[0]) { |e| self.method(args[1]).call e }
|
77
|
+
klass.behaviors.each do |mod, methods|
|
78
|
+
methods.each do |name|
|
79
|
+
next unless mod.respond_to?(name)
|
80
|
+
registry = self.class.instance_variable_get("@#{name}")
|
81
|
+
instance_exec registry, &mod.method(name)
|
108
82
|
end
|
109
83
|
end
|
110
84
|
end
|
data/opal/fron/core/eventable.rb
CHANGED
@@ -1,7 +1,16 @@
|
|
1
|
+
# rubocop:disable ModuleFunction
|
2
|
+
|
1
3
|
module Fron
|
4
|
+
# Eventable
|
2
5
|
module Eventable
|
3
6
|
extend self
|
4
7
|
|
8
|
+
# Add an event listener
|
9
|
+
#
|
10
|
+
# @param event [String] The type of the event
|
11
|
+
# @param block [Proc] The listener body
|
12
|
+
#
|
13
|
+
# @return [Proc] The block
|
5
14
|
def on(event, &block)
|
6
15
|
@events ||= {}
|
7
16
|
@events[event] ||= []
|
@@ -9,6 +18,11 @@ module Fron
|
|
9
18
|
block
|
10
19
|
end
|
11
20
|
|
21
|
+
# Triggers an event
|
22
|
+
#
|
23
|
+
# @param event [String] The type of the event
|
24
|
+
# @param data = {} [type] The data
|
25
|
+
# @param triggerGlobal [Boolean] Whether or not to trigger a global event
|
12
26
|
def trigger(event, data = {}, triggerGlobal = true)
|
13
27
|
return unless @events
|
14
28
|
return unless @events[event]
|
@@ -18,6 +32,10 @@ module Fron
|
|
18
32
|
end
|
19
33
|
end
|
20
34
|
|
35
|
+
# Removes event listeners
|
36
|
+
#
|
37
|
+
# @param event [String] The type of the event
|
38
|
+
# @param block [Proc] The listener body
|
21
39
|
def off(event = nil, &block)
|
22
40
|
return unless @events
|
23
41
|
if block_given?
|
data/opal/fron/core/logger.rb
CHANGED
@@ -1,15 +1,24 @@
|
|
1
1
|
module Fron
|
2
|
+
# Logger
|
2
3
|
class Logger
|
4
|
+
# Sets / gets the log level
|
5
|
+
#
|
6
|
+
# @param value [Symbol] The level
|
7
|
+
# @return [Symbol] The level
|
3
8
|
attr_accessor :level
|
4
9
|
|
10
|
+
# Initailizes the logger
|
5
11
|
def initialize
|
6
12
|
@level = :info
|
7
13
|
end
|
8
14
|
|
15
|
+
# Logs the given message
|
16
|
+
#
|
17
|
+
# @param message [String] The message
|
9
18
|
def info(message)
|
10
19
|
return if ENV == 'test'
|
11
20
|
return if @level == :error
|
12
|
-
puts Time.now.strftime(
|
21
|
+
puts Time.now.strftime('[%H:%M] ') + message
|
13
22
|
end
|
14
23
|
end
|
15
24
|
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'fron/core_ext/hash'
|
2
|
+
require 'fron/core_ext/kernel'
|
3
|
+
require 'fron/core_ext/numeric'
|
4
|
+
require 'fron/core_ext/proc'
|
5
|
+
require 'fron/core_ext/string'
|
6
|
+
require 'fron/core_ext/object'
|
7
|
+
require 'fron/core_ext/nil'
|
8
|
+
require 'fron/core_ext/date'
|
9
|
+
require 'fron/core_ext/array'
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'date'
|
2
|
+
|
3
|
+
# Methods for date class
|
4
|
+
class Date
|
5
|
+
class << self
|
6
|
+
# Returns a range for this week
|
7
|
+
#
|
8
|
+
# @return [Range] The days as range
|
9
|
+
def this_week
|
10
|
+
Date.week(Date.today)
|
11
|
+
end
|
12
|
+
|
13
|
+
# Returns a range for last week
|
14
|
+
#
|
15
|
+
# @return [Range] The days as range
|
16
|
+
def last_week
|
17
|
+
Date.week(Date.today - 7)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Returns the monday of the current week
|
21
|
+
#
|
22
|
+
# @return [Date] The date
|
23
|
+
def monday(date = Date.today)
|
24
|
+
today = date
|
25
|
+
day = today.wday
|
26
|
+
diff = case day
|
27
|
+
when 0
|
28
|
+
6
|
29
|
+
when 1..6
|
30
|
+
day - 1
|
31
|
+
end
|
32
|
+
today - diff
|
33
|
+
end
|
34
|
+
|
35
|
+
# Returns the week days in the current week
|
36
|
+
#
|
37
|
+
# @return [Range] The days as range
|
38
|
+
def week(date = Date.today)
|
39
|
+
day = monday(date)
|
40
|
+
(day..day + 6)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Returns the begging of the month
|
45
|
+
#
|
46
|
+
# @return [Date] The date
|
47
|
+
def beginning_of_month
|
48
|
+
self.class.new year, month, 1
|
49
|
+
end
|
50
|
+
|
51
|
+
# Returns the end of the month
|
52
|
+
#
|
53
|
+
# @return [Date] The date
|
54
|
+
def end_of_month
|
55
|
+
self.class.new year, month + 1, 0
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# Hash
|
2
|
+
class Hash
|
3
|
+
# Returns the difference from the other object
|
4
|
+
#
|
5
|
+
# @param other [Hash] The other hash
|
6
|
+
#
|
7
|
+
# @return [Hash] The difference
|
8
|
+
def difference(other)
|
9
|
+
Hash[to_a - other.to_a]
|
10
|
+
end
|
11
|
+
|
12
|
+
alias_method :-, :difference
|
13
|
+
|
14
|
+
# Converts the hash into an url encoded query string
|
15
|
+
#
|
16
|
+
# @return [String] the query string
|
17
|
+
def to_query_string
|
18
|
+
map do |key, value|
|
19
|
+
`encodeURIComponent(#{key})+"="+encodeURIComponent(#{value})`
|
20
|
+
end.join '&'
|
21
|
+
end
|
22
|
+
|
23
|
+
# Converts the hash into a form data object
|
24
|
+
#
|
25
|
+
# @return [FormData] The native form data object
|
26
|
+
def to_form_data
|
27
|
+
form_data = `new FormData()`
|
28
|
+
each do |key, value|
|
29
|
+
`#{form_data}.append(#{key},#{value})`
|
30
|
+
end
|
31
|
+
form_data
|
32
|
+
end
|
33
|
+
|
34
|
+
# Produces a diff hash from self and the other hash
|
35
|
+
#
|
36
|
+
# @param other [Hash] The other hash
|
37
|
+
#
|
38
|
+
# @return [Hash] The difference from the other hash
|
39
|
+
def deep_diff(other)
|
40
|
+
(keys + other.keys).uniq.each_with_object({}) do |key, diff|
|
41
|
+
self_key = self[key]
|
42
|
+
other_key = other[key]
|
43
|
+
next if self_key == other_key
|
44
|
+
if self_key.respond_to?(:deep_diff) && other_key.respond_to?(:deep_diff)
|
45
|
+
diff[key] = self_key.deep_diff(other_key)
|
46
|
+
else
|
47
|
+
diff[key] = [self_key, other_key]
|
48
|
+
end
|
49
|
+
diff
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# Kernel
|
2
|
+
module Kernel
|
3
|
+
# Requests an animation frame from the browser
|
4
|
+
# and runs the givel block if given.
|
5
|
+
def request_animation_frame
|
6
|
+
return unless block_given?
|
7
|
+
return unless `!!window.requestAnimationFrame`
|
8
|
+
`window.requestAnimationFrame(function(){ #{yield} })`
|
9
|
+
end
|
10
|
+
|
11
|
+
# Runs the given block after the given number of milliseconds.
|
12
|
+
#
|
13
|
+
# @param ms [Integer] The milliseconds
|
14
|
+
def timeout(ms = 0)
|
15
|
+
`setTimeout(function(){#{yield}},#{ms})`
|
16
|
+
end
|
17
|
+
|
18
|
+
# Shows a prompt window with text and value
|
19
|
+
#
|
20
|
+
# @param text [String] The text
|
21
|
+
# @param value [String] The value
|
22
|
+
#
|
23
|
+
# @return [String] The user input
|
24
|
+
def prompt(text, value)
|
25
|
+
`prompt(#{text}, #{value})`
|
26
|
+
end
|
27
|
+
|
28
|
+
# Shows an alert window with the given text
|
29
|
+
#
|
30
|
+
# @param text [String] the text
|
31
|
+
def alert(text)
|
32
|
+
`alert(#{text})`
|
33
|
+
end
|
34
|
+
|
35
|
+
# Shows an confirm window with the given text
|
36
|
+
#
|
37
|
+
# @param text [String] the text
|
38
|
+
#
|
39
|
+
# @return [Boolean] True of false depending on user input
|
40
|
+
def confirm(text)
|
41
|
+
`confirm(#{text})`
|
42
|
+
end
|
43
|
+
|
44
|
+
# Clears the timeout with the given ID
|
45
|
+
#
|
46
|
+
# @param id [Numeric] The ID
|
47
|
+
def clear_timeout(id)
|
48
|
+
`clearTimeout(#{id})`
|
49
|
+
end
|
50
|
+
|
51
|
+
# Returns the logger for the application
|
52
|
+
#
|
53
|
+
# @return [Fron::Logger] The logger
|
54
|
+
def logger
|
55
|
+
@logger ||= Fron::Logger.new
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# Numeric
|
2
|
+
class Numeric
|
3
|
+
# Clamps itself between two values
|
4
|
+
#
|
5
|
+
# @param min [Numeric] The minimum value
|
6
|
+
# @param max [Numeric] The maximum value
|
7
|
+
#
|
8
|
+
# @return [Numeric] The clamped value
|
9
|
+
def clamp(min, max)
|
10
|
+
[[self, max].min, min].max
|
11
|
+
end
|
12
|
+
|
13
|
+
# Returns the px representation
|
14
|
+
#
|
15
|
+
# @return [String] The px
|
16
|
+
def px
|
17
|
+
"#{round}px"
|
18
|
+
end
|
19
|
+
end
|