alpha-simprini-engine 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +20 -0
- data/README.rdoc +3 -0
- data/Rakefile +38 -0
- data/app/assets/javascripts/alpha_simprini.coffee +15 -0
- data/app/assets/javascripts/alpha_simprini/application.coffee +22 -0
- data/app/assets/javascripts/alpha_simprini/coffee_kup/binding.coffee +119 -0
- data/app/assets/javascripts/alpha_simprini/coffee_kup/helpers.coffee +17 -0
- data/app/assets/javascripts/alpha_simprini/coffee_kup/tags.coffee +7 -0
- data/app/assets/javascripts/alpha_simprini/collection.coffee +62 -0
- data/app/assets/javascripts/alpha_simprini/delegate.coffee +21 -0
- data/app/assets/javascripts/alpha_simprini/event.coffee +75 -0
- data/app/assets/javascripts/alpha_simprini/html.coffee +56 -0
- data/app/assets/javascripts/alpha_simprini/mixin.coffee +10 -0
- data/app/assets/javascripts/alpha_simprini/model.coffee +137 -0
- data/app/assets/javascripts/alpha_simprini/models/radio_selection_model.coffee +9 -0
- data/app/assets/javascripts/alpha_simprini/packer.coffee +93 -0
- data/app/assets/javascripts/alpha_simprini/template_helpers.coffee +8 -0
- data/app/assets/javascripts/alpha_simprini/view.coffee +182 -0
- data/app/assets/javascripts/alpha_simprini/views/canvas.coffee +2 -0
- data/app/assets/javascripts/alpha_simprini/views/horizontal_split.coffee +9 -0
- data/app/assets/javascripts/alpha_simprini/views/panel.coffee +2 -0
- data/app/assets/javascripts/alpha_simprini/views/splitter.coffee +2 -0
- data/app/assets/javascripts/alpha_simprini/views/stage.coffee +7 -0
- data/app/assets/javascripts/alpha_simprini/views/vertical_split.coffee +8 -0
- data/app/assets/javascripts/alpha_simprini/views/viewport.coffee +0 -0
- data/app/assets/javascripts/bundle.js +16416 -0
- data/app/assets/javascripts/lib/backbone.coffee +11 -0
- data/app/assets/javascripts/lib/koffeecup_backbone_databind.coffee +25 -0
- data/app/assets/javascripts/lib/module.coffee +15 -0
- data/app/assets/javascripts/lib/state_machine.coffee +33 -0
- data/app/assets/javascripts/lib/string.coffee +13 -0
- data/app/assets/javascripts/qunit.js +1513 -0
- data/app/assets/javascripts/test.coffee +4 -0
- data/app/assets/javascripts/test/alpha_simprini/coffee_kup/binding.coffee +118 -0
- data/app/assets/javascripts/test/alpha_simprini/coffee_kup/helpers.coffee +10 -0
- data/app/assets/javascripts/test/alpha_simprini/coffee_kup/tags.coffee +18 -0
- data/app/assets/javascripts/test/alpha_simprini/collection.coffee +7 -0
- data/app/assets/javascripts/test/alpha_simprini/event.coffee +43 -0
- data/app/assets/javascripts/test/alpha_simprini/model.coffee +63 -0
- data/app/assets/javascripts/test/alpha_simprini/view.coffee +72 -0
- data/app/assets/javascripts/test/alpha_simprini/views/canvas.coffee +8 -0
- data/app/assets/javascripts/test/alpha_simprini/views/horizontal_split.coffee +13 -0
- data/app/assets/javascripts/test/alpha_simprini/views/vertical_split.coffee +13 -0
- data/app/assets/javascripts/test/backbone/collection.js +345 -0
- data/app/assets/javascripts/test/backbone/events.js +86 -0
- data/app/assets/javascripts/test/backbone/model.js +426 -0
- data/app/assets/javascripts/test/backbone/view.js +137 -0
- data/app/assets/stylesheets/bootstrap.sass +6 -0
- data/app/assets/stylesheets/paneling.sass +2 -0
- data/app/assets/stylesheets/qunit.scss +228 -0
- data/app/assets/stylesheets/table.sass +10 -0
- data/app/assets/stylesheets/typography.sass +19 -0
- data/app/controllers/alpha_simprini/test_controller.rb +3 -0
- data/app/controllers/resources_controller.rb +7 -0
- data/app/views/alpha_simprini/test/root.rb +13 -0
- data/app/views/resources/base.rb +2 -0
- data/app/views/resources/edit.rb +9 -0
- data/app/views/resources/form.rb +26 -0
- data/app/views/resources/index.rb +41 -0
- data/app/views/resources/new.rb +9 -0
- data/app/views/resources/show.rb +42 -0
- data/app/views/resources/show_has_many.rb +28 -0
- data/config/locales/en.yml +4 -0
- data/config/routes.rb +3 -0
- data/lib/alpha-simprini-engine.rb +33 -0
- data/lib/alpha-simprini-engine/version.rb +3 -0
- data/lib/alpha_simprini/directive_processor.rb +77 -0
- data/lib/alpha_simprini/packer.rb +161 -0
- data/lib/alpha_simprini/page.rb +37 -0
- data/lib/tasks/alpha-simprini-engine_tasks.rake +4 -0
- data/test/alpha-simprini-engine_test.rb +7 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +9 -0
- data/test/dummy/app/assets/stylesheets/application.css +7 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +42 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +27 -0
- data/test/dummy/config/environments/production.rb +51 -0
- data/test/dummy/config/environments/test.rb +39 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +10 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +4 -0
- data/test/dummy/config/routes.rb +58 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/log/development.log +800 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +26 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/dummy/tmp/cache/assets/C24/D70/sprockets%2F388a550030239f3784f207fa32954f64 +0 -0
- data/test/dummy/tmp/cache/assets/C34/620/sprockets%2F097ee8532856d48d70420c006f475889 +0 -0
- data/test/dummy/tmp/cache/assets/C6F/710/sprockets%2F908d18b0f21c18dad508851126164a41 +0 -0
- data/test/dummy/tmp/cache/assets/CA7/120/sprockets%2F35278a6c0150c40394fe02629c8b0eb9 +0 -0
- data/test/dummy/tmp/cache/assets/CDB/A80/sprockets%2F443b1c6e71b482fdd83b1833b7e27712 +0 -0
- data/test/dummy/tmp/cache/assets/CE3/FB0/sprockets%2F6d3f87a4232e0368bb86760780c5f1bd +0 -0
- data/test/dummy/tmp/cache/assets/D1C/160/sprockets%2F87876f7e55ebc78ae11c6c08a27f0605 +0 -0
- data/test/dummy/tmp/cache/assets/D26/6C0/sprockets%2F65bce2254bb3140a50326ea1654ea5df +0 -0
- data/test/dummy/tmp/cache/assets/D26/FA0/sprockets%2F1f50f59148df5f3e2ab889df381d9744 +0 -0
- data/test/dummy/tmp/cache/assets/D36/220/sprockets%2F841654b01d89eada195d7d1fe10b57b0 +0 -0
- data/test/dummy/tmp/cache/assets/D47/410/sprockets%2Ff1fe319eb4064bd5b861ac28f7d76555 +18122 -0
- data/test/dummy/tmp/cache/assets/D57/1E0/sprockets%2Fe267e3e1059799c429e4f5cfb95ec53c +0 -0
- data/test/dummy/tmp/cache/assets/D64/3E0/sprockets%2Fb49b7f8034b81ec601bc32fb127fbe08 +0 -0
- data/test/dummy/tmp/cache/assets/D65/850/sprockets%2F7a9b6a0e2d51adb43a1d3f859213e6b8 +15469 -0
- data/test/dummy/tmp/cache/assets/D6C/E30/sprockets%2Fcc7322b05ac2bef75e9f4f145d38117f +0 -0
- data/test/dummy/tmp/cache/assets/D7D/E00/sprockets%2Fce33b82451c73df1cfec69928b4f77b6 +0 -0
- data/test/dummy/tmp/cache/assets/D85/5D0/sprockets%2Fcf743946c378c148b19ce78eeaa9cc75 +0 -0
- data/test/dummy/tmp/cache/assets/DBB/560/sprockets%2F5a1d70cf7dd81a5ab5ce7a40a3a38d06 +0 -0
- data/test/dummy/tmp/cache/assets/DC1/670/sprockets%2Fefdfad0542298a1db90d24dc27ecc250 +0 -0
- data/test/dummy/tmp/cache/assets/DC5/1E0/sprockets%2F7517f22ad0f9dc13b8f0f6e0cc0e5de2 +0 -0
- data/test/dummy/tmp/cache/assets/DCC/220/sprockets%2F28d953c6ab9cc9a7db15600aabc6d77d +208 -0
- data/test/dummy/tmp/cache/assets/DCF/DF0/sprockets%2Ff0d3068f05825e1dfd9f5aaba946d3dc +0 -0
- data/test/dummy/tmp/cache/assets/DD3/0E0/sprockets%2F3e9e08a334bae7deadb5335f5e4f195f +0 -0
- data/test/dummy/tmp/cache/assets/DDB/980/sprockets%2Fbd2abc80a17c901e2f497f88f9be58cf +0 -0
- data/test/dummy/tmp/cache/assets/E00/ED0/sprockets%2Ffecf3bffeb200a47e96bd04cbc878076 +1535 -0
- data/test/dummy/tmp/cache/assets/EFB/560/sprockets%2Fbca0daf751c020cdeddabbefa51cb6ea +0 -0
- data/test/dummy/tmp/restart.txt +0 -0
- data/test/test_helper.rb +10 -0
- metadata +326 -0
@@ -0,0 +1,26 @@
|
|
1
|
+
class Views::Resources::Form < Views::Resources::Base
|
2
|
+
def body_content
|
3
|
+
form do |form|
|
4
|
+
fields(form)
|
5
|
+
buttons(form)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def fields(form)
|
10
|
+
available_fields.each do |key, value|
|
11
|
+
input(form, key, :text_field)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def buttons(form)
|
16
|
+
div class: 'buttons' do
|
17
|
+
form.submit
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def available_fields
|
22
|
+
resource.fields.reject do |key, value|
|
23
|
+
key.starts_with?("_")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
class Views::Resources::Index < Views::Resources::Base
|
2
|
+
def page_header
|
3
|
+
h1 "#{resource_name} Index"
|
4
|
+
end
|
5
|
+
|
6
|
+
def blank_slate
|
7
|
+
link_to "Create a #{resource_name}", new_resource_path
|
8
|
+
end
|
9
|
+
|
10
|
+
def body_content
|
11
|
+
page_header
|
12
|
+
item_list
|
13
|
+
end
|
14
|
+
|
15
|
+
def item_list
|
16
|
+
blank_slate
|
17
|
+
if collection.any?
|
18
|
+
ul do
|
19
|
+
collection.each do |item|
|
20
|
+
li do
|
21
|
+
links_for_item(item)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def links_for_item(item)
|
29
|
+
link_to list_representation(item), resource_path(item)
|
30
|
+
end
|
31
|
+
|
32
|
+
def list_representation(item)
|
33
|
+
if item.respond_to?(:name)
|
34
|
+
item.name
|
35
|
+
elsif item.respond_to?(:title)
|
36
|
+
item.title
|
37
|
+
else
|
38
|
+
item.to_s
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
class Views::Resources::Show < Views::Resources::Base
|
2
|
+
cattr_accessor :has_manys
|
3
|
+
|
4
|
+
def self.has_manys
|
5
|
+
@has_manys ||= {}
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.has_many(name, &config)
|
9
|
+
has_manys[name] = Views::Resources::ShowHasMany.new(&config)
|
10
|
+
end
|
11
|
+
|
12
|
+
def body_content
|
13
|
+
p link_to "back to #{resource_name.pluralize} index", collection_path
|
14
|
+
p resource.name
|
15
|
+
associations_content
|
16
|
+
p link_to "edit", edit_resource_path
|
17
|
+
end
|
18
|
+
|
19
|
+
def associations_content
|
20
|
+
self.class.has_manys.each do |name, has_many|
|
21
|
+
div do
|
22
|
+
h2 name
|
23
|
+
table do
|
24
|
+
thead do
|
25
|
+
has_many.columns.each do |column|
|
26
|
+
th { text column.name }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
tbody do
|
30
|
+
resource.send(name).each do |item|
|
31
|
+
tr class: cycle(:odd, :even) do
|
32
|
+
has_many.columns.each do |column|
|
33
|
+
td { column.content_for(self, item) }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class Views::Resources::ShowHasMany
|
2
|
+
class Column
|
3
|
+
attr_accessor :name
|
4
|
+
def initialize(name, &content_for_block)
|
5
|
+
@name = name
|
6
|
+
@content_for_block = content_for_block
|
7
|
+
end
|
8
|
+
|
9
|
+
def content_for(context, item)
|
10
|
+
content = if @content_for_block
|
11
|
+
context.instance_exec(item, &@content_for_block)
|
12
|
+
else
|
13
|
+
item.send(name)
|
14
|
+
end
|
15
|
+
|
16
|
+
context.text content if content.is_a?(String)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
attr_accessor :columns
|
20
|
+
def initialize(&config)
|
21
|
+
@columns = []
|
22
|
+
instance_eval(&config)
|
23
|
+
end
|
24
|
+
|
25
|
+
def column(name, &block)
|
26
|
+
self.columns << Column.new(name, &block)
|
27
|
+
end
|
28
|
+
end
|
data/config/routes.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
module AlphaSimpriniEngine
|
2
|
+
require "inherited_resources"
|
3
|
+
require "alpha_simprini/page"
|
4
|
+
require "alpha_simprini/packer"
|
5
|
+
|
6
|
+
class Engine < Rails::Engine
|
7
|
+
config.autoload_paths += %w(#{config.root}/app)
|
8
|
+
# Does coool things like give us
|
9
|
+
initializer "alpha-simprini-engine.erector", before: :set_autoload_paths do |app|
|
10
|
+
app.config.autoload_paths += %W(#{app.root}/app #{AlphaSimpriniEngine::Engine.root}/app)
|
11
|
+
end
|
12
|
+
|
13
|
+
initializer "alpha-simprini-engine.extras", before: :set_autoload_paths do |app|
|
14
|
+
app.config.autoload_paths += %W(#{app.root}/extras #{AlphaSimpriniEngine::Engine.root}/extras)
|
15
|
+
end
|
16
|
+
|
17
|
+
initializer "alpha-simprini-engine.sprockets.engine_processor" do |app|
|
18
|
+
require "alpha_simprini/directive_processor"
|
19
|
+
|
20
|
+
app.assets.unregister_processor("text/javascript", Sprockets::DirectiveProcessor)
|
21
|
+
app.assets.register_processor("text/javascript", AlphaSimprini::DirectiveProcessor)
|
22
|
+
|
23
|
+
app.assets.unregister_processor("application/javascript", Sprockets::DirectiveProcessor)
|
24
|
+
app.assets.register_processor("application/javascript", AlphaSimprini::DirectiveProcessor)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Set things up for erector
|
28
|
+
initializer "alpha-simprini-engine.controller" do |app|
|
29
|
+
# Layout nil required for erector integration`
|
30
|
+
ApplicationController.send :layout, nil
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require "sprockets"
|
2
|
+
require "sprockets/directive_processor"
|
3
|
+
|
4
|
+
class AlphaSimprini::DirectiveProcessor < Sprockets::DirectiveProcessor
|
5
|
+
def glob_assets(path, globstring)
|
6
|
+
root = pathname.dirname.join(path).expand_path
|
7
|
+
root.to_s.match(/(javascripts|stylesheets|images)/)
|
8
|
+
asset_dir = $1
|
9
|
+
|
10
|
+
asset_dirs = (::Rails::Engine.subclasses << Rails.application).map do |engine|
|
11
|
+
engine.paths["app/assets"].map do |asset_path|
|
12
|
+
engine.root.join(asset_path).join(asset_dir).join(path)
|
13
|
+
end
|
14
|
+
end.flatten
|
15
|
+
|
16
|
+
Dir["{#{asset_dirs.join ','}}#{globstring}"]
|
17
|
+
end
|
18
|
+
|
19
|
+
# `require_directory` requires all the files inside a single
|
20
|
+
# directory. It's similar to `path/*` since it does not follow
|
21
|
+
# nested directories.
|
22
|
+
#
|
23
|
+
# //= require_directory "./javascripts"
|
24
|
+
#
|
25
|
+
def process_require_directory_directive(path = ".")
|
26
|
+
if relative?(path)
|
27
|
+
|
28
|
+
root = pathname.dirname.join(path).expand_path
|
29
|
+
unless root.directory?
|
30
|
+
raise ArgumentError, "require_tree argument must be a directory"
|
31
|
+
end
|
32
|
+
context.depend_on(root)
|
33
|
+
|
34
|
+
glob_assets(path, "/*").sort.each do |filename| #Dir["#{root}/*"].sort.each do |filename|
|
35
|
+
if filename == self.file
|
36
|
+
next
|
37
|
+
elsif context.asset_requirable?(filename)
|
38
|
+
context.require_asset(filename)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
else
|
42
|
+
# The path must be relative and start with a `./`.
|
43
|
+
raise ArgumentError, "require_directory argument must be a relative path"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# `require_tree` requires all the nested files in a directory.
|
48
|
+
# Its glob equivalent is `path/**/*`.
|
49
|
+
#
|
50
|
+
# //= require_tree "./public"
|
51
|
+
#
|
52
|
+
def process_require_tree_directive(path = ".")
|
53
|
+
if relative?(path)
|
54
|
+
root = pathname.dirname.join(path).expand_path
|
55
|
+
|
56
|
+
unless root.directory?
|
57
|
+
raise ArgumentError, "require_tree argument must be a directory"
|
58
|
+
end
|
59
|
+
|
60
|
+
context.depend_on(root)
|
61
|
+
|
62
|
+
|
63
|
+
glob_assets(path, "/**/*").sort.each do |filename| #Dir["{#{root},#{relative_root}}/**/*"].sort.each do |filename|
|
64
|
+
if filename == self.file
|
65
|
+
next
|
66
|
+
elsif File.directory?(filename)
|
67
|
+
context.depend_on(filename)
|
68
|
+
elsif context.asset_requirable?(filename)
|
69
|
+
context.require_asset(filename)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
else
|
73
|
+
# The path must be relative and start with a `./`.
|
74
|
+
raise ArgumentError, "require_tree argument must be a relative path"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,161 @@
|
|
1
|
+
module AlphaSimprini
|
2
|
+
module Heap
|
3
|
+
CLASS = 0x11
|
4
|
+
ATTRIBUTES = 0x12
|
5
|
+
CLASSES = 0x13
|
6
|
+
OBJECTS = 0x14
|
7
|
+
NAMED_OBJECTS = 0x15
|
8
|
+
LITERALS = 0x16
|
9
|
+
|
10
|
+
class Packer
|
11
|
+
attr_reader :classes, :objects, :named_objects
|
12
|
+
def initialize
|
13
|
+
@classes = {}
|
14
|
+
@objects = {}
|
15
|
+
@named_objects = {}
|
16
|
+
@literals = []
|
17
|
+
end
|
18
|
+
|
19
|
+
def pack(object, named=nil)
|
20
|
+
pack_object(object, pack_class(object.class), named)
|
21
|
+
end
|
22
|
+
|
23
|
+
def pack_object(object, class_reference, named=nil)
|
24
|
+
return object.object_id if @objects[object.object_id]
|
25
|
+
@objects[object.object_id] = reference = {}
|
26
|
+
if object.is_a?(Hash)
|
27
|
+
reference.merge!\
|
28
|
+
CLASS => class_reference,
|
29
|
+
ATTRIBUTES => object.inject({}) {|hash, (name, object)| hash[pack(name)] = pack(object); hash }
|
30
|
+
elsif object.is_a?(Array)
|
31
|
+
reference.merge!\
|
32
|
+
CLASS => class_reference,
|
33
|
+
ATTRIBUTES => object.map{|item| pack(item) }
|
34
|
+
elsif object.is_a?(Numeric)
|
35
|
+
reference.merge!\
|
36
|
+
CLASS => pack_class(Numeric),
|
37
|
+
ATTRIBUTES => @literals.count
|
38
|
+
@literals << object
|
39
|
+
elsif object.is_a?(Symbol)
|
40
|
+
reference.merge!\
|
41
|
+
CLASS => pack_class(String),
|
42
|
+
ATTRIBUTES => @literals.count
|
43
|
+
@literals << object.to_s
|
44
|
+
elsif object.is_a?(String)
|
45
|
+
reference.merge!\
|
46
|
+
CLASS => class_reference,
|
47
|
+
ATTRIBUTES => @literals.count
|
48
|
+
@literals << object
|
49
|
+
else
|
50
|
+
reference.merge!\
|
51
|
+
CLASS => class_reference,
|
52
|
+
ATTRIBUTES => (object.instance_variables.inject({}) do |hash, name|
|
53
|
+
value_to_pack = object.instance_variable_get(name)
|
54
|
+
if value_to_pack == object
|
55
|
+
hash[pack(name)] = object.object_id
|
56
|
+
else
|
57
|
+
hash[pack(name)] = pack(value_to_pack)
|
58
|
+
end
|
59
|
+
hash
|
60
|
+
end)
|
61
|
+
end
|
62
|
+
@named_objects[pack(named)] = object.object_id if named
|
63
|
+
object.object_id
|
64
|
+
end
|
65
|
+
|
66
|
+
def pack_class(klass)
|
67
|
+
@classes[klass.name] ||= @classes.size
|
68
|
+
end
|
69
|
+
|
70
|
+
def to_h
|
71
|
+
{
|
72
|
+
CLASSES => @classes,
|
73
|
+
OBJECTS => @objects,
|
74
|
+
NAMED_OBJECTS => @named_objects,
|
75
|
+
LITERALS => @literals
|
76
|
+
}
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
class Unpacker
|
81
|
+
attr_reader :classes, :objects, :named_objects
|
82
|
+
|
83
|
+
def initialize(hash)
|
84
|
+
@literals = hash[LITERALS]
|
85
|
+
@classes = hash[CLASSES].inject({}) { |hash, (key, value)| hash[value] = key.constantize; hash }
|
86
|
+
@packed_objects = hash[OBJECTS]
|
87
|
+
@objects = {}
|
88
|
+
@named_objects = {}
|
89
|
+
@packed_objects.each do |key, value|
|
90
|
+
unpack_object(key)
|
91
|
+
end
|
92
|
+
hash[NAMED_OBJECTS].inject({}) do |hash, (key, value)|
|
93
|
+
@named_objects[key] = @objects[value]
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def unpack_object(key)
|
98
|
+
return @objects[key] if @objects[key]
|
99
|
+
value = @packed_objects[key]
|
100
|
+
attributes = value[ATTRIBUTES]
|
101
|
+
|
102
|
+
klass = @classes[value[CLASS]]
|
103
|
+
if klass == Hash
|
104
|
+
@objects[key] = attributes.inject({}) do |hash, (key, value)|
|
105
|
+
hash[unpack_object(key)] = unpack_object(value)
|
106
|
+
hash
|
107
|
+
end
|
108
|
+
elsif klass == Array
|
109
|
+
@objects[key] = attributes.map{ |item| unpack_object(item) }
|
110
|
+
elsif klass == Numeric
|
111
|
+
@objects[key] = @literals[attributes]
|
112
|
+
elsif klass == String
|
113
|
+
@objects[key] = @literals[attributes]
|
114
|
+
elsif klass == NilClass
|
115
|
+
@objects[key] = attributes
|
116
|
+
else
|
117
|
+
object = @objects[key] = klass.allocate
|
118
|
+
attributes.each do |name, key|
|
119
|
+
object.instance_variable_set(unpack_object(name), unpack_object(key))
|
120
|
+
end
|
121
|
+
object
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
if __FILE__ == $0
|
129
|
+
require "active_support/all"
|
130
|
+
class Thing
|
131
|
+
attr_accessor :ace, :b, :c, :t
|
132
|
+
|
133
|
+
def initialize
|
134
|
+
@ace, @b, @c, @t = nil, nil, nil, nil
|
135
|
+
end
|
136
|
+
|
137
|
+
def inspect
|
138
|
+
"<#Thing:#{object_id} a:#{ace.size} things b:#{b.inspect} c:#{c.inspect} t:<#Thing:#{t.to_s}> >"
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
t = Thing.new
|
143
|
+
t.b = "OMGt,t,t,t,t,t,t,t,t,t,t,tt,t,t,t,t,t,t,t,t,t,t,tt,t,t,t,t,t,t,t,t,t,t,tt,t,t,t,t,t,t,t,t,t,t,tt,t,t,t,t,t,t,t,t,t,t,t"
|
144
|
+
t.ace = [Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new,Thing.new]
|
145
|
+
t.c = 123
|
146
|
+
t.t = t
|
147
|
+
|
148
|
+
|
149
|
+
include AlphaSimprini::Heap
|
150
|
+
p = Packer.new
|
151
|
+
p.pack(t, 'thing')
|
152
|
+
require "msgpack"
|
153
|
+
|
154
|
+
puts p.to_h.to_json
|
155
|
+
# puts p.to_h.to_msgpack.bytesize
|
156
|
+
# puts p.to_h.to_json.bytesize
|
157
|
+
# puts MessagePack.unpack(p.to_h.to_msgpack)
|
158
|
+
# MessagePack.unpack(p.to_h.to_msgpack)
|
159
|
+
# puts Unpacker.new(MessagePack.unpack(p.to_h.to_msgpack)).named_objects['thing'].t.inspect
|
160
|
+
# puts Unpacker.new(MessagePack.unpack(p.to_h.to_msgpack)).named_objects['thing'].ace.first.inspect
|
161
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require "erector"
|
2
|
+
module AlphaSimprini
|
3
|
+
class Page < Erector::Widget
|
4
|
+
def content
|
5
|
+
text :doctype_html
|
6
|
+
html do
|
7
|
+
head do
|
8
|
+
csrf_meta_tag
|
9
|
+
title :application_title
|
10
|
+
assets
|
11
|
+
end
|
12
|
+
body do
|
13
|
+
body_content
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def assets
|
19
|
+
end
|
20
|
+
|
21
|
+
def copy key
|
22
|
+
p t(key)
|
23
|
+
end
|
24
|
+
|
25
|
+
def text(value)
|
26
|
+
if value.is_a? Symbol
|
27
|
+
output << h(t(value))
|
28
|
+
else
|
29
|
+
super
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def body_content
|
34
|
+
copy :blank
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|