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,246 @@
1
+ /* BASICS */
2
+
3
+ .CodeMirror {
4
+ /* Set height, width, borders, and global font properties here */
5
+ font-family: monospace;
6
+ height: 300px;
7
+ }
8
+ .CodeMirror-scroll {
9
+ /* Set scrolling behaviour here */
10
+ overflow: auto;
11
+ }
12
+
13
+ /* PADDING */
14
+
15
+ .CodeMirror-lines {
16
+ padding: 4px 0; /* Vertical padding around content */
17
+ }
18
+ .CodeMirror pre {
19
+ padding: 0 4px; /* Horizontal padding of content */
20
+ }
21
+
22
+ .CodeMirror-scrollbar-filler {
23
+ background-color: white; /* The little square between H and V scrollbars */
24
+ }
25
+
26
+ /* GUTTER */
27
+
28
+ .CodeMirror-gutters {
29
+ border-right: 1px solid #ddd;
30
+ background-color: #f7f7f7;
31
+ }
32
+ .CodeMirror-linenumbers {}
33
+ .CodeMirror-linenumber {
34
+ padding: 0 3px 0 5px;
35
+ min-width: 20px;
36
+ text-align: right;
37
+ color: #999;
38
+ }
39
+
40
+ /* CURSOR */
41
+
42
+ .CodeMirror div.CodeMirror-cursor {
43
+ border-left: 1px solid black;
44
+ z-index: 3;
45
+ }
46
+ /* Shown when moving in bi-directional text */
47
+ .CodeMirror div.CodeMirror-secondarycursor {
48
+ border-left: 1px solid silver;
49
+ }
50
+ .CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor {
51
+ width: auto;
52
+ border: 0;
53
+ background: #7e7;
54
+ z-index: 1;
55
+ }
56
+ /* Can style cursor different in overwrite (non-insert) mode */
57
+ .CodeMirror div.CodeMirror-cursor.CodeMirror-overwrite {}
58
+
59
+ .cm-tab { display: inline-block; }
60
+
61
+ /* DEFAULT THEME */
62
+
63
+ .cm-s-default .cm-keyword {color: #708;}
64
+ .cm-s-default .cm-atom {color: #219;}
65
+ .cm-s-default .cm-number {color: #164;}
66
+ .cm-s-default .cm-def {color: #00f;}
67
+ .cm-s-default .cm-variable {color: black;}
68
+ .cm-s-default .cm-variable-2 {color: #05a;}
69
+ .cm-s-default .cm-variable-3 {color: #085;}
70
+ .cm-s-default .cm-property {color: black;}
71
+ .cm-s-default .cm-operator {color: black;}
72
+ .cm-s-default .cm-comment {color: #a50;}
73
+ .cm-s-default .cm-string {color: #a11;}
74
+ .cm-s-default .cm-string-2 {color: #f50;}
75
+ .cm-s-default .cm-meta {color: #555;}
76
+ .cm-s-default .cm-error {color: #f00;}
77
+ .cm-s-default .cm-qualifier {color: #555;}
78
+ .cm-s-default .cm-builtin {color: #30a;}
79
+ .cm-s-default .cm-bracket {color: #997;}
80
+ .cm-s-default .cm-tag {color: #170;}
81
+ .cm-s-default .cm-attribute {color: #00c;}
82
+ .cm-s-default .cm-header {color: blue;}
83
+ .cm-s-default .cm-quote {color: #090;}
84
+ .cm-s-default .cm-hr {color: #999;}
85
+ .cm-s-default .cm-link {color: #00c;}
86
+
87
+ .cm-negative {color: #d44;}
88
+ .cm-positive {color: #292;}
89
+ .cm-header, .cm-strong {font-weight: bold;}
90
+ .cm-em {font-style: italic;}
91
+ .cm-link {text-decoration: underline;}
92
+
93
+ .cm-invalidchar {color: #f00;}
94
+
95
+ div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
96
+ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
97
+
98
+ /* STOP */
99
+
100
+ /* The rest of this file contains styles related to the mechanics of
101
+ the editor. You probably shouldn't touch them. */
102
+
103
+ .CodeMirror {
104
+ line-height: 1;
105
+ position: relative;
106
+ overflow: hidden;
107
+ background: white;
108
+ color: black;
109
+ }
110
+
111
+ .CodeMirror-scroll {
112
+ /* 30px is the magic margin used to hide the element's real scrollbars */
113
+ /* See overflow: hidden in .CodeMirror */
114
+ margin-bottom: -30px; margin-right: -30px;
115
+ padding-bottom: 30px; padding-right: 30px;
116
+ height: 100%;
117
+ outline: none; /* Prevent dragging from highlighting the element */
118
+ position: relative;
119
+ }
120
+ .CodeMirror-sizer {
121
+ position: relative;
122
+ }
123
+
124
+ /* The fake, visible scrollbars. Used to force redraw during scrolling
125
+ before actuall scrolling happens, thus preventing shaking and
126
+ flickering artifacts. */
127
+ .CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler {
128
+ position: absolute;
129
+ z-index: 6;
130
+ display: none;
131
+ }
132
+ .CodeMirror-vscrollbar {
133
+ right: 0; top: 0;
134
+ overflow-x: hidden;
135
+ overflow-y: scroll;
136
+ }
137
+ .CodeMirror-hscrollbar {
138
+ bottom: 0; left: 0;
139
+ overflow-y: hidden;
140
+ overflow-x: scroll;
141
+ }
142
+ .CodeMirror-scrollbar-filler {
143
+ right: 0; bottom: 0;
144
+ z-index: 6;
145
+ }
146
+
147
+ .CodeMirror-gutters {
148
+ position: absolute; left: 0; top: 0;
149
+ height: 100%;
150
+ padding-bottom: 30px;
151
+ z-index: 3;
152
+ }
153
+ .CodeMirror-gutter {
154
+ height: 100%;
155
+ padding-bottom: 30px;
156
+ margin-bottom: -32px;
157
+ display: inline-block;
158
+ /* Hack to make IE7 behave */
159
+ *zoom:1;
160
+ *display:inline;
161
+ }
162
+ .CodeMirror-gutter-elt {
163
+ position: absolute;
164
+ cursor: default;
165
+ z-index: 4;
166
+ }
167
+
168
+ .CodeMirror-lines {
169
+ cursor: text;
170
+ }
171
+ .CodeMirror pre {
172
+ /* Reset some styles that the rest of the page might have set */
173
+ -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
174
+ border-width: 0;
175
+ background: transparent;
176
+ font-family: inherit;
177
+ font-size: inherit;
178
+ margin: 0;
179
+ white-space: pre;
180
+ word-wrap: normal;
181
+ line-height: inherit;
182
+ color: inherit;
183
+ z-index: 2;
184
+ position: relative;
185
+ overflow: visible;
186
+ }
187
+ .CodeMirror-wrap pre {
188
+ word-wrap: break-word;
189
+ white-space: pre-wrap;
190
+ word-break: normal;
191
+ }
192
+ .CodeMirror-linebackground {
193
+ position: absolute;
194
+ left: 0; right: 0; top: 0; bottom: 0;
195
+ z-index: 0;
196
+ }
197
+
198
+ .CodeMirror-linewidget {
199
+ position: relative;
200
+ z-index: 2;
201
+ overflow: auto;
202
+ }
203
+
204
+ .CodeMirror-widget {
205
+ display: inline-block;
206
+ }
207
+
208
+ .CodeMirror-wrap .CodeMirror-scroll {
209
+ overflow-x: hidden;
210
+ }
211
+
212
+ .CodeMirror-measure {
213
+ position: absolute;
214
+ width: 100%; height: 0px;
215
+ overflow: hidden;
216
+ visibility: hidden;
217
+ }
218
+ .CodeMirror-measure pre { position: static; }
219
+
220
+ .CodeMirror div.CodeMirror-cursor {
221
+ position: absolute;
222
+ visibility: hidden;
223
+ border-right: none;
224
+ width: 0;
225
+ }
226
+ .CodeMirror-focused div.CodeMirror-cursor {
227
+ visibility: visible;
228
+ }
229
+
230
+ .CodeMirror-selected { background: #d9d9d9; }
231
+ .CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
232
+
233
+ .cm-searching {
234
+ background: #ffa;
235
+ background: rgba(255, 255, 0, .4);
236
+ }
237
+
238
+ /* IE7 hack to prevent it from returning funny offsetTops on the spans */
239
+ .CodeMirror span { *vertical-align: text-bottom; }
240
+
241
+ @media print {
242
+ /* Hide the cursor when printing */
243
+ .CodeMirror div.CodeMirror-cursor {
244
+ visibility: hidden;
245
+ }
246
+ }
data/lib/code_sync.rb ADDED
@@ -0,0 +1,41 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+
3
+ module CodeSync
4
+ require 'code_sync/version'
5
+ require 'code_sync/manager'
6
+ require 'code_sync/processors'
7
+
8
+ if defined?(Middleman)
9
+ require 'middleman_extension'
10
+ end
11
+
12
+ if defined?(::Rails)
13
+ require "code_sync/rails"
14
+ end
15
+
16
+ def self.gem_assets_root
17
+ File.join(File.dirname(__FILE__), '..')
18
+ end
19
+
20
+ end
21
+
22
+ # When using outside of Rails.
23
+ # Allows for using Rails asset pipline gems.
24
+ unless defined? ::Rails
25
+ module Rails
26
+ def self.version
27
+ "3.2.13"
28
+ end
29
+
30
+ def self.env
31
+ Class.new do
32
+ def test?
33
+ false
34
+ end
35
+ end.new
36
+ end
37
+
38
+ class Engine
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,73 @@
1
+ require 'thor'
2
+ require "thor/group"
3
+ require "pry"
4
+
5
+ module CodeSync
6
+ module Cli
7
+ class Base < Thor
8
+ class << self
9
+ def start(*args)
10
+ # Change flag to a module
11
+ ARGV.unshift("help") if ARGV.delete("--help")
12
+
13
+ # Default command is help
14
+ if ARGV[0] != "help" && (ARGV.length < 1 || ARGV.first.include?("-"))
15
+ ARGV.unshift("server")
16
+ end
17
+
18
+ super
19
+ end
20
+ end
21
+
22
+ desc "version", "Show version"
23
+ def version
24
+ require 'luca/version'
25
+ say "CodeSync #{CodeSync::Version}"
26
+ end
27
+
28
+ def help(meth = nil, subcommand = false)
29
+ if meth && !self.respond_to?(meth)
30
+ klass, task = Thor::Util.find_class_and_task_by_namespace("#{meth}:#{meth}")
31
+ klass.start(["-h", task].compact, :shell => self.shell)
32
+ else
33
+ list = []
34
+ Thor::Util.thor_classes_in(CodeSync::Cli).each do |klass|
35
+ list += klass.printable_tasks(false)
36
+ end
37
+ list.sort!{ |a,b| a[0] <=> b[0] }
38
+
39
+ shell.say "Tasks:"
40
+ shell.print_table(list, :ident => 2, :truncate => true)
41
+ shell.say
42
+ end
43
+ end
44
+
45
+ desc "start", "Starts the codesync project side server."
46
+ method_option :root, :default => Dir.pwd(), :required => false
47
+
48
+ def start
49
+ CodeSync::Manager.start(root: options[:root])
50
+ end
51
+
52
+ def method_missing(meth, *args)
53
+ meth = meth.to_s
54
+
55
+ if self.class.map.has_key?(meth)
56
+ meth = self.class.map[meth]
57
+ end
58
+
59
+ klass, task = Thor::Util.find_class_and_task_by_namespace("#{meth}:#{meth}")
60
+
61
+ if klass.nil?
62
+ super
63
+ else
64
+ args.unshift(task) if task
65
+ klass.start(args, :shell => self.shell)
66
+ end
67
+ end
68
+ end
69
+
70
+
71
+ end
72
+ end
73
+
@@ -0,0 +1,238 @@
1
+ require "code_sync/server"
2
+ require "code_sync/sprockets_adapter"
3
+ require "listen"
4
+ require "pty"
5
+
6
+ # In order to support the live-editing and immediate preview of
7
+ # of precompiled assets in the browser or in the developers IDE
8
+ # we need a background process that can integrate the file system
9
+ # watcher, sprockets compiler environment, and rack process server.
10
+ module CodeSync
11
+ class Manager
12
+
13
+ def self.start options={}
14
+ begin
15
+ manager = new(options)
16
+
17
+ cleanup_stale_processes
18
+
19
+ if options[:forked]
20
+ pid = fork do
21
+ manager.start
22
+ end
23
+
24
+ Process.detach(pid)
25
+ else
26
+ manager.start(options)
27
+ end
28
+ rescue
29
+ puts "Error Manager. #{ $! }"
30
+ ensure
31
+ puts "Clesning up finally"
32
+ cleanup_stale_processes
33
+ end
34
+ end
35
+
36
+ # FIXME:
37
+ # You know this aint right
38
+ def self.cleanup_stale_processes
39
+ PTY.spawn("ps aux |grep 'codesyn[c]'") do |stdin,stdout,pid|
40
+ stdin.each do |output|
41
+ if pid = output.split[1]
42
+ `kill -9 #{ pid }`
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ attr_accessor :sprockets, :server, :client_manager, :options, :processes, :process_map
49
+
50
+ def start options={}
51
+ if already_running?
52
+ puts "== Codesync is already running"
53
+ return
54
+ end
55
+
56
+ $0 = "codesync process: manager"
57
+
58
+ build_process_map
59
+
60
+ trap("SIGINT") do
61
+ exit_gracefully # :)
62
+ end
63
+
64
+
65
+ puts "== All CodeSync processes exited cleanly."
66
+ end
67
+
68
+ protected
69
+ def build_process_map
70
+ @process_map = processes.inject({}) do |memo,config|
71
+ name = config.first
72
+
73
+ memo[name] = pid = fork do
74
+ name, block = config
75
+
76
+ $0 = "codesync process: #{ name }"
77
+ block.call
78
+ end
79
+
80
+ memo
81
+ end
82
+
83
+ Process.waitall
84
+ end
85
+
86
+ def already_running?
87
+ test = `ps aux |grep "c[o]desync process: manager"`
88
+
89
+ test.match(/manager/)
90
+ end
91
+
92
+ def exit_gracefully
93
+ puts "EXIT"
94
+
95
+ yield if block_given?
96
+
97
+ puts "Didn't make it past yield"
98
+ puts "#{ process_map.inspect }"
99
+
100
+ process_map.each do |process_name,pid|
101
+ puts "Killing #{ process_name } #{pid}"
102
+
103
+ Process.kill(9,pid)
104
+ end
105
+ end
106
+
107
+ def initialize options={}
108
+ @options = options.freeze
109
+
110
+
111
+ create_server()
112
+
113
+ unless options[:disable_watcher]
114
+ puts "Listening for changes on the filesystem"
115
+ listen_for_changes_on_the_filesystem do |changed_assets|
116
+ changed_assets.each do |asset|
117
+ notify_clients_of_change_to(asset)
118
+ end
119
+ end
120
+ end
121
+
122
+ unless options[:enable_listener]
123
+ listen_for_changes_from_clients do |changed_assets|
124
+ end
125
+ end
126
+
127
+ unless options[:disable_internal_watch]
128
+ listen_for_changes_to_code_sync()
129
+ end
130
+ end
131
+
132
+ def create_server
133
+ @sprockets = SprocketsAdapter.new(root: root, sprockets: options[:sprockets])
134
+ @server = CodeSync::Server.new(assets: sprockets, root: root, forbid_saving: !!(options[:forbid_saving]) )
135
+
136
+ manage_child_process("server") do
137
+ server.start()
138
+ end
139
+ end
140
+
141
+ def notify_clients_of_change_to asset
142
+ payload = JSON.generate(asset)
143
+
144
+ puts "== Codesync detected change: #{ asset[:name] }"
145
+
146
+ EM.run do
147
+ pub = client.publish("/code-sync/outbound", asset)
148
+ pub.callback { EM.stop }
149
+ end
150
+ end
151
+
152
+ def client
153
+ @client = ::Faye::Client.new("http://localhost:9295/faye")
154
+ end
155
+
156
+ def listen_for_changes_from_clients &handler
157
+ manage_child_process("listener") do
158
+ EM.run do
159
+ client.subscribe("/code-sync/inbound") do |message|
160
+ puts "Received Code-Sync Inbound"
161
+ puts message.inspect
162
+ end
163
+ end
164
+ end
165
+ end
166
+
167
+ def listen_for_changes_to_code_sync &handler
168
+ manage_child_process("internal") do
169
+ internal.start
170
+ end
171
+ end
172
+
173
+ def listen_for_changes_on_the_filesystem &handler
174
+ manage_child_process("watcher") do
175
+ watcher.change do |modified,added,removed|
176
+ begin
177
+ handler.call process_changes_to(modified+added)
178
+ rescue
179
+ puts "Error handling changes: #{ $! }"
180
+ end
181
+ end
182
+
183
+ watcher.start
184
+ end
185
+ end
186
+
187
+ def manage_child_process name, &block
188
+ @processes ||= []
189
+ @processes << [name,block]
190
+ end
191
+
192
+ def process_changes_to assets
193
+ sprockets.process_changes_to(assets)
194
+ end
195
+
196
+ def root
197
+ base = options[:root] || options[:assets_directory] || Dir.pwd()
198
+ end
199
+
200
+ def internal
201
+ lib = File.dirname(__FILE__)
202
+ puts "Listening to #{ lib }"
203
+
204
+ @internal_watch = Listen.to( lib )
205
+ .filter(/.rb/)
206
+ .latency(1)
207
+ .change do
208
+ restart_everything!
209
+ end
210
+
211
+ @internal_watch
212
+ end
213
+
214
+ def restart_everything!
215
+
216
+ end
217
+
218
+ def watcher
219
+ if !@watcher
220
+ puts "Codesync watch is looking for assets in: #{ root }"
221
+ end
222
+
223
+ @watcher ||= Listen.to(root)
224
+ .filter(assets_filter)
225
+ .latency(1)
226
+ end
227
+
228
+ # TODO
229
+ # Provide for configurability
230
+ def assets_filter
231
+ /(\.coffee|\.css|\.jst|\.mustache\.js|\.sass)/
232
+ end
233
+
234
+ def method_missing meth, *args, &block
235
+ puts "Need to implement #{ meth }"
236
+ end
237
+ end
238
+ end