code_sync 0.6.7
Sign up to get free protection for your applications and to get access to all the features.
- data/.rvmrc +1 -0
- data/CNAME +1 -0
- data/Gemfile +24 -0
- data/Gemfile.lock +117 -0
- data/LICENSE.md +22 -0
- data/ROADMAP.md +20 -0
- data/TODO.md +14 -0
- data/bin/codesync +11 -0
- data/code_sync.gemspec +30 -0
- data/config/routes.rb +26 -0
- data/lib/assets/javascripts/canvas.coffee +12 -0
- data/lib/assets/javascripts/canvas/editors.coffee +48 -0
- data/lib/assets/javascripts/canvas/index.coffee +15 -0
- data/lib/assets/javascripts/canvas/layer_controller.coffee +47 -0
- data/lib/assets/javascripts/code_sync.coffee +3 -0
- data/lib/assets/javascripts/code_sync/backends/gist.coffee +78 -0
- data/lib/assets/javascripts/code_sync/client/index.coffee +104 -0
- data/lib/assets/javascripts/code_sync/client/util.coffee +61 -0
- data/lib/assets/javascripts/code_sync/codemirror.coffee +12 -0
- data/lib/assets/javascripts/code_sync/config.js.coffee.erb +38 -0
- data/lib/assets/javascripts/code_sync/console/index.coffee +54 -0
- data/lib/assets/javascripts/code_sync/console/templates/console.jst.skim +10 -0
- data/lib/assets/javascripts/code_sync/dependencies.coffee +6 -0
- data/lib/assets/javascripts/code_sync/editor/advanced.coffee +0 -0
- data/lib/assets/javascripts/code_sync/editor/datasources/document.coffee +212 -0
- data/lib/assets/javascripts/code_sync/editor/datasources/gist_loader.coffee +7 -0
- data/lib/assets/javascripts/code_sync/editor/datasources/modes.coffee +117 -0
- data/lib/assets/javascripts/code_sync/editor/datasources/project_assets.coffee +14 -0
- data/lib/assets/javascripts/code_sync/editor/index.coffee +415 -0
- data/lib/assets/javascripts/code_sync/editor/plugins/asset_selector.coffee +106 -0
- data/lib/assets/javascripts/code_sync/editor/plugins/color_picker.coffee +83 -0
- data/lib/assets/javascripts/code_sync/editor/plugins/document_manager.coffee +55 -0
- data/lib/assets/javascripts/code_sync/editor/plugins/document_tabs.coffee +178 -0
- data/lib/assets/javascripts/code_sync/editor/plugins/element_sync.coffee +111 -0
- data/lib/assets/javascripts/code_sync/editor/plugins/keymap_selector.coffee +44 -0
- data/lib/assets/javascripts/code_sync/editor/plugins/mode_selector.coffee +53 -0
- data/lib/assets/javascripts/code_sync/editor/plugins/name_input.coffee +44 -0
- data/lib/assets/javascripts/code_sync/editor/plugins/preferences.coffee +71 -0
- data/lib/assets/javascripts/code_sync/editor/templates/asset_editor.jst.skim +2 -0
- data/lib/assets/javascripts/code_sync/editor/templates/asset_selector.jst.skim +5 -0
- data/lib/assets/javascripts/code_sync/editor/templates/document_manager_tab.jst.skim +15 -0
- data/lib/assets/javascripts/code_sync/editor/templates/element_sync.jst.skim +19 -0
- data/lib/assets/javascripts/code_sync/editor/templates/preferences_panel.jst.skim +38 -0
- data/lib/assets/javascripts/code_sync/editor/views/asset_selector.coffee +106 -0
- data/lib/assets/javascripts/code_sync/editor/views/color_picker.coffee +76 -0
- data/lib/assets/javascripts/code_sync/editor/views/document_manager.coffee +176 -0
- data/lib/assets/javascripts/code_sync/editor/views/keymap_selector.coffee +37 -0
- data/lib/assets/javascripts/code_sync/editor/views/mode_selector.coffee +47 -0
- data/lib/assets/javascripts/code_sync/editor/views/name_input.coffee +44 -0
- data/lib/assets/javascripts/code_sync/editor/views/preferences.coffee +71 -0
- data/lib/assets/javascripts/code_sync/index.coffee +4 -0
- data/lib/assets/javascripts/code_sync/reloader.coffee +2 -0
- data/lib/assets/javascripts/code_sync_basic.coffee +1 -0
- data/lib/assets/javascripts/demos.coffee +48 -0
- data/lib/assets/javascripts/demos/default-content.coffee +72 -0
- data/lib/assets/javascripts/demos/layout_selector.coffee +19 -0
- data/lib/assets/javascripts/demos/tour.coffee +70 -0
- data/lib/assets/javascripts/demos/tour.jst.skim +29 -0
- data/lib/assets/javascripts/marketing.coffee +0 -0
- data/lib/assets/javascripts/vendor/.DS_Store +0 -0
- data/lib/assets/javascripts/vendor/backbone-events.js +160 -0
- data/lib/assets/javascripts/vendor/backbone-min.js +4 -0
- data/lib/assets/javascripts/vendor/codemirror-coffeescript.js +346 -0
- data/lib/assets/javascripts/vendor/codemirror-css.js +570 -0
- data/lib/assets/javascripts/vendor/codemirror-haml.js +153 -0
- data/lib/assets/javascripts/vendor/codemirror-htmlmixed.js +104 -0
- data/lib/assets/javascripts/vendor/codemirror-javascript.js +468 -0
- data/lib/assets/javascripts/vendor/codemirror-markdown.js +526 -0
- data/lib/assets/javascripts/vendor/codemirror-ruby.js +194 -0
- data/lib/assets/javascripts/vendor/codemirror-sass.js +330 -0
- data/lib/assets/javascripts/vendor/codemirror-skim.js +330 -0
- data/lib/assets/javascripts/vendor/codemirror-vim.js +3159 -0
- data/lib/assets/javascripts/vendor/codemirror-xml.js +328 -0
- data/lib/assets/javascripts/vendor/console.js +339 -0
- data/lib/assets/javascripts/vendor/gisted.js +27 -0
- data/lib/assets/javascripts/vendor/jquery-ui-resize-drag.min.js +6 -0
- data/lib/assets/javascripts/vendor/jquery.js +5 -0
- data/lib/assets/javascripts/vendor/keylauncher.js +4 -0
- data/lib/assets/javascripts/vendor/keymaster.min.js +4 -0
- data/lib/assets/javascripts/vendor/spectrum.js +1868 -0
- data/lib/assets/javascripts/vendor/underscore-min.js +1 -0
- data/lib/assets/javascripts/vendor/underscore.string.min.js +1 -0
- data/lib/assets/javascripts/vendor/vendored_codemirror.js +5558 -0
- data/lib/assets/javascripts/vendor/zepto.js +2 -0
- data/lib/assets/stylesheets/canvas.css.scss +101 -0
- data/lib/assets/stylesheets/code_sync.css.scss +4 -0
- data/lib/assets/stylesheets/code_sync/codemirror.css +7 -0
- data/lib/assets/stylesheets/code_sync/console.css +86 -0
- data/lib/assets/stylesheets/code_sync/editor/asset-name-input.css.scss +12 -0
- data/lib/assets/stylesheets/code_sync/editor/asset-selector.css.scss +58 -0
- data/lib/assets/stylesheets/code_sync/editor/codesync-color-picker.css.sass +5 -0
- data/lib/assets/stylesheets/code_sync/editor/document-tabs.css.scss +61 -0
- data/lib/assets/stylesheets/code_sync/editor/element-sync.css.scss +72 -0
- data/lib/assets/stylesheets/code_sync/editor/mode-selector.css.scss +0 -0
- data/lib/assets/stylesheets/code_sync/editor/preferences-panel.css.scss +26 -0
- data/lib/assets/stylesheets/code_sync/index.css.scss +141 -0
- data/lib/assets/stylesheets/demos.css.scss +96 -0
- data/lib/assets/stylesheets/marketing.css.sass +46 -0
- data/lib/assets/stylesheets/marketing/syntax.css.scss +1 -0
- data/lib/assets/stylesheets/vendor/animate.css +1 -0
- data/lib/assets/stylesheets/vendor/codemirror-ambiance.css +75 -0
- data/lib/assets/stylesheets/vendor/codemirror-lesserdark.css +44 -0
- data/lib/assets/stylesheets/vendor/codemirror-monokai.css +28 -0
- data/lib/assets/stylesheets/vendor/codemirror-xq-light.css +43 -0
- data/lib/assets/stylesheets/vendor/grid-layout.css +1406 -0
- data/lib/assets/stylesheets/vendor/spectrum.css +481 -0
- data/lib/assets/stylesheets/vendor/vendored_codemirror.css +246 -0
- data/lib/code_sync.rb +41 -0
- data/lib/code_sync/cli.rb +73 -0
- data/lib/code_sync/manager.rb +238 -0
- data/lib/code_sync/processors.rb +18 -0
- data/lib/code_sync/processors/basic.rb +9 -0
- data/lib/code_sync/processors/jst_processor.rb +17 -0
- data/lib/code_sync/pry_console.rb +132 -0
- data/lib/code_sync/rails.rb +7 -0
- data/lib/code_sync/rails/engine.rb +12 -0
- data/lib/code_sync/server.rb +225 -0
- data/lib/code_sync/sprockets_adapter.rb +145 -0
- data/lib/code_sync/temp_asset.rb +20 -0
- data/lib/code_sync/version.rb +3 -0
- data/lib/middleman_extension.rb +43 -0
- data/readme.md +26 -0
- data/site/.gitignore +14 -0
- data/site/Gemfile +13 -0
- data/site/Gemfile.lock +183 -0
- data/site/config.rb +26 -0
- data/site/source/canvas.html.slim +21 -0
- data/site/source/codepen-style-demo.html.slim +21 -0
- data/site/source/demo.html.slim +30 -0
- data/site/source/index.html.slim +128 -0
- data/site/source/layouts/layout.slim +18 -0
- data/site/source/samples/_client.html.md +13 -0
- data/site/source/samples/_editor.html.md +19 -0
- data/site/source/samples/_hooks.html.md +8 -0
- data/site/source/samples/_middleman.html.md +7 -0
- data/site/source/samples/_rails.html.md +8 -0
- data/site/source/samples/_standalone.html.md +36 -0
- data/spec/lib/code_sync/sprockets_adapter_spec.rb +44 -0
- data/spec/spec_helper.rb +21 -0
- data/spec/support/.DS_Store +0 -0
- data/spec/support/dummy_middleman/.gitignore +14 -0
- data/spec/support/dummy_middleman/Gemfile +5 -0
- data/spec/support/dummy_middleman/Gemfile.lock +100 -0
- data/spec/support/dummy_middleman/config.rb +77 -0
- data/spec/support/dummy_middleman/source/images/background.png +0 -0
- data/spec/support/dummy_middleman/source/images/middleman.png +0 -0
- data/spec/support/dummy_middleman/source/index.html.erb +10 -0
- data/spec/support/dummy_middleman/source/javascripts/all.js +1 -0
- data/spec/support/dummy_middleman/source/layouts/layout.erb +19 -0
- data/spec/support/dummy_middleman/source/stylesheets/all.css +55 -0
- data/spec/support/dummy_middleman/source/stylesheets/normalize.css +375 -0
- data/spec/support/dummy_rails/.gitignore +15 -0
- data/spec/support/dummy_rails/Gemfile +38 -0
- data/spec/support/dummy_rails/Gemfile.lock +112 -0
- data/spec/support/dummy_rails/README.rdoc +261 -0
- data/spec/support/dummy_rails/Rakefile +7 -0
- data/spec/support/dummy_rails/app/assets/images/rails.png +0 -0
- data/spec/support/dummy_rails/app/assets/javascripts/application.js +15 -0
- data/spec/support/dummy_rails/app/assets/stylesheets/application.css +13 -0
- data/spec/support/dummy_rails/app/controllers/application_controller.rb +3 -0
- data/spec/support/dummy_rails/app/helpers/application_helper.rb +2 -0
- data/spec/support/dummy_rails/app/mailers/.gitkeep +0 -0
- data/spec/support/dummy_rails/app/models/.gitkeep +0 -0
- data/spec/support/dummy_rails/app/views/layouts/application.html.erb +14 -0
- data/spec/support/dummy_rails/config.ru +4 -0
- data/spec/support/dummy_rails/config/application.rb +62 -0
- data/spec/support/dummy_rails/config/boot.rb +6 -0
- data/spec/support/dummy_rails/config/database.yml +25 -0
- data/spec/support/dummy_rails/config/environment.rb +5 -0
- data/spec/support/dummy_rails/config/environments/development.rb +37 -0
- data/spec/support/dummy_rails/config/environments/production.rb +67 -0
- data/spec/support/dummy_rails/config/environments/test.rb +37 -0
- data/spec/support/dummy_rails/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/support/dummy_rails/config/initializers/inflections.rb +15 -0
- data/spec/support/dummy_rails/config/initializers/mime_types.rb +5 -0
- data/spec/support/dummy_rails/config/initializers/secret_token.rb +7 -0
- data/spec/support/dummy_rails/config/initializers/session_store.rb +8 -0
- data/spec/support/dummy_rails/config/initializers/wrap_parameters.rb +14 -0
- data/spec/support/dummy_rails/config/locales/en.yml +5 -0
- data/spec/support/dummy_rails/config/routes.rb +58 -0
- data/spec/support/dummy_rails/db/seeds.rb +7 -0
- data/spec/support/dummy_rails/doc/README_FOR_APP +2 -0
- data/spec/support/dummy_rails/lib/assets/.gitkeep +0 -0
- data/spec/support/dummy_rails/lib/tasks/.gitkeep +0 -0
- data/spec/support/dummy_rails/log/.gitkeep +0 -0
- data/spec/support/dummy_rails/public/404.html +26 -0
- data/spec/support/dummy_rails/public/422.html +26 -0
- data/spec/support/dummy_rails/public/500.html +25 -0
- data/spec/support/dummy_rails/public/favicon.ico +0 -0
- data/spec/support/dummy_rails/public/index.html +241 -0
- data/spec/support/dummy_rails/public/robots.txt +5 -0
- data/spec/support/dummy_rails/script/rails +6 -0
- data/spec/support/dummy_rails/test/fixtures/.gitkeep +0 -0
- data/spec/support/dummy_rails/test/functional/.gitkeep +0 -0
- data/spec/support/dummy_rails/test/integration/.gitkeep +0 -0
- data/spec/support/dummy_rails/test/performance/browsing_test.rb +12 -0
- data/spec/support/dummy_rails/test/test_helper.rb +13 -0
- data/spec/support/dummy_rails/test/unit/.gitkeep +0 -0
- data/spec/support/dummy_rails/vendor/assets/javascripts/.gitkeep +0 -0
- data/spec/support/dummy_rails/vendor/assets/stylesheets/.gitkeep +0 -0
- data/spec/support/dummy_rails/vendor/plugins/.gitkeep +0 -0
- data/spec/support/dummy_static/.DS_Store +0 -0
- data/spec/support/dummy_static/app/.DS_Store +0 -0
- data/spec/support/dummy_static/app/assets/.DS_Store +0 -0
- data/spec/support/dummy_static/app/assets/javascripts/manifest.coffee +4 -0
- data/spec/support/dummy_static/app/assets/javascripts/spec_application_javascript.coffee +4 -0
- data/spec/support/dummy_static/app/assets/stylesheets/spec_application_stylesheet.css.scss +5 -0
- data/spec/support/dummy_static/lib/assets/javascripts/spec_library_javascript.coffee +3 -0
- data/spec/support/dummy_static/lib/assets/stylesheets/spec_library_stylesheet.css.scss +5 -0
- data/spec/support/dummy_static/vendor/assets/javascripts/spec_vendor_javascript.js +5 -0
- data/spec/support/dummy_static/vendor/assets/stylesheets/spec_vendor_stylesheets.css +3 -0
- data/vendor/assets/stylesheets/code_sync.css +1 -0
- metadata +492 -0
@@ -0,0 +1,18 @@
|
|
1
|
+
require "code_sync/processors/jst_processor"
|
2
|
+
|
3
|
+
module CodeSync
|
4
|
+
module Processors
|
5
|
+
Map = {
|
6
|
+
".jst.skim" => CodeSync::Processors::JstProcessor
|
7
|
+
}
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.lookup_processor_for_extension(extension)
|
11
|
+
if processor = Processors::Map[extension]
|
12
|
+
processor
|
13
|
+
else
|
14
|
+
CodeSync::Processors::Basic
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'pry'
|
2
|
+
|
3
|
+
module CodeSync
|
4
|
+
module Processors
|
5
|
+
class JstProcessor
|
6
|
+
def self.process contents,filename="adhoc",extension=".jst"
|
7
|
+
contents.match(/this.JST\[(.*)\]/) do |match|
|
8
|
+
if match[1]
|
9
|
+
contents[match[1]] = "\"#{filename}\""
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
contents
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
require 'multi_json'
|
2
|
+
require 'pry'
|
3
|
+
|
4
|
+
puts "Defining Pry Session Server"
|
5
|
+
|
6
|
+
# Thanks to the rack-webconsole-pry project
|
7
|
+
# for showing me the way to handle this
|
8
|
+
module CodeSync
|
9
|
+
class PrySessionServer
|
10
|
+
def initialize(app, options={})
|
11
|
+
@app = app
|
12
|
+
end
|
13
|
+
|
14
|
+
def call(env)
|
15
|
+
request = Rack::Request.new(env)
|
16
|
+
params = request.params
|
17
|
+
|
18
|
+
return @app.call(env) unless request.post? && (authenticate(params,env) && params['code'])
|
19
|
+
|
20
|
+
process(params['code'])
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
|
25
|
+
def process(code)
|
26
|
+
response = {}
|
27
|
+
|
28
|
+
if $pry.nil?
|
29
|
+
Pry.pager = false
|
30
|
+
$pry_output = StringIO.new("")
|
31
|
+
$pry_output.string = ""
|
32
|
+
$pry = Pry.new(output: $pry_output, pager: false)
|
33
|
+
Pry.initial_session_setup
|
34
|
+
end
|
35
|
+
|
36
|
+
pry = $pry
|
37
|
+
|
38
|
+
puts "hi"
|
39
|
+
binding.pry
|
40
|
+
|
41
|
+
# repl loop
|
42
|
+
if pry.binding_stack.last
|
43
|
+
target = Pry.binding_for(pry.binding_stack.last)
|
44
|
+
else
|
45
|
+
target = Pry.binding_for(TOPLEVEL_BINDING)
|
46
|
+
end
|
47
|
+
|
48
|
+
pry.repl_prologue(target) unless pry.binding_stack.last == target
|
49
|
+
pry.inject_sticky_locals(target)
|
50
|
+
|
51
|
+
response[:prompt] = pry.select_prompt("", target) + Pry::Code.new(code).to_s
|
52
|
+
|
53
|
+
received_output = false
|
54
|
+
|
55
|
+
begin
|
56
|
+
|
57
|
+
read_pipe, write_pipe = IO.pipe
|
58
|
+
end_line = "~~~~pry-console output end~~~~"
|
59
|
+
|
60
|
+
puts "getting to the thread"
|
61
|
+
|
62
|
+
thread = Thread.new do
|
63
|
+
while true
|
64
|
+
new_line = read_pipe.readline
|
65
|
+
break if new_line == end_line
|
66
|
+
$pry_output << new_line
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
old_stdout = STDOUT.dup
|
71
|
+
old_stderr = STDERR.dup
|
72
|
+
|
73
|
+
STDOUT.reopen(write_pipe)
|
74
|
+
STDERR.reopen(write_pipe)
|
75
|
+
|
76
|
+
if !pry.process_command(code, "", target)
|
77
|
+
result = target.send(:eval, code, Pry.eval_path, Pry.current_line)
|
78
|
+
received_output = true
|
79
|
+
end
|
80
|
+
|
81
|
+
if received_output
|
82
|
+
pry.set_last_result(result, target, code)
|
83
|
+
Pry.print.call($pry_output, result) if pry.should_print?
|
84
|
+
end
|
85
|
+
|
86
|
+
$pry_output.write(error_out) if error_out
|
87
|
+
|
88
|
+
response[:result] = $pry_output.string
|
89
|
+
|
90
|
+
respond_with(response)
|
91
|
+
|
92
|
+
rescue StandardError => e
|
93
|
+
error_out = "Error: " + e.message
|
94
|
+
|
95
|
+
ensure
|
96
|
+
write_pipe << end_line
|
97
|
+
|
98
|
+
thr.join
|
99
|
+
read_pipe.close
|
100
|
+
write_pipe.close
|
101
|
+
STDOUT.reopen(old_stdout)
|
102
|
+
STDERR.reopen(old_stderr)
|
103
|
+
|
104
|
+
puts "Enrusre"
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
|
110
|
+
# Outputs a hash that has a
|
111
|
+
# - prompt
|
112
|
+
# - result
|
113
|
+
#
|
114
|
+
def respond_with(hash)
|
115
|
+
response_body = MultiJson.encode(hash)
|
116
|
+
|
117
|
+
headers = {
|
118
|
+
"Content-Type" => "application/json",
|
119
|
+
"Content-Length" => response_body.bytesize.to_s
|
120
|
+
}
|
121
|
+
end
|
122
|
+
|
123
|
+
|
124
|
+
def authenticate(params, env)
|
125
|
+
true
|
126
|
+
end
|
127
|
+
|
128
|
+
def setup_pry_process
|
129
|
+
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module CodeSync
|
2
|
+
class Engine < ::Rails::Engine
|
3
|
+
initializer 'code_sync.manager', :before => :build_middleware_stack do |app|
|
4
|
+
enabled = (app.config.enable_code_sync_manager == true) rescue false
|
5
|
+
forbid_saving = (app.config.forbid_code_sync_save) rescue false
|
6
|
+
|
7
|
+
if enabled && !$rails_rake_task
|
8
|
+
CodeSync::Manager.start(sprockets: app.assets, forked: true, forbid_saving: !!forbid_saving)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,225 @@
|
|
1
|
+
require 'thin'
|
2
|
+
require 'faye'
|
3
|
+
require 'rack'
|
4
|
+
require 'json'
|
5
|
+
require 'pry'
|
6
|
+
|
7
|
+
require "code_sync/temp_asset"
|
8
|
+
require "code_sync/sprockets_adapter"
|
9
|
+
require "code_sync/pry_console"
|
10
|
+
|
11
|
+
module CodeSync
|
12
|
+
class Server
|
13
|
+
attr_accessor :assets,
|
14
|
+
:faye,
|
15
|
+
:root,
|
16
|
+
:options,
|
17
|
+
:forbid_saving,
|
18
|
+
:rack
|
19
|
+
|
20
|
+
|
21
|
+
def initialize options={}
|
22
|
+
@options = options.dup
|
23
|
+
@assets = options[:assets] || CodeSync::SprocketsAdapter.new(root:Dir.pwd())
|
24
|
+
@root = options[:root]
|
25
|
+
@forbid_saving = !!(options[:forbid_saving])
|
26
|
+
|
27
|
+
Faye::WebSocket.load_adapter('thin')
|
28
|
+
|
29
|
+
@faye = Faye::RackAdapter.new(mount:"/faye",timeout:25)
|
30
|
+
|
31
|
+
faye.add_extension(FayeMonitor.new)
|
32
|
+
end
|
33
|
+
|
34
|
+
def call(env)
|
35
|
+
[200, {"Access-Control-Allow-Origin"=>"*","Content-Type" => "application/json"}, [{code_sync:true}.to_json]]
|
36
|
+
end
|
37
|
+
|
38
|
+
def allow_saving?
|
39
|
+
forbid_saving == true
|
40
|
+
end
|
41
|
+
|
42
|
+
def urlmap
|
43
|
+
Rack::URLMap.new "/assets" => assets.env,
|
44
|
+
"/" => faye,
|
45
|
+
"/info" => ServerInfo.new(self, sprockets:assets, options: options, root: root, allow_saving: allow_saving?),
|
46
|
+
"/source" => SourceProvider.new(self, sprockets:assets, allow_saving: allow_saving?)
|
47
|
+
end
|
48
|
+
|
49
|
+
def start port=9295
|
50
|
+
@port = port
|
51
|
+
Rack::Server.start(app:urlmap,:Port=>port,:server=>'thin',:pid => File.join("/tmp/codesync-server.pid") )
|
52
|
+
end
|
53
|
+
|
54
|
+
def stop
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
class FayeMonitor
|
59
|
+
def incoming(message,callback)
|
60
|
+
if message['channel'] == "/meta/subscribe" and message['subscription']
|
61
|
+
end
|
62
|
+
|
63
|
+
callback.call(message)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
class SourceProvider
|
68
|
+
attr_accessor :sprockets, :root, :options
|
69
|
+
|
70
|
+
def initialize app, options={}
|
71
|
+
@options = options
|
72
|
+
@sprockets = options[:sprockets]
|
73
|
+
@root = options[:root] || Dir.pwd()
|
74
|
+
end
|
75
|
+
|
76
|
+
def to_s
|
77
|
+
"codesync source gateway"
|
78
|
+
end
|
79
|
+
|
80
|
+
def allow_saving?
|
81
|
+
options[:allow_saving] == true
|
82
|
+
end
|
83
|
+
|
84
|
+
def handle_file_write(params={}, response)
|
85
|
+
path, contents = params.values_at "path", "contents"
|
86
|
+
|
87
|
+
unless path.match(/^\//)
|
88
|
+
path = File.join(root,path)
|
89
|
+
end
|
90
|
+
|
91
|
+
begin
|
92
|
+
raise 'Saving is disabled' unless allow_saving?
|
93
|
+
|
94
|
+
if File.exists?(path)
|
95
|
+
File.open(path,"w+") {|fh| fh.puts(contents)}
|
96
|
+
else
|
97
|
+
response[:success] = false
|
98
|
+
response[:error] = "File not found: #{ path } :: #{ $! }"
|
99
|
+
end
|
100
|
+
rescue
|
101
|
+
response[:error] = "#{ $! }"
|
102
|
+
response[:success] = false
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def handle_adhoc_compilation(params={}, response={})
|
107
|
+
contents, filename, extension = params.values_at("contents", "name", "extension")
|
108
|
+
|
109
|
+
begin
|
110
|
+
asset = TempAsset.create_from(contents, env: sprockets, filename: filename, extension: extension)
|
111
|
+
response[:contents] = contents
|
112
|
+
response[:compiled] = process_compiled_asset(asset.to_s,filename,extension)
|
113
|
+
rescue
|
114
|
+
response[:error] = $!
|
115
|
+
response[:success] = false
|
116
|
+
end
|
117
|
+
|
118
|
+
response
|
119
|
+
end
|
120
|
+
|
121
|
+
def process_compiled_asset contents, filename, extension
|
122
|
+
begin
|
123
|
+
processor = CodeSync.lookup_processor_for_extension(extension)
|
124
|
+
processor.process(contents,filename,extension)
|
125
|
+
rescue
|
126
|
+
contents
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def handle_post(env)
|
131
|
+
response = {success: true}
|
132
|
+
|
133
|
+
env['rack.input'].rewind
|
134
|
+
body = env['rack.input'].read
|
135
|
+
|
136
|
+
params = begin
|
137
|
+
JSON.parse(body)
|
138
|
+
rescue
|
139
|
+
response[:success] = false
|
140
|
+
response[:error] = $!
|
141
|
+
response[:body] = body
|
142
|
+
return response
|
143
|
+
end
|
144
|
+
|
145
|
+
if params["path"] && params["contents"] && params["path"].length > 0
|
146
|
+
handle_file_write(params, response)
|
147
|
+
return response
|
148
|
+
end
|
149
|
+
|
150
|
+
if params["name"] && params["extension"] && params["contents"]
|
151
|
+
handle_adhoc_compilation(params, response)
|
152
|
+
return response
|
153
|
+
end
|
154
|
+
|
155
|
+
response
|
156
|
+
end
|
157
|
+
|
158
|
+
def handle_get(env)
|
159
|
+
response = {success: true}
|
160
|
+
|
161
|
+
query = Rack::Utils.parse_query env['QUERY_STRING']
|
162
|
+
|
163
|
+
if query['path']
|
164
|
+
response.merge! success: true, contents: IO.read(query["path"])
|
165
|
+
else
|
166
|
+
response.merge! success: false, error: "Must specify an asset path"
|
167
|
+
end
|
168
|
+
|
169
|
+
response
|
170
|
+
end
|
171
|
+
|
172
|
+
# Why am I not just using Sinatra here?
|
173
|
+
def call(env)
|
174
|
+
response = begin
|
175
|
+
if env['REQUEST_METHOD'] == "POST"
|
176
|
+
handle_post(env)
|
177
|
+
else
|
178
|
+
handle_get(env)
|
179
|
+
end
|
180
|
+
rescue
|
181
|
+
response[:success] = false
|
182
|
+
response[:error] = "Fatal Error: #{ $! }"
|
183
|
+
end
|
184
|
+
|
185
|
+
if response[:success]
|
186
|
+
[200, {"Access-Control-Allow-Origin"=>"*","Content-Type" => "application/json"}, [JSON.generate(response)] ]
|
187
|
+
else
|
188
|
+
[200, {"Access-Control-Allow-Origin"=>"*","Content-Type" => "application/json"}, [JSON.generate(response)] ]
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
class ServerInfo
|
194
|
+
attr_accessor :faye, :sprockets, :options
|
195
|
+
|
196
|
+
def initialize app, options={}
|
197
|
+
@sprockets = options[:sprockets]
|
198
|
+
@faye = options[:faye]
|
199
|
+
@options = options.dup
|
200
|
+
end
|
201
|
+
|
202
|
+
def to_s
|
203
|
+
"codesync server info"
|
204
|
+
end
|
205
|
+
|
206
|
+
def allow_saving?
|
207
|
+
options[:allow_saving] == true
|
208
|
+
end
|
209
|
+
|
210
|
+
def call(env)
|
211
|
+
response = JSON.generate(project_assets: sprockets.project_assets, codesync_version: CodeSync::Version,paths:sprockets.env.paths, root:@options[:root], allow_saving: allow_saving?)
|
212
|
+
[200, {"Access-Control-Allow-Origin"=>"*","Content-Type" => "application/json"}, [response]]
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
# Thin::Server.start('0.0.0.0', 3000) do
|
219
|
+
# use Rack::CommonLogger
|
220
|
+
# use Rack::ShowExceptions
|
221
|
+
# map "/lobster" do
|
222
|
+
# use Rack::Lint
|
223
|
+
# run Rack::Lobster.new
|
224
|
+
# end
|
225
|
+
# end
|
@@ -0,0 +1,145 @@
|
|
1
|
+
module CodeSync
|
2
|
+
class AssetPipelineGems
|
3
|
+
TestPaths = %w{
|
4
|
+
assets/stylesheets
|
5
|
+
assets/javascripts
|
6
|
+
assets/images
|
7
|
+
app/assets/javascripts
|
8
|
+
lib/assets/javascripts
|
9
|
+
vendor/assets/javascripts
|
10
|
+
app/assets/stylesheets
|
11
|
+
lib/assets/stylesheets
|
12
|
+
vendor/assets/stylesheets
|
13
|
+
app/assets/images
|
14
|
+
lib/assets/images
|
15
|
+
vendor/assets/images
|
16
|
+
javascripts
|
17
|
+
stylesheets
|
18
|
+
images
|
19
|
+
}
|
20
|
+
|
21
|
+
def self.gems
|
22
|
+
begin
|
23
|
+
return @gems if !@gems.nil?
|
24
|
+
|
25
|
+
gems = ::Gem::Specification.latest_specs
|
26
|
+
|
27
|
+
gems.select! do |gemspec|
|
28
|
+
base = gemspec.full_gem_path
|
29
|
+
TestPaths.detect {|folder| File.exists?(File.join(base,folder))}
|
30
|
+
end
|
31
|
+
rescue
|
32
|
+
[]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.paths
|
37
|
+
paths = gems.flat_map do |gemspec|
|
38
|
+
base = gemspec.full_gem_path
|
39
|
+
TestPaths.map {|folder| File.join(base, folder)}
|
40
|
+
end
|
41
|
+
|
42
|
+
paths.select {|dir| File.exists?(dir) }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
class SprocketsAdapter
|
47
|
+
attr_accessor :env, :options
|
48
|
+
|
49
|
+
def initialize sprockets, options=nil
|
50
|
+
if options.nil? and sprockets.is_a?(Hash)
|
51
|
+
options = sprockets
|
52
|
+
sprockets = nil
|
53
|
+
end
|
54
|
+
|
55
|
+
@options = options
|
56
|
+
|
57
|
+
@env = options[:sprockets] || Sprockets::Environment.new(options[:root] ||= Dir.pwd())
|
58
|
+
|
59
|
+
append_asset_paths()
|
60
|
+
end
|
61
|
+
|
62
|
+
def process_changes_to assets=[]
|
63
|
+
|
64
|
+
results = Array(assets).map do |path|
|
65
|
+
|
66
|
+
asset = env.find_asset(path)
|
67
|
+
|
68
|
+
asset && notification = {
|
69
|
+
asset_path: path,
|
70
|
+
digest_path:asset.digest_path,
|
71
|
+
name:asset.logical_path,
|
72
|
+
source: (asset.to_s rescue nil),
|
73
|
+
path: path,
|
74
|
+
content: IO.read(path)
|
75
|
+
}
|
76
|
+
end
|
77
|
+
|
78
|
+
Array(results)
|
79
|
+
end
|
80
|
+
|
81
|
+
def compile content, options={}
|
82
|
+
create_asset(content,options).to_s
|
83
|
+
end
|
84
|
+
|
85
|
+
def create_asset content, options={}
|
86
|
+
TempAsset.create_from(content, options.merge(env: env))
|
87
|
+
end
|
88
|
+
|
89
|
+
def project_asset_directories
|
90
|
+
directories = env.paths.select {|path| path.include?(root) }
|
91
|
+
end
|
92
|
+
|
93
|
+
def project_assets
|
94
|
+
files = project_asset_directories.inject([]) do |memo, path|
|
95
|
+
memo += Dir.glob("#{path}/**/*")
|
96
|
+
end
|
97
|
+
|
98
|
+
files.reject! {|path| path.match(/\.min\.js/) || path.match(/\-min\.js/) }
|
99
|
+
files.select! {|path| path.match(/\.jst|\.coffee|\.css|\.js/)}
|
100
|
+
|
101
|
+
files
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
def method_missing meth, *args, &block
|
106
|
+
env.send(meth, *args, &block)
|
107
|
+
end
|
108
|
+
|
109
|
+
protected
|
110
|
+
|
111
|
+
def tmpdir
|
112
|
+
@tmpdir ||= Dir.tmpdir
|
113
|
+
end
|
114
|
+
|
115
|
+
def append_gem_paths
|
116
|
+
AssetPipelineGems.paths.each {|path| env.append_path(path) }
|
117
|
+
end
|
118
|
+
|
119
|
+
def append_temporary_path
|
120
|
+
env.prepend_path(tmpdir)
|
121
|
+
end
|
122
|
+
|
123
|
+
def append_asset_paths base_path=nil
|
124
|
+
base_path ||= env.root
|
125
|
+
|
126
|
+
append_gem_paths
|
127
|
+
|
128
|
+
env.append_path tmpdir
|
129
|
+
|
130
|
+
env.append_path CodeSync.gem_assets_root
|
131
|
+
|
132
|
+
%w{lib vendor app}.each do |base|
|
133
|
+
path = File.join(env.root, base, 'assets')
|
134
|
+
|
135
|
+
if File.exists?(path)
|
136
|
+
%w{images stylesheets javascripts}.each do |type|
|
137
|
+
if File.exists?(File.join(path, type))
|
138
|
+
env.append_path(File.join(path, type))
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|