fron 0.1.4 → 0.2.0rc1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|