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,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