code_sync 0.6.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (213) hide show
  1. data/.rvmrc +1 -0
  2. data/CNAME +1 -0
  3. data/Gemfile +24 -0
  4. data/Gemfile.lock +117 -0
  5. data/LICENSE.md +22 -0
  6. data/ROADMAP.md +20 -0
  7. data/TODO.md +14 -0
  8. data/bin/codesync +11 -0
  9. data/code_sync.gemspec +30 -0
  10. data/config/routes.rb +26 -0
  11. data/lib/assets/javascripts/canvas.coffee +12 -0
  12. data/lib/assets/javascripts/canvas/editors.coffee +48 -0
  13. data/lib/assets/javascripts/canvas/index.coffee +15 -0
  14. data/lib/assets/javascripts/canvas/layer_controller.coffee +47 -0
  15. data/lib/assets/javascripts/code_sync.coffee +3 -0
  16. data/lib/assets/javascripts/code_sync/backends/gist.coffee +78 -0
  17. data/lib/assets/javascripts/code_sync/client/index.coffee +104 -0
  18. data/lib/assets/javascripts/code_sync/client/util.coffee +61 -0
  19. data/lib/assets/javascripts/code_sync/codemirror.coffee +12 -0
  20. data/lib/assets/javascripts/code_sync/config.js.coffee.erb +38 -0
  21. data/lib/assets/javascripts/code_sync/console/index.coffee +54 -0
  22. data/lib/assets/javascripts/code_sync/console/templates/console.jst.skim +10 -0
  23. data/lib/assets/javascripts/code_sync/dependencies.coffee +6 -0
  24. data/lib/assets/javascripts/code_sync/editor/advanced.coffee +0 -0
  25. data/lib/assets/javascripts/code_sync/editor/datasources/document.coffee +212 -0
  26. data/lib/assets/javascripts/code_sync/editor/datasources/gist_loader.coffee +7 -0
  27. data/lib/assets/javascripts/code_sync/editor/datasources/modes.coffee +117 -0
  28. data/lib/assets/javascripts/code_sync/editor/datasources/project_assets.coffee +14 -0
  29. data/lib/assets/javascripts/code_sync/editor/index.coffee +415 -0
  30. data/lib/assets/javascripts/code_sync/editor/plugins/asset_selector.coffee +106 -0
  31. data/lib/assets/javascripts/code_sync/editor/plugins/color_picker.coffee +83 -0
  32. data/lib/assets/javascripts/code_sync/editor/plugins/document_manager.coffee +55 -0
  33. data/lib/assets/javascripts/code_sync/editor/plugins/document_tabs.coffee +178 -0
  34. data/lib/assets/javascripts/code_sync/editor/plugins/element_sync.coffee +111 -0
  35. data/lib/assets/javascripts/code_sync/editor/plugins/keymap_selector.coffee +44 -0
  36. data/lib/assets/javascripts/code_sync/editor/plugins/mode_selector.coffee +53 -0
  37. data/lib/assets/javascripts/code_sync/editor/plugins/name_input.coffee +44 -0
  38. data/lib/assets/javascripts/code_sync/editor/plugins/preferences.coffee +71 -0
  39. data/lib/assets/javascripts/code_sync/editor/templates/asset_editor.jst.skim +2 -0
  40. data/lib/assets/javascripts/code_sync/editor/templates/asset_selector.jst.skim +5 -0
  41. data/lib/assets/javascripts/code_sync/editor/templates/document_manager_tab.jst.skim +15 -0
  42. data/lib/assets/javascripts/code_sync/editor/templates/element_sync.jst.skim +19 -0
  43. data/lib/assets/javascripts/code_sync/editor/templates/preferences_panel.jst.skim +38 -0
  44. data/lib/assets/javascripts/code_sync/editor/views/asset_selector.coffee +106 -0
  45. data/lib/assets/javascripts/code_sync/editor/views/color_picker.coffee +76 -0
  46. data/lib/assets/javascripts/code_sync/editor/views/document_manager.coffee +176 -0
  47. data/lib/assets/javascripts/code_sync/editor/views/keymap_selector.coffee +37 -0
  48. data/lib/assets/javascripts/code_sync/editor/views/mode_selector.coffee +47 -0
  49. data/lib/assets/javascripts/code_sync/editor/views/name_input.coffee +44 -0
  50. data/lib/assets/javascripts/code_sync/editor/views/preferences.coffee +71 -0
  51. data/lib/assets/javascripts/code_sync/index.coffee +4 -0
  52. data/lib/assets/javascripts/code_sync/reloader.coffee +2 -0
  53. data/lib/assets/javascripts/code_sync_basic.coffee +1 -0
  54. data/lib/assets/javascripts/demos.coffee +48 -0
  55. data/lib/assets/javascripts/demos/default-content.coffee +72 -0
  56. data/lib/assets/javascripts/demos/layout_selector.coffee +19 -0
  57. data/lib/assets/javascripts/demos/tour.coffee +70 -0
  58. data/lib/assets/javascripts/demos/tour.jst.skim +29 -0
  59. data/lib/assets/javascripts/marketing.coffee +0 -0
  60. data/lib/assets/javascripts/vendor/.DS_Store +0 -0
  61. data/lib/assets/javascripts/vendor/backbone-events.js +160 -0
  62. data/lib/assets/javascripts/vendor/backbone-min.js +4 -0
  63. data/lib/assets/javascripts/vendor/codemirror-coffeescript.js +346 -0
  64. data/lib/assets/javascripts/vendor/codemirror-css.js +570 -0
  65. data/lib/assets/javascripts/vendor/codemirror-haml.js +153 -0
  66. data/lib/assets/javascripts/vendor/codemirror-htmlmixed.js +104 -0
  67. data/lib/assets/javascripts/vendor/codemirror-javascript.js +468 -0
  68. data/lib/assets/javascripts/vendor/codemirror-markdown.js +526 -0
  69. data/lib/assets/javascripts/vendor/codemirror-ruby.js +194 -0
  70. data/lib/assets/javascripts/vendor/codemirror-sass.js +330 -0
  71. data/lib/assets/javascripts/vendor/codemirror-skim.js +330 -0
  72. data/lib/assets/javascripts/vendor/codemirror-vim.js +3159 -0
  73. data/lib/assets/javascripts/vendor/codemirror-xml.js +328 -0
  74. data/lib/assets/javascripts/vendor/console.js +339 -0
  75. data/lib/assets/javascripts/vendor/gisted.js +27 -0
  76. data/lib/assets/javascripts/vendor/jquery-ui-resize-drag.min.js +6 -0
  77. data/lib/assets/javascripts/vendor/jquery.js +5 -0
  78. data/lib/assets/javascripts/vendor/keylauncher.js +4 -0
  79. data/lib/assets/javascripts/vendor/keymaster.min.js +4 -0
  80. data/lib/assets/javascripts/vendor/spectrum.js +1868 -0
  81. data/lib/assets/javascripts/vendor/underscore-min.js +1 -0
  82. data/lib/assets/javascripts/vendor/underscore.string.min.js +1 -0
  83. data/lib/assets/javascripts/vendor/vendored_codemirror.js +5558 -0
  84. data/lib/assets/javascripts/vendor/zepto.js +2 -0
  85. data/lib/assets/stylesheets/canvas.css.scss +101 -0
  86. data/lib/assets/stylesheets/code_sync.css.scss +4 -0
  87. data/lib/assets/stylesheets/code_sync/codemirror.css +7 -0
  88. data/lib/assets/stylesheets/code_sync/console.css +86 -0
  89. data/lib/assets/stylesheets/code_sync/editor/asset-name-input.css.scss +12 -0
  90. data/lib/assets/stylesheets/code_sync/editor/asset-selector.css.scss +58 -0
  91. data/lib/assets/stylesheets/code_sync/editor/codesync-color-picker.css.sass +5 -0
  92. data/lib/assets/stylesheets/code_sync/editor/document-tabs.css.scss +61 -0
  93. data/lib/assets/stylesheets/code_sync/editor/element-sync.css.scss +72 -0
  94. data/lib/assets/stylesheets/code_sync/editor/mode-selector.css.scss +0 -0
  95. data/lib/assets/stylesheets/code_sync/editor/preferences-panel.css.scss +26 -0
  96. data/lib/assets/stylesheets/code_sync/index.css.scss +141 -0
  97. data/lib/assets/stylesheets/demos.css.scss +96 -0
  98. data/lib/assets/stylesheets/marketing.css.sass +46 -0
  99. data/lib/assets/stylesheets/marketing/syntax.css.scss +1 -0
  100. data/lib/assets/stylesheets/vendor/animate.css +1 -0
  101. data/lib/assets/stylesheets/vendor/codemirror-ambiance.css +75 -0
  102. data/lib/assets/stylesheets/vendor/codemirror-lesserdark.css +44 -0
  103. data/lib/assets/stylesheets/vendor/codemirror-monokai.css +28 -0
  104. data/lib/assets/stylesheets/vendor/codemirror-xq-light.css +43 -0
  105. data/lib/assets/stylesheets/vendor/grid-layout.css +1406 -0
  106. data/lib/assets/stylesheets/vendor/spectrum.css +481 -0
  107. data/lib/assets/stylesheets/vendor/vendored_codemirror.css +246 -0
  108. data/lib/code_sync.rb +41 -0
  109. data/lib/code_sync/cli.rb +73 -0
  110. data/lib/code_sync/manager.rb +238 -0
  111. data/lib/code_sync/processors.rb +18 -0
  112. data/lib/code_sync/processors/basic.rb +9 -0
  113. data/lib/code_sync/processors/jst_processor.rb +17 -0
  114. data/lib/code_sync/pry_console.rb +132 -0
  115. data/lib/code_sync/rails.rb +7 -0
  116. data/lib/code_sync/rails/engine.rb +12 -0
  117. data/lib/code_sync/server.rb +225 -0
  118. data/lib/code_sync/sprockets_adapter.rb +145 -0
  119. data/lib/code_sync/temp_asset.rb +20 -0
  120. data/lib/code_sync/version.rb +3 -0
  121. data/lib/middleman_extension.rb +43 -0
  122. data/readme.md +26 -0
  123. data/site/.gitignore +14 -0
  124. data/site/Gemfile +13 -0
  125. data/site/Gemfile.lock +183 -0
  126. data/site/config.rb +26 -0
  127. data/site/source/canvas.html.slim +21 -0
  128. data/site/source/codepen-style-demo.html.slim +21 -0
  129. data/site/source/demo.html.slim +30 -0
  130. data/site/source/index.html.slim +128 -0
  131. data/site/source/layouts/layout.slim +18 -0
  132. data/site/source/samples/_client.html.md +13 -0
  133. data/site/source/samples/_editor.html.md +19 -0
  134. data/site/source/samples/_hooks.html.md +8 -0
  135. data/site/source/samples/_middleman.html.md +7 -0
  136. data/site/source/samples/_rails.html.md +8 -0
  137. data/site/source/samples/_standalone.html.md +36 -0
  138. data/spec/lib/code_sync/sprockets_adapter_spec.rb +44 -0
  139. data/spec/spec_helper.rb +21 -0
  140. data/spec/support/.DS_Store +0 -0
  141. data/spec/support/dummy_middleman/.gitignore +14 -0
  142. data/spec/support/dummy_middleman/Gemfile +5 -0
  143. data/spec/support/dummy_middleman/Gemfile.lock +100 -0
  144. data/spec/support/dummy_middleman/config.rb +77 -0
  145. data/spec/support/dummy_middleman/source/images/background.png +0 -0
  146. data/spec/support/dummy_middleman/source/images/middleman.png +0 -0
  147. data/spec/support/dummy_middleman/source/index.html.erb +10 -0
  148. data/spec/support/dummy_middleman/source/javascripts/all.js +1 -0
  149. data/spec/support/dummy_middleman/source/layouts/layout.erb +19 -0
  150. data/spec/support/dummy_middleman/source/stylesheets/all.css +55 -0
  151. data/spec/support/dummy_middleman/source/stylesheets/normalize.css +375 -0
  152. data/spec/support/dummy_rails/.gitignore +15 -0
  153. data/spec/support/dummy_rails/Gemfile +38 -0
  154. data/spec/support/dummy_rails/Gemfile.lock +112 -0
  155. data/spec/support/dummy_rails/README.rdoc +261 -0
  156. data/spec/support/dummy_rails/Rakefile +7 -0
  157. data/spec/support/dummy_rails/app/assets/images/rails.png +0 -0
  158. data/spec/support/dummy_rails/app/assets/javascripts/application.js +15 -0
  159. data/spec/support/dummy_rails/app/assets/stylesheets/application.css +13 -0
  160. data/spec/support/dummy_rails/app/controllers/application_controller.rb +3 -0
  161. data/spec/support/dummy_rails/app/helpers/application_helper.rb +2 -0
  162. data/spec/support/dummy_rails/app/mailers/.gitkeep +0 -0
  163. data/spec/support/dummy_rails/app/models/.gitkeep +0 -0
  164. data/spec/support/dummy_rails/app/views/layouts/application.html.erb +14 -0
  165. data/spec/support/dummy_rails/config.ru +4 -0
  166. data/spec/support/dummy_rails/config/application.rb +62 -0
  167. data/spec/support/dummy_rails/config/boot.rb +6 -0
  168. data/spec/support/dummy_rails/config/database.yml +25 -0
  169. data/spec/support/dummy_rails/config/environment.rb +5 -0
  170. data/spec/support/dummy_rails/config/environments/development.rb +37 -0
  171. data/spec/support/dummy_rails/config/environments/production.rb +67 -0
  172. data/spec/support/dummy_rails/config/environments/test.rb +37 -0
  173. data/spec/support/dummy_rails/config/initializers/backtrace_silencers.rb +7 -0
  174. data/spec/support/dummy_rails/config/initializers/inflections.rb +15 -0
  175. data/spec/support/dummy_rails/config/initializers/mime_types.rb +5 -0
  176. data/spec/support/dummy_rails/config/initializers/secret_token.rb +7 -0
  177. data/spec/support/dummy_rails/config/initializers/session_store.rb +8 -0
  178. data/spec/support/dummy_rails/config/initializers/wrap_parameters.rb +14 -0
  179. data/spec/support/dummy_rails/config/locales/en.yml +5 -0
  180. data/spec/support/dummy_rails/config/routes.rb +58 -0
  181. data/spec/support/dummy_rails/db/seeds.rb +7 -0
  182. data/spec/support/dummy_rails/doc/README_FOR_APP +2 -0
  183. data/spec/support/dummy_rails/lib/assets/.gitkeep +0 -0
  184. data/spec/support/dummy_rails/lib/tasks/.gitkeep +0 -0
  185. data/spec/support/dummy_rails/log/.gitkeep +0 -0
  186. data/spec/support/dummy_rails/public/404.html +26 -0
  187. data/spec/support/dummy_rails/public/422.html +26 -0
  188. data/spec/support/dummy_rails/public/500.html +25 -0
  189. data/spec/support/dummy_rails/public/favicon.ico +0 -0
  190. data/spec/support/dummy_rails/public/index.html +241 -0
  191. data/spec/support/dummy_rails/public/robots.txt +5 -0
  192. data/spec/support/dummy_rails/script/rails +6 -0
  193. data/spec/support/dummy_rails/test/fixtures/.gitkeep +0 -0
  194. data/spec/support/dummy_rails/test/functional/.gitkeep +0 -0
  195. data/spec/support/dummy_rails/test/integration/.gitkeep +0 -0
  196. data/spec/support/dummy_rails/test/performance/browsing_test.rb +12 -0
  197. data/spec/support/dummy_rails/test/test_helper.rb +13 -0
  198. data/spec/support/dummy_rails/test/unit/.gitkeep +0 -0
  199. data/spec/support/dummy_rails/vendor/assets/javascripts/.gitkeep +0 -0
  200. data/spec/support/dummy_rails/vendor/assets/stylesheets/.gitkeep +0 -0
  201. data/spec/support/dummy_rails/vendor/plugins/.gitkeep +0 -0
  202. data/spec/support/dummy_static/.DS_Store +0 -0
  203. data/spec/support/dummy_static/app/.DS_Store +0 -0
  204. data/spec/support/dummy_static/app/assets/.DS_Store +0 -0
  205. data/spec/support/dummy_static/app/assets/javascripts/manifest.coffee +4 -0
  206. data/spec/support/dummy_static/app/assets/javascripts/spec_application_javascript.coffee +4 -0
  207. data/spec/support/dummy_static/app/assets/stylesheets/spec_application_stylesheet.css.scss +5 -0
  208. data/spec/support/dummy_static/lib/assets/javascripts/spec_library_javascript.coffee +3 -0
  209. data/spec/support/dummy_static/lib/assets/stylesheets/spec_library_stylesheet.css.scss +5 -0
  210. data/spec/support/dummy_static/vendor/assets/javascripts/spec_vendor_javascript.js +5 -0
  211. data/spec/support/dummy_static/vendor/assets/stylesheets/spec_vendor_stylesheets.css +3 -0
  212. data/vendor/assets/stylesheets/code_sync.css +1 -0
  213. 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,9 @@
1
+ module CodeSync
2
+ module Processors
3
+ class Basic
4
+ def self.process(contents)
5
+ contents
6
+ end
7
+ end
8
+ end
9
+ 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,7 @@
1
+ require "code_sync/rails/engine"
2
+
3
+ module CodeSync
4
+ module Rails
5
+ VERSION = CodeSync::Version
6
+ end
7
+ 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