code_sync 0.6.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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