ende 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/WTFP-LICENSE +13 -0
- data/component.json +31 -0
- data/ende.gemspec +23 -0
- data/lib/assets/.gitkeep +0 -0
- data/lib/assets/javascripts/aura/extensions/devise.js.coffee +110 -0
- data/lib/assets/javascripts/aura/extensions/loader.js.coffee +48 -0
- data/lib/assets/javascripts/aura/extensions/mediator.js +98 -0
- data/lib/assets/javascripts/aura/extensions/models.js.coffee.erb +56 -0
- data/lib/assets/javascripts/aura/extensions/rivets.js.coffee +251 -0
- data/lib/assets/javascripts/aura/extensions/states.js.coffee +62 -0
- data/lib/assets/javascripts/aura/extensions/widget/eventable.js.coffee +66 -0
- data/lib/assets/javascripts/aura/extensions/widget/lifecycleable.js.coffee +75 -0
- data/lib/assets/javascripts/config/initializers/jquery.js.coffee +6 -0
- data/lib/assets/javascripts/config/initializers/load_components.js.coffee +73 -0
- data/lib/assets/javascripts/config/initializers/requirejs.js.coffee +3 -0
- data/lib/assets/javascripts/ende.js.coffee +1 -0
- data/lib/assets/javascripts/widgets/authenticator/main.js.coffee +95 -0
- data/lib/assets/javascripts/widgets/authenticator/presenter.js.coffee +35 -0
- data/lib/assets/javascripts/widgets/authenticator/states/default.html +7 -0
- data/lib/assets/javascripts/widgets/authenticator/states/index.js.coffee +3 -0
- data/lib/assets/javascripts/widgets/authenticator/states/passwords.html +6 -0
- data/lib/assets/javascripts/widgets/list/main.js.coffee +82 -0
- data/lib/assets/javascripts/widgets/list/presenter.js.coffee +34 -0
- data/lib/assets/javascripts/widgets/list/states/default.html +4 -0
- data/lib/assets/javascripts/widgets/list/states/index.js.coffee +2 -0
- data/lib/assets/javascripts/widgets/viewer/main.js.coffee +139 -0
- data/lib/assets/javascripts/widgets/viewer/presenter.js.coffee +54 -0
- data/lib/assets/javascripts/widgets/viewer/states/default.html +6 -0
- data/lib/assets/javascripts/widgets/viewer/states/index.js.coffee +2 -0
- data/lib/assets/stylesheets/application/modules/authenticator.css.styl +7 -0
- data/lib/assets/stylesheets/application/modules/widgets/structure/list.css.styl +9 -0
- data/lib/assets/stylesheets/application/modules/widgets/structure/viewer.css.styl +21 -0
- data/lib/assets/stylesheets/application/modules/widgets/structure/widget.css.styl +5 -0
- data/lib/assets/stylesheets/filter.styl +10 -0
- data/lib/assets/stylesheets/helpers/button.styl +61 -0
- data/lib/assets/stylesheets/helpers/general.styl +36 -0
- data/lib/assets/stylesheets/helpers/index.styl +4 -0
- data/lib/assets/stylesheets/helpers/link.styl +6 -0
- data/lib/assets/stylesheets/helpers/url.styl +5 -0
- data/lib/assets/stylesheets/modules/button.styl +42 -0
- data/lib/assets/stylesheets/sprite.styl +40 -0
- data/lib/assets/stylesheets/ssprites.styl +1 -0
- data/lib/ende/version.rb +3 -0
- data/lib/ende.rb +21 -0
- data/lib/tasks/.gitkeep +0 -0
- data/lib/tasks/component.thor +63 -0
- data/lib/tasks/sprite.thor +62 -0
- data/vendor/assets/javascripts/stampit/stampit.js +392 -0
- metadata +126 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 95b8f0102eaf6c3d5fdf84a364afa9f01495d633
|
4
|
+
data.tar.gz: 44a73feca7b3353f4a51831292dc96b8f83d51dc
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 98cda4fb64e3911896acb8fdb3029c5a734a6f2ea7d99f174c439a292858596097b3d61fde980dfd93d89a799dc8f103392aa0f40063d9353d8829342b3b4dec
|
7
|
+
data.tar.gz: 08ac320f4d91562324f8a70261859e749b212fa7f0a1be9d42a13e52dfbf9cc5a780349ad9a276722045abbc9c822212144a4dde6ed90a20f0473cc55aed889b
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# Ende
|
2
|
+
|
3
|
+
TODO: Write a gem description
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'ende'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install ende
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
TODO: Write usage instructions here
|
22
|
+
|
23
|
+
## Contributing
|
24
|
+
|
25
|
+
1. Fork it
|
26
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
28
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/WTFP-LICENSE
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
2
|
+
Version 2, December 2004
|
3
|
+
|
4
|
+
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
|
5
|
+
|
6
|
+
Everyone is permitted to copy and distribute verbatim or modified
|
7
|
+
copies of this license document, and changing it is allowed as long
|
8
|
+
as the name is changed.
|
9
|
+
|
10
|
+
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
11
|
+
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
12
|
+
|
13
|
+
0. You just DO WHAT THE FUCK YOU WANT TO.
|
data/component.json
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
{
|
2
|
+
"name": "ened",
|
3
|
+
"repo": "indefinido/ened",
|
4
|
+
"description": "Core web application functionality",
|
5
|
+
"version": "0.0.1",
|
6
|
+
"keywords": [],
|
7
|
+
"dependencies": {
|
8
|
+
"mikeric/rivets": "*",
|
9
|
+
"bestiejs/lodash": "*",
|
10
|
+
"KapIT/observe-utils": "*",
|
11
|
+
"segmentio/extend": "*",
|
12
|
+
"pluma/assimilate": "*",
|
13
|
+
"paulmillr/es6-shim": "*",
|
14
|
+
"component/type": "*",
|
15
|
+
"component/bind": "*",
|
16
|
+
"component/jquery": "*",
|
17
|
+
"indefinido/indemma": "*",
|
18
|
+
"indefinido/observable": "*",
|
19
|
+
"indefinido/advisable": "*"
|
20
|
+
},
|
21
|
+
"scripts": [
|
22
|
+
"vendor/assets/javascripts/stampit/stampit.js"
|
23
|
+
],
|
24
|
+
"development": {},
|
25
|
+
"paths": [
|
26
|
+
"lib/components",
|
27
|
+
"vendor/components",
|
28
|
+
"vendor/assets/javascripts"
|
29
|
+
],
|
30
|
+
"license": "MIT"
|
31
|
+
}
|
data/ende.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# cofding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'ende/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "ende"
|
8
|
+
spec.version = Ende::VERSION
|
9
|
+
spec.authors = ["Heitor Salazar"]
|
10
|
+
spec.email = ["heitorsalazar@gmail.com"]
|
11
|
+
spec.description = %q{A modular web application engine for rails. Using aurajs and indemma by default. the goal is to provideseamlessly integrstion with rails and popular rails engines, such as devise.}
|
12
|
+
spec.summary = %q{Endë (core, middle) a web application engine for rails with aurajs.}
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.license = "WTFPL"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
end
|
data/lib/assets/.gitkeep
ADDED
File without changes
|
@@ -0,0 +1,110 @@
|
|
1
|
+
root = exports ? this
|
2
|
+
|
3
|
+
define 'aura/extensions/devise', () ->
|
4
|
+
|
5
|
+
'use strict'
|
6
|
+
|
7
|
+
sandbox = null
|
8
|
+
mediator = null
|
9
|
+
core = null
|
10
|
+
|
11
|
+
# TODO create an indemma model
|
12
|
+
session =
|
13
|
+
build: (user = {}) ->
|
14
|
+
|
15
|
+
core.models.record.call
|
16
|
+
resource: 'user'
|
17
|
+
route : '/users/sessions'
|
18
|
+
email : user.email
|
19
|
+
password: user.password
|
20
|
+
|
21
|
+
# TODO better and more formal way to restore
|
22
|
+
restore: ->
|
23
|
+
# We make a dummy request to the new session path and if user is
|
24
|
+
# logged in, devise redirects us to the users/show.json path for
|
25
|
+
# the current loged in user
|
26
|
+
|
27
|
+
|
28
|
+
session.restoring = true
|
29
|
+
|
30
|
+
# Also find a better way to publish events after all widgets are
|
31
|
+
# loaded
|
32
|
+
setTimeout (( ) -> session.create()), 3000
|
33
|
+
# session.create()
|
34
|
+
|
35
|
+
create: (user) ->
|
36
|
+
|
37
|
+
user_session = session.build user
|
38
|
+
session.instance = user_session
|
39
|
+
|
40
|
+
user_session.dirty = true
|
41
|
+
|
42
|
+
user_session
|
43
|
+
.save ->
|
44
|
+
sandbox.current_user = @
|
45
|
+
sandbox.signed_in = true
|
46
|
+
mediator.emit 'user.signed_in', @
|
47
|
+
|
48
|
+
.fail ->
|
49
|
+
sandbox.current_user = null
|
50
|
+
mediator.emit 'user.unauthorized', @ unless session.restoring
|
51
|
+
sandbox.signed_in ||= false
|
52
|
+
.always ->
|
53
|
+
mediator.emit 'session.restore.tried', @ if session.restoring
|
54
|
+
session.restoring = false
|
55
|
+
|
56
|
+
# user_password POST /users/password(.:format) devise/passwords#create
|
57
|
+
# new_user_password GET /users/password/new(.:format) devise/passwords#new
|
58
|
+
# edit_user_password GET /users/password/edit(.:format) devise/passwords#edit
|
59
|
+
# PATCH /users/password(.:format) devise/passwords#update
|
60
|
+
# PUT /users/password(.:format) devise/passwords#updaet
|
61
|
+
password =
|
62
|
+
build: (user = {}) ->
|
63
|
+
core.models.record.call
|
64
|
+
resource: 'user'
|
65
|
+
route : '/users/password'
|
66
|
+
email : user.email
|
67
|
+
password: user.password
|
68
|
+
|
69
|
+
create: (user) ->
|
70
|
+
|
71
|
+
user_password = password.build user
|
72
|
+
password.instance = user_password
|
73
|
+
|
74
|
+
user_password.dirty = true
|
75
|
+
|
76
|
+
user_password
|
77
|
+
.save ->
|
78
|
+
mediator.emit 'user.password_recovered', @
|
79
|
+
.fail ->
|
80
|
+
mediator.emit 'user.unauthorized', @
|
81
|
+
|
82
|
+
|
83
|
+
|
84
|
+
# Extension definition
|
85
|
+
name: 'devise'
|
86
|
+
initialize: (application) ->
|
87
|
+
|
88
|
+
core = application.core
|
89
|
+
sandbox = application.sandbox
|
90
|
+
mediator = core.mediator
|
91
|
+
|
92
|
+
# Define callbacks
|
93
|
+
# TODO get json with features info from devise
|
94
|
+
# gem and only use apropriated listeners
|
95
|
+
mediator.on 'user.sign_in', session.create
|
96
|
+
mediator.on 'user.recover_password', password.create
|
97
|
+
|
98
|
+
# Define api
|
99
|
+
Object.defineProperty sandbox, 'current_user',
|
100
|
+
set: (user) -> session.current_user = user
|
101
|
+
get: -> session.current_user
|
102
|
+
|
103
|
+
sandbox.session = session
|
104
|
+
|
105
|
+
|
106
|
+
|
107
|
+
afterAppStart: () ->
|
108
|
+
# Restore session if not already
|
109
|
+
# TODO Restore only when application is ready
|
110
|
+
session.restore()
|
@@ -0,0 +1,48 @@
|
|
1
|
+
define 'aura/extensions/loader', ->
|
2
|
+
|
3
|
+
'use strict';
|
4
|
+
|
5
|
+
try
|
6
|
+
Spinner = require 'seminovos/vendor/assets/javascripts/spin/spin'
|
7
|
+
catch e
|
8
|
+
Spinner = require 'modacad/vendor/assets/javascripts/spin/spin'
|
9
|
+
|
10
|
+
|
11
|
+
(application) ->
|
12
|
+
core = application.core
|
13
|
+
mediator = core.mediator
|
14
|
+
|
15
|
+
loader =
|
16
|
+
|
17
|
+
options:
|
18
|
+
lines: 5 # The number of lines to draw
|
19
|
+
length: 0 # The length of each line
|
20
|
+
width: 12 # The line thickness
|
21
|
+
radius: 0 # The radius of the inner circle
|
22
|
+
corners: 0 # Corner roundness (0..1)
|
23
|
+
rotate: 90 # The rotation offset
|
24
|
+
direction: 1 # 1: clockwise -1: counterclockwise
|
25
|
+
color: '#FFF' # #rgb or #rrggbb
|
26
|
+
speed: 1.6 # Rounds per second
|
27
|
+
trail: 75 # Afterglow percentage
|
28
|
+
shadow: false # Whether to render a shadow
|
29
|
+
hwaccel: false # Whether to use hardware acceleration
|
30
|
+
className: 'loader' # The CSS class to assign to the spinner
|
31
|
+
zIndex: 2e9 # The z-index (defaults to 2000000000)
|
32
|
+
top: 'auto' # Top position relative to parent in px
|
33
|
+
left: 'auto' # Left position relative to parent in px
|
34
|
+
|
35
|
+
# Returns a new spinner (http://fgnass.github.io/spin.js)
|
36
|
+
# Hiding the spinner
|
37
|
+
# To hide the spinner, invoke the stop() method, which removes the UI elements from the DOM
|
38
|
+
# and stops the animation. Stopped spinners may be reused by calling spin() again.
|
39
|
+
create: (selector, options) ->
|
40
|
+
target = core.dom.find selector
|
41
|
+
new Spinner(core.util.extend {}, @options, options).spin target[0]
|
42
|
+
|
43
|
+
name: 'loader'
|
44
|
+
initialize: (application) ->
|
45
|
+
core.ui ||= {}
|
46
|
+
application.sandbox.ui = core.ui
|
47
|
+
core.ui.loader = ->
|
48
|
+
loader.create arguments...
|
@@ -0,0 +1,98 @@
|
|
1
|
+
define('aura/extensions/mediator', function () {
|
2
|
+
'use strict';
|
3
|
+
|
4
|
+
return {
|
5
|
+
name: 'mediator',
|
6
|
+
|
7
|
+
require: {
|
8
|
+
paths: {
|
9
|
+
eventemitter: 'components/eventemitter2/lib/eventemitter2',
|
10
|
+
underscore: 'components/underscore/underscore'
|
11
|
+
},
|
12
|
+
shim: {
|
13
|
+
underscore: {
|
14
|
+
exports: '_'
|
15
|
+
}
|
16
|
+
}
|
17
|
+
},
|
18
|
+
|
19
|
+
initialize: function (app) {
|
20
|
+
var EventEmitter = require('eventemitter');
|
21
|
+
var _ = require('underscore');
|
22
|
+
|
23
|
+
app.config.mediator = _.defaults(app.config.mediator || {}, {
|
24
|
+
wildcard: true,
|
25
|
+
delimiter: '.',
|
26
|
+
newListener: true,
|
27
|
+
maxListeners: 20
|
28
|
+
});
|
29
|
+
|
30
|
+
var mediator = new EventEmitter(app.config.mediator);
|
31
|
+
|
32
|
+
app.core.mediator = mediator;
|
33
|
+
|
34
|
+
var attachListener = function(listenerType) {
|
35
|
+
return function (name, listener, context) {
|
36
|
+
if (!_.isFunction(listener) || !_.isString(name)) {
|
37
|
+
throw new Error('Invalid arguments passed to sandbox.' + listenerType);
|
38
|
+
}
|
39
|
+
context = context || this;
|
40
|
+
var callback = function() {
|
41
|
+
var args = Array.prototype.slice.call(arguments);
|
42
|
+
try {
|
43
|
+
listener.apply(context, args);
|
44
|
+
} catch(e) {
|
45
|
+
var message = "Event emission error on context: " + (context._ref || context) + "\n";
|
46
|
+
message += "With message " + (e.message || e) + "\n";
|
47
|
+
message += "Trying to emit event " + name + "\n";
|
48
|
+
message += "Failed on listener: \n " + (listener.name || listener) + "\n";
|
49
|
+
e.stack && (message += e.stack);
|
50
|
+
|
51
|
+
mediator.emit("emission.error", context);
|
52
|
+
app.logger.error("emission.error", message, 'Context:', context, 'Exception:', e);
|
53
|
+
}
|
54
|
+
};
|
55
|
+
|
56
|
+
this._events = this._events || [];
|
57
|
+
this._events.push({ name: name, listener: listener, callback: callback });
|
58
|
+
|
59
|
+
mediator[listenerType](name, callback);
|
60
|
+
};
|
61
|
+
};
|
62
|
+
|
63
|
+
app.sandbox.on = attachListener('on');
|
64
|
+
app.sandbox.once = attachListener('once');
|
65
|
+
|
66
|
+
app.sandbox.off = function (name, listener) {
|
67
|
+
if(!this._events) { return; }
|
68
|
+
this._events = _.reject(this._events, function (evt) {
|
69
|
+
var ret = (evt.name === name && evt.listener === listener);
|
70
|
+
if (ret) { mediator.off(name, evt.callback); }
|
71
|
+
return ret;
|
72
|
+
});
|
73
|
+
};
|
74
|
+
|
75
|
+
app.sandbox.emit = function () {
|
76
|
+
var debug = app.config.debug;
|
77
|
+
if(debug.enable && (debug.components.length === 0 || debug.components.indexOf("aura:mediator") !== -1)){
|
78
|
+
var eventData = Array.prototype.slice.call(arguments);
|
79
|
+
eventData.unshift('Event emitted');
|
80
|
+
app.logger.log.apply(app.logger, eventData);
|
81
|
+
}
|
82
|
+
mediator.emit.apply(mediator, arguments);
|
83
|
+
};
|
84
|
+
|
85
|
+
app.sandbox.stopListening = function () {
|
86
|
+
if (!this._events) { return; }
|
87
|
+
_.each(this._events, function (evt) {
|
88
|
+
mediator.off(evt.name, evt.callback);
|
89
|
+
});
|
90
|
+
};
|
91
|
+
|
92
|
+
var eventName = ['aura', 'sandbox', 'stop'].join(app.config.mediator.delimiter);
|
93
|
+
app.core.mediator.on(eventName, function (sandbox) {
|
94
|
+
sandbox.stopListening();
|
95
|
+
});
|
96
|
+
}
|
97
|
+
};
|
98
|
+
});
|
@@ -0,0 +1,56 @@
|
|
1
|
+
<% # TODO mover para helper %>
|
2
|
+
<% base_path = Rails.root.join('app', 'assets', 'javascripts', 'models') %>
|
3
|
+
<% models_list = Dir.glob(Rails.root.join(base_path, '**', '*.js*')) %>
|
4
|
+
<% models_list.map! do |file|
|
5
|
+
file.sub! base_path.to_s + '/', ''
|
6
|
+
|
7
|
+
# Ignore Emacs temporary files
|
8
|
+
next nil if file =~ /~/
|
9
|
+
|
10
|
+
entries = file.split /\// || []
|
11
|
+
entries.unshift 'models'
|
12
|
+
entries.push File.basename entries.pop, '.js.coffee'
|
13
|
+
File.join *entries
|
14
|
+
|
15
|
+
end.compact!
|
16
|
+
%>
|
17
|
+
|
18
|
+
root = exports ? this
|
19
|
+
|
20
|
+
define 'aura/extensions/models', <%= models_list.to_json %>, (models...) ->
|
21
|
+
|
22
|
+
'use strict'
|
23
|
+
|
24
|
+
# TODO better require api for indemma
|
25
|
+
indemma = require 'indemma'
|
26
|
+
require 'indefinido-indemma/lib/extensions/rivets'
|
27
|
+
require 'indefinido-indemma/lib/record/rest'
|
28
|
+
require 'indefinido-indemma/lib/record/associable'
|
29
|
+
require 'indefinido-indemma/lib/record/scopable'
|
30
|
+
require 'indefinido-indemma/lib/record/restfulable'
|
31
|
+
require 'indefinido-indemma/lib/record/resource'
|
32
|
+
require 'indefinido-indemma/lib/record/maid'
|
33
|
+
require 'indefinido-indemma/lib/record/validatable'
|
34
|
+
|
35
|
+
|
36
|
+
# Extension definition
|
37
|
+
initialize: (application) ->
|
38
|
+
core = application.core
|
39
|
+
sandbox = application.sandbox
|
40
|
+
core.util.inflector =
|
41
|
+
cssify: (sentence) -> sentence.replace /\//, '-'
|
42
|
+
|
43
|
+
# TODO rename core.models to core.domain, completely
|
44
|
+
core.domain = core.models = sandbox.models = indemma.model
|
45
|
+
|
46
|
+
core.model = sandbox.model = (name) ->
|
47
|
+
# TODO use a Map internally in indemma
|
48
|
+
model = indemma.model[name]
|
49
|
+
throw new Error "Model '#{name}' not found!" unless model?
|
50
|
+
model
|
51
|
+
|
52
|
+
# TODO rename core.models to core.domain, completely
|
53
|
+
core.domain.record = core.models.record = sandbox.models.record = indemma.record
|
54
|
+
|
55
|
+
# build all model definitions
|
56
|
+
core.util._.map models, (model) -> indemma.model.call model
|