easycomments 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/.rspec +2 -0
- data/Gemfile +14 -0
- data/LICENSE +21 -0
- data/README.md +92 -0
- data/Rakefile +49 -0
- data/_config.yml +28 -0
- data/bin/ec +45 -0
- data/config.ru +12 -0
- data/dashboard.rb +57 -0
- data/easycomments.gemspec +22 -0
- data/ec.rb +43 -0
- data/lib/easycomments/ec_configuration.rb +42 -0
- data/lib/easycomments/ec_dashboard_model.rb +70 -0
- data/lib/easycomments/ec_model.rb +47 -0
- data/lib/easycomments.rb +14 -0
- data/public/bower.json +32 -0
- data/public/bower_components/core-a11y-keys/.bower.json +28 -0
- data/public/bower_components/core-a11y-keys/README.md +4 -0
- data/public/bower_components/core-a11y-keys/bower.json +18 -0
- data/public/bower_components/core-a11y-keys/core-a11y-keys.html +335 -0
- data/public/bower_components/core-a11y-keys/demo.html +41 -0
- data/public/bower_components/core-a11y-keys/index.html +22 -0
- data/public/bower_components/core-ajax/.bower.json +22 -0
- data/public/bower_components/core-ajax/README.md +4 -0
- data/public/bower_components/core-ajax/bower.json +11 -0
- data/public/bower_components/core-ajax/core-ajax.html +434 -0
- data/public/bower_components/core-ajax/core-xhr.html +116 -0
- data/public/bower_components/core-ajax/demo-progress.html +65 -0
- data/public/bower_components/core-ajax/demo.html +43 -0
- data/public/bower_components/core-ajax/index.html +22 -0
- data/public/bower_components/core-ajax/metadata.html +23 -0
- data/public/bower_components/core-ajax/test/core-ajax-progress.html +108 -0
- data/public/bower_components/core-ajax/test/core-ajax-race.html +81 -0
- data/public/bower_components/core-ajax/test/core-ajax.html +287 -0
- data/public/bower_components/core-ajax/test/index.html +17 -0
- data/public/bower_components/core-collapse/.bower.json +21 -0
- data/public/bower_components/core-collapse/README.md +4 -0
- data/public/bower_components/core-collapse/bower.json +11 -0
- data/public/bower_components/core-collapse/core-collapse.css +16 -0
- data/public/bower_components/core-collapse/core-collapse.html +298 -0
- data/public/bower_components/core-collapse/demo.html +75 -0
- data/public/bower_components/core-collapse/index.html +22 -0
- data/public/bower_components/core-collapse/test/basic.html +85 -0
- data/public/bower_components/core-collapse/test/index.html +24 -0
- data/public/bower_components/core-component-page/.bower.json +19 -0
- data/public/bower_components/core-component-page/README.md +6 -0
- data/public/bower_components/core-component-page/bowager-logo.png +0 -0
- data/public/bower_components/core-component-page/bower.json +9 -0
- data/public/bower_components/core-component-page/core-component-page.html +37 -0
- data/public/bower_components/core-component-page/demo.html +23 -0
- data/public/bower_components/core-component-page/index.html +22 -0
- data/public/bower_components/core-drawer-panel/.bower.json +19 -0
- data/public/bower_components/core-drawer-panel/README.md +4 -0
- data/public/bower_components/core-drawer-panel/bower.json +9 -0
- data/public/bower_components/core-drawer-panel/core-drawer-panel.css +160 -0
- data/public/bower_components/core-drawer-panel/core-drawer-panel.html +418 -0
- data/public/bower_components/core-drawer-panel/demo.html +68 -0
- data/public/bower_components/core-drawer-panel/index.html +22 -0
- data/public/bower_components/core-drawer-panel/metadata.html +37 -0
- data/public/bower_components/core-focusable/.bower.json +18 -0
- data/public/bower_components/core-focusable/README.md +6 -0
- data/public/bower_components/core-focusable/bower.json +8 -0
- data/public/bower_components/core-focusable/core-focusable.html +4 -0
- data/public/bower_components/core-focusable/core-focusable.js +134 -0
- data/public/bower_components/core-focusable/demo.html +109 -0
- data/public/bower_components/core-focusable/polymer-mixin.js +35 -0
- data/public/bower_components/core-header-panel/.bower.json +18 -0
- data/public/bower_components/core-header-panel/README.md +4 -0
- data/public/bower_components/core-header-panel/bower.json +8 -0
- data/public/bower_components/core-header-panel/core-header-panel.css +78 -0
- data/public/bower_components/core-header-panel/core-header-panel.html +277 -0
- data/public/bower_components/core-header-panel/demo.html +100 -0
- data/public/bower_components/core-header-panel/index.html +23 -0
- data/public/bower_components/core-header-panel/metadata.html +37 -0
- data/public/bower_components/core-icon/.bower.json +19 -0
- data/public/bower_components/core-icon/README.md +4 -0
- data/public/bower_components/core-icon/bower.json +9 -0
- data/public/bower_components/core-icon/core-icon.css +16 -0
- data/public/bower_components/core-icon/core-icon.html +201 -0
- data/public/bower_components/core-icon/demo.html +44 -0
- data/public/bower_components/core-icon/index.html +22 -0
- data/public/bower_components/core-icon/metadata.html +21 -0
- data/public/bower_components/core-icon-button/.bower.json +18 -0
- data/public/bower_components/core-icon-button/README.md +4 -0
- data/public/bower_components/core-icon-button/bower.json +8 -0
- data/public/bower_components/core-icon-button/core-icon-button.css +75 -0
- data/public/bower_components/core-icon-button/core-icon-button.html +81 -0
- data/public/bower_components/core-icon-button/demo.html +35 -0
- data/public/bower_components/core-icon-button/index.html +22 -0
- data/public/bower_components/core-icon-button/metadata.html +20 -0
- data/public/bower_components/core-icons/.bower.json +24 -0
- data/public/bower_components/core-icons/.gitignore +2 -0
- data/public/bower_components/core-icons/README.md +8 -0
- data/public/bower_components/core-icons/av-icons.html +65 -0
- data/public/bower_components/core-icons/bower.json +14 -0
- data/public/bower_components/core-icons/communication-icons.html +54 -0
- data/public/bower_components/core-icons/core-icons.html +278 -0
- data/public/bower_components/core-icons/demo.html +98 -0
- data/public/bower_components/core-icons/device-icons.html +90 -0
- data/public/bower_components/core-icons/editor-icons.html +67 -0
- data/public/bower_components/core-icons/hardware-icons.html +56 -0
- data/public/bower_components/core-icons/image-icons.html +152 -0
- data/public/bower_components/core-icons/index.html +22 -0
- data/public/bower_components/core-icons/maps-icons.html +70 -0
- data/public/bower_components/core-icons/notification-icons.html +49 -0
- data/public/bower_components/core-icons/social-icons.html +39 -0
- data/public/bower_components/core-iconset/.bower.json +20 -0
- data/public/bower_components/core-iconset/README.md +4 -0
- data/public/bower_components/core-iconset/bower.json +10 -0
- data/public/bower_components/core-iconset/core-iconset.html +241 -0
- data/public/bower_components/core-iconset/demo.html +62 -0
- data/public/bower_components/core-iconset/index.html +22 -0
- data/public/bower_components/core-iconset/my-icons-big.png +0 -0
- data/public/bower_components/core-iconset/my-icons.png +0 -0
- data/public/bower_components/core-iconset-svg/.bower.json +19 -0
- data/public/bower_components/core-iconset-svg/README.md +4 -0
- data/public/bower_components/core-iconset-svg/bower.json +9 -0
- data/public/bower_components/core-iconset-svg/core-iconset-svg.html +168 -0
- data/public/bower_components/core-iconset-svg/demo.html +66 -0
- data/public/bower_components/core-iconset-svg/index.html +22 -0
- data/public/bower_components/core-iconset-svg/svg-sample-icons.html +68 -0
- data/public/bower_components/core-input/.bower.json +20 -0
- data/public/bower_components/core-input/README.md +2 -0
- data/public/bower_components/core-input/bower.json +10 -0
- data/public/bower_components/core-input/core-input.css +41 -0
- data/public/bower_components/core-input/core-input.html +148 -0
- data/public/bower_components/core-input/demo.html +62 -0
- data/public/bower_components/core-input/index.html +22 -0
- data/public/bower_components/core-input/metadata.html +23 -0
- data/public/bower_components/core-input/test/a11y.html +55 -0
- data/public/bower_components/core-input/test/basic.html +60 -0
- data/public/bower_components/core-input/test/index.html +25 -0
- data/public/bower_components/core-item/.bower.json +19 -0
- data/public/bower_components/core-item/README.md +4 -0
- data/public/bower_components/core-item/bower.json +9 -0
- data/public/bower_components/core-item/core-item.css +45 -0
- data/public/bower_components/core-item/core-item.html +73 -0
- data/public/bower_components/core-item/demo.html +92 -0
- data/public/bower_components/core-item/index.html +22 -0
- data/public/bower_components/core-item/metadata.html +24 -0
- data/public/bower_components/core-media-query/.bower.json +18 -0
- data/public/bower_components/core-media-query/README.md +4 -0
- data/public/bower_components/core-media-query/bower.json +8 -0
- data/public/bower_components/core-media-query/core-media-query.html +87 -0
- data/public/bower_components/core-media-query/demo.html +44 -0
- data/public/bower_components/core-media-query/index.html +22 -0
- data/public/bower_components/core-menu/.bower.json +22 -0
- data/public/bower_components/core-menu/README.md +4 -0
- data/public/bower_components/core-menu/bower.json +11 -0
- data/public/bower_components/core-menu/core-menu.css +18 -0
- data/public/bower_components/core-menu/core-menu.html +73 -0
- data/public/bower_components/core-menu/core-submenu.css +43 -0
- data/public/bower_components/core-menu/core-submenu.html +126 -0
- data/public/bower_components/core-menu/demo.html +101 -0
- data/public/bower_components/core-menu/index.html +22 -0
- data/public/bower_components/core-menu/metadata.html +62 -0
- data/public/bower_components/core-meta/.bower.json +18 -0
- data/public/bower_components/core-meta/README.md +4 -0
- data/public/bower_components/core-meta/bower.json +8 -0
- data/public/bower_components/core-meta/core-meta.html +145 -0
- data/public/bower_components/core-meta/demo.html +58 -0
- data/public/bower_components/core-meta/index.html +22 -0
- data/public/bower_components/core-overlay/.bower.json +20 -0
- data/public/bower_components/core-overlay/README.md +4 -0
- data/public/bower_components/core-overlay/bower.json +10 -0
- data/public/bower_components/core-overlay/core-key-helper.html +22 -0
- data/public/bower_components/core-overlay/core-overlay-layer.html +116 -0
- data/public/bower_components/core-overlay/core-overlay.html +776 -0
- data/public/bower_components/core-overlay/demo.html +155 -0
- data/public/bower_components/core-overlay/gulpfile.js +2 -0
- data/public/bower_components/core-overlay/index.html +22 -0
- data/public/bower_components/core-overlay/tests/html/core-overlay-basic.html +127 -0
- data/public/bower_components/core-overlay/tests/html/core-overlay-positioning-margin.html +153 -0
- data/public/bower_components/core-overlay/tests/html/core-overlay-positioning.html +167 -0
- data/public/bower_components/core-overlay/tests/html/core-overlay-quick-close.html +45 -0
- data/public/bower_components/core-overlay/tests/html/core-overlay-scroll.html +130 -0
- data/public/bower_components/core-overlay/tests/js/htmltests.js +7 -0
- data/public/bower_components/core-overlay/tests/runner.html +14 -0
- data/public/bower_components/core-overlay/tests/tests.json +6 -0
- data/public/bower_components/core-pages/.bower.json +19 -0
- data/public/bower_components/core-pages/README.md +4 -0
- data/public/bower_components/core-pages/bower.json +8 -0
- data/public/bower_components/core-pages/core-pages.css +30 -0
- data/public/bower_components/core-pages/core-pages.html +44 -0
- data/public/bower_components/core-pages/demo.html +136 -0
- data/public/bower_components/core-pages/index.html +22 -0
- data/public/bower_components/core-pages/metadata.html +25 -0
- data/public/bower_components/core-resizable/.bower.json +18 -0
- data/public/bower_components/core-resizable/README.md +4 -0
- data/public/bower_components/core-resizable/bower.json +8 -0
- data/public/bower_components/core-resizable/core-resizable.html +248 -0
- data/public/bower_components/core-resizable/index.html +22 -0
- data/public/bower_components/core-resizable/test/basic.html +504 -0
- data/public/bower_components/core-resizable/test/index.html +16 -0
- data/public/bower_components/core-resizable/test/test-elements.html +66 -0
- data/public/bower_components/core-scaffold/.bower.json +22 -0
- data/public/bower_components/core-scaffold/README.md +4 -0
- data/public/bower_components/core-scaffold/bower.json +11 -0
- data/public/bower_components/core-scaffold/core-scaffold.html +252 -0
- data/public/bower_components/core-scaffold/demo.html +82 -0
- data/public/bower_components/core-scaffold/index.html +22 -0
- data/public/bower_components/core-scaffold/metadata.html +52 -0
- data/public/bower_components/core-selection/.bower.json +21 -0
- data/public/bower_components/core-selection/README.md +4 -0
- data/public/bower_components/core-selection/bower.json +11 -0
- data/public/bower_components/core-selection/core-selection.html +149 -0
- data/public/bower_components/core-selection/demo.html +59 -0
- data/public/bower_components/core-selection/index.html +22 -0
- data/public/bower_components/core-selection/test/basic.html +62 -0
- data/public/bower_components/core-selection/test/index.html +25 -0
- data/public/bower_components/core-selection/test/multi.html +63 -0
- data/public/bower_components/core-selector/.bower.json +22 -0
- data/public/bower_components/core-selector/.gitignore +2 -0
- data/public/bower_components/core-selector/README.md +4 -0
- data/public/bower_components/core-selector/bower.json +12 -0
- data/public/bower_components/core-selector/core-selector.html +548 -0
- data/public/bower_components/core-selector/demo.html +106 -0
- data/public/bower_components/core-selector/index.html +22 -0
- data/public/bower_components/core-selector/metadata.html +20 -0
- data/public/bower_components/core-selector/test/activate-event.html +63 -0
- data/public/bower_components/core-selector/test/basic.html +126 -0
- data/public/bower_components/core-selector/test/content.html +101 -0
- data/public/bower_components/core-selector/test/index.html +30 -0
- data/public/bower_components/core-selector/test/multi.html +115 -0
- data/public/bower_components/core-selector/test/next-previous.html +113 -0
- data/public/bower_components/core-selector/test/selected-attr-prop.html +62 -0
- data/public/bower_components/core-selector/test/template-repeat.html +63 -0
- data/public/bower_components/core-style/.bower.json +18 -0
- data/public/bower_components/core-style/README.md +4 -0
- data/public/bower_components/core-style/bower.json +8 -0
- data/public/bower_components/core-style/core-style.html +387 -0
- data/public/bower_components/core-style/demo.html +58 -0
- data/public/bower_components/core-style/elements.html +55 -0
- data/public/bower_components/core-style/index.html +22 -0
- data/public/bower_components/core-style/my-theme.html +73 -0
- data/public/bower_components/core-toolbar/.bower.json +19 -0
- data/public/bower_components/core-toolbar/README.md +4 -0
- data/public/bower_components/core-toolbar/bower.json +9 -0
- data/public/bower_components/core-toolbar/core-toolbar.css +117 -0
- data/public/bower_components/core-toolbar/core-toolbar.html +155 -0
- data/public/bower_components/core-toolbar/demo.html +119 -0
- data/public/bower_components/core-toolbar/index.html +22 -0
- data/public/bower_components/core-toolbar/metadata.html +28 -0
- data/public/bower_components/core-toolbar/test/basic.html +86 -0
- data/public/bower_components/core-toolbar/test/index.html +24 -0
- data/public/bower_components/core-transition/.bower.json +19 -0
- data/public/bower_components/core-transition/README.md +2 -0
- data/public/bower_components/core-transition/bower.json +9 -0
- data/public/bower_components/core-transition/core-transition-css.html +220 -0
- data/public/bower_components/core-transition/core-transition-overlay.css +46 -0
- data/public/bower_components/core-transition/core-transition.html +140 -0
- data/public/bower_components/core-transition/demo.html +87 -0
- data/public/bower_components/core-transition/index.html +22 -0
- data/public/bower_components/font-roboto/.bower.json +15 -0
- data/public/bower_components/font-roboto/roboto.html +9 -0
- data/public/bower_components/paper-button/.bower.json +27 -0
- data/public/bower_components/paper-button/README.md +4 -0
- data/public/bower_components/paper-button/bower.json +16 -0
- data/public/bower_components/paper-button/demo.html +157 -0
- data/public/bower_components/paper-button/index.html +22 -0
- data/public/bower_components/paper-button/metadata.html +17 -0
- data/public/bower_components/paper-button/paper-button-base.html +164 -0
- data/public/bower_components/paper-button/paper-button.html +197 -0
- data/public/bower_components/paper-button/test/index.html +24 -0
- data/public/bower_components/paper-button/test/paper-button.html +112 -0
- data/public/bower_components/paper-icon-button/.bower.json +25 -0
- data/public/bower_components/paper-icon-button/README.md +4 -0
- data/public/bower_components/paper-icon-button/bower.json +15 -0
- data/public/bower_components/paper-icon-button/demo.html +150 -0
- data/public/bower_components/paper-icon-button/index.html +22 -0
- data/public/bower_components/paper-icon-button/metadata.html +21 -0
- data/public/bower_components/paper-icon-button/paper-icon-button.html +154 -0
- data/public/bower_components/paper-icon-button/test/a11y.html +68 -0
- data/public/bower_components/paper-icon-button/test/basic.html +50 -0
- data/public/bower_components/paper-icon-button/test/index.html +25 -0
- data/public/bower_components/paper-input/.bower.json +26 -0
- data/public/bower_components/paper-input/.gitignore +1 -0
- data/public/bower_components/paper-input/README.md +4 -0
- data/public/bower_components/paper-input/bower.json +15 -0
- data/public/bower_components/paper-input/demo.html +236 -0
- data/public/bower_components/paper-input/index.html +22 -0
- data/public/bower_components/paper-input/metadata.html +20 -0
- data/public/bower_components/paper-input/paper-autogrow-textarea.html +162 -0
- data/public/bower_components/paper-input/paper-char-counter.html +121 -0
- data/public/bower_components/paper-input/paper-input-decorator.css +132 -0
- data/public/bower_components/paper-input/paper-input-decorator.html +547 -0
- data/public/bower_components/paper-input/paper-input.html +145 -0
- data/public/bower_components/paper-input/test/index.html +26 -0
- data/public/bower_components/paper-input/test/paper-autogrow-textarea.html +146 -0
- data/public/bower_components/paper-input/test/paper-input-decorator.html +240 -0
- data/public/bower_components/paper-input/test/paper-input.html +68 -0
- data/public/bower_components/paper-input/test/util.js +15 -0
- data/public/bower_components/paper-radio-button/.bower.json +22 -0
- data/public/bower_components/paper-radio-button/README.md +4 -0
- data/public/bower_components/paper-radio-button/bower.json +12 -0
- data/public/bower_components/paper-radio-button/demo.html +84 -0
- data/public/bower_components/paper-radio-button/index.html +22 -0
- data/public/bower_components/paper-radio-button/metadata.html +17 -0
- data/public/bower_components/paper-radio-button/paper-radio-button.css +108 -0
- data/public/bower_components/paper-radio-button/paper-radio-button.html +166 -0
- data/public/bower_components/paper-ripple/.bower.json +23 -0
- data/public/bower_components/paper-ripple/README.md +4 -0
- data/public/bower_components/paper-ripple/bower.json +13 -0
- data/public/bower_components/paper-ripple/demo.html +414 -0
- data/public/bower_components/paper-ripple/index.html +22 -0
- data/public/bower_components/paper-ripple/metadata.html +20 -0
- data/public/bower_components/paper-ripple/paper-ripple.html +477 -0
- data/public/bower_components/paper-ripple/test/index.html +24 -0
- data/public/bower_components/paper-ripple/test/position.html +109 -0
- data/public/bower_components/paper-shadow/.bower.json +22 -0
- data/public/bower_components/paper-shadow/README.md +4 -0
- data/public/bower_components/paper-shadow/bower.json +11 -0
- data/public/bower_components/paper-shadow/demo.html +134 -0
- data/public/bower_components/paper-shadow/index.html +22 -0
- data/public/bower_components/paper-shadow/metadata.html +17 -0
- data/public/bower_components/paper-shadow/paper-shadow.css +66 -0
- data/public/bower_components/paper-shadow/paper-shadow.html +86 -0
- data/public/bower_components/paper-shadow/test/basic.html +62 -0
- data/public/bower_components/paper-shadow/test/index.html +24 -0
- data/public/bower_components/paper-tabs/.bower.json +26 -0
- data/public/bower_components/paper-tabs/README.md +4 -0
- data/public/bower_components/paper-tabs/bower.json +15 -0
- data/public/bower_components/paper-tabs/demo.html +242 -0
- data/public/bower_components/paper-tabs/index.html +22 -0
- data/public/bower_components/paper-tabs/metadata.html +58 -0
- data/public/bower_components/paper-tabs/paper-tab.css +59 -0
- data/public/bower_components/paper-tabs/paper-tab.html +82 -0
- data/public/bower_components/paper-tabs/paper-tabs.css +80 -0
- data/public/bower_components/paper-tabs/paper-tabs.html +353 -0
- data/public/bower_components/paper-toast/.bower.json +22 -0
- data/public/bower_components/paper-toast/README.md +4 -0
- data/public/bower_components/paper-toast/bower.json +11 -0
- data/public/bower_components/paper-toast/demo.html +63 -0
- data/public/bower_components/paper-toast/index.html +22 -0
- data/public/bower_components/paper-toast/metadata.html +20 -0
- data/public/bower_components/paper-toast/paper-toast.css +80 -0
- data/public/bower_components/paper-toast/paper-toast.html +296 -0
- data/public/bower_components/paper-toggle-button/.bower.json +20 -0
- data/public/bower_components/paper-toggle-button/README.md +4 -0
- data/public/bower_components/paper-toggle-button/bower.json +9 -0
- data/public/bower_components/paper-toggle-button/demo.html +97 -0
- data/public/bower_components/paper-toggle-button/index.html +22 -0
- data/public/bower_components/paper-toggle-button/metadata.html +17 -0
- data/public/bower_components/paper-toggle-button/paper-toggle-button.css +95 -0
- data/public/bower_components/paper-toggle-button/paper-toggle-button.html +179 -0
- data/public/bower_components/polymer/.bower.json +32 -0
- data/public/bower_components/polymer/README.md +21 -0
- data/public/bower_components/polymer/bower.json +23 -0
- data/public/bower_components/polymer/build.log +26 -0
- data/public/bower_components/polymer/layout.html +286 -0
- data/public/bower_components/polymer/polymer.html +12 -0
- data/public/bower_components/polymer/polymer.js +11859 -0
- data/public/bower_components/polymer/polymer.min.js +14 -0
- data/public/bower_components/webcomponentsjs/.bower.json +23 -0
- data/public/bower_components/webcomponentsjs/CustomElements.js +634 -0
- data/public/bower_components/webcomponentsjs/CustomElements.min.js +11 -0
- data/public/bower_components/webcomponentsjs/HTMLImports.js +764 -0
- data/public/bower_components/webcomponentsjs/HTMLImports.min.js +11 -0
- data/public/bower_components/webcomponentsjs/README.md +73 -0
- data/public/bower_components/webcomponentsjs/ShadowDOM.js +4277 -0
- data/public/bower_components/webcomponentsjs/ShadowDOM.min.js +13 -0
- data/public/bower_components/webcomponentsjs/bower.json +14 -0
- data/public/bower_components/webcomponentsjs/build.log +31 -0
- data/public/bower_components/webcomponentsjs/package.json +31 -0
- data/public/bower_components/webcomponentsjs/webcomponents-lite.js +1728 -0
- data/public/bower_components/webcomponentsjs/webcomponents-lite.min.js +11 -0
- data/public/bower_components/webcomponentsjs/webcomponents.js +6114 -0
- data/public/bower_components/webcomponentsjs/webcomponents.min.js +14 -0
- data/public/css/main.css +41 -0
- data/public/elements/ec-dashboard/ec-dashboard.html +269 -0
- data/public/polymer-loader.html +24 -0
- data/public/polymer-loader.vulcanized.html +19 -0
- data/spec/ec/ec_dashboard_spec.rb +78 -0
- data/spec/ec/ec_spec.rb +78 -0
- data/spec/spec_helper.rb +27 -0
- data/views/index.html +88 -0
- metadata +464 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a75da80c881fc020f2f5bb5aadb4a2402669e9bf
|
4
|
+
data.tar.gz: 17b46c901e56b0f9d950b746c807858d18f0c56c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 79d4b7adc8a9148d2874fb0abf00cd6d2af6ceaa937230df218d38f4a997837b97a9a50a61c9ed6ac5c0397133abc8dc7a819709ed0f5de4337afaebb8d01351
|
7
|
+
data.tar.gz: 54a4acaea68bc66e7ce58521e3a49c495bba55414e994b95a2009c3b9a652fa0758cc95dc37da024ddde2896c322403614af1c346e068a32d92791fa676cdf4a
|
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Gemfile.lock
|
data/.rspec
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) <2015> <Zisis Maras - zisismaras@gmail.com>
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
# EasyComments
|
2
|
+
EasyComments(EC) is an easy to use comment system with a simple api
|
3
|
+
for posting and retrieving comments.It also comes bundled with a dashboard
|
4
|
+
for moderating your comments.
|
5
|
+
|
6
|
+
##Installing
|
7
|
+
Install by cloning the repository or for convenience install the gem
|
8
|
+
```ruby
|
9
|
+
gem install easycomments
|
10
|
+
```
|
11
|
+
and then(if you installed the gem) in a directory run
|
12
|
+
```ruby
|
13
|
+
ec install
|
14
|
+
```
|
15
|
+
(pass the --dev flag if you also want the spec suite)
|
16
|
+
|
17
|
+
##Configuring
|
18
|
+
Edit _config.yml and add your database (all adapters supported by sequel can be used)
|
19
|
+
and change any other option you need.
|
20
|
+
Then run
|
21
|
+
```ruby
|
22
|
+
rake init
|
23
|
+
```
|
24
|
+
to build the table and then
|
25
|
+
```ruby
|
26
|
+
rake adduser
|
27
|
+
```
|
28
|
+
to add your user.
|
29
|
+
|
30
|
+
##Endpoints
|
31
|
+
EC has one endpoint for posting a new comment and one for retrieving a comment list.
|
32
|
+
```
|
33
|
+
GET /comments, with a 'post' parameter
|
34
|
+
```
|
35
|
+
The 'post' parameter simply serves as a namespace to group comments for retrieval,
|
36
|
+
it can be a blog post title, an url or something more sophisticated, it's up to you.
|
37
|
+
|
38
|
+
```
|
39
|
+
POST /comment, with parameters : post, name, email, body
|
40
|
+
```
|
41
|
+
Example client can be found here : [easycomments-polymer](https://github.com/zisismaras/easycomments-polymer)
|
42
|
+
|
43
|
+
##Dashboard
|
44
|
+
EC comes bundled with a dashboard (can be accessed at /dashboard) to moderate your
|
45
|
+
comments like approving, deleting, editing or ignoring.
|
46
|
+
It's build with [polymer](https://www.polymer-project.org) and [webcomponents](http://webcomponents.org/)
|
47
|
+
|
48
|
+
##Configuration options
|
49
|
+
in _config.yml you can change the following
|
50
|
+
```ruby
|
51
|
+
#database connection url to be passed to sequel's connect method.
|
52
|
+
#check http://sequel.jeremyevans.net/rdoc/files/doc/opening_databases_rdoc.html
|
53
|
+
#all adapters supported by sequel can be used
|
54
|
+
connection: "sqlite://blog.db"
|
55
|
+
|
56
|
+
#set to true to allow all coments to be posted without moderation.
|
57
|
+
approve_by_default: false
|
58
|
+
|
59
|
+
#set to true to allow comments without a name.
|
60
|
+
allow_anonymous_post: false
|
61
|
+
|
62
|
+
#datetime format to be passed to strftime.
|
63
|
+
#see availabe options here http://ruby-doc.org/core-2.2.1/Time.html#method-i-strftime
|
64
|
+
timestamp_format: "%d/%m/%Y - %H:%M"
|
65
|
+
|
66
|
+
#set to true to enable cross-origin resource sharing.
|
67
|
+
allow_cors: false
|
68
|
+
|
69
|
+
#see available formats here https://github.com/cyu/rack-cors
|
70
|
+
cors_origin: "*"
|
71
|
+
```
|
72
|
+
|
73
|
+
## Updating
|
74
|
+
If you installed easycomments as a gem there is a 'ec update' command.
|
75
|
+
It will recopy all the files but keeps your _config.yml and Gemfile.
|
76
|
+
(--dev flag is available to also copy the spec suite)
|
77
|
+
|
78
|
+
## Rake tasks
|
79
|
+
'rake init' creates the required table.
|
80
|
+
'rake update' run it after re-editing _config.yml to update the table.
|
81
|
+
'rake adduser' you should always run this and not adding new users in _config.yml
|
82
|
+
by hand since it also bcypts your passwords!
|
83
|
+
|
84
|
+
## Contributing
|
85
|
+
1. Fork it
|
86
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
87
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
88
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
89
|
+
5. Create new Pull Request
|
90
|
+
|
91
|
+
###Licensed under MIT.
|
92
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
require "sequel"
|
2
|
+
require 'io/console'
|
3
|
+
require 'bcrypt'
|
4
|
+
require_relative "lib/easycomments/ec_configuration.rb"
|
5
|
+
|
6
|
+
include Configuration
|
7
|
+
|
8
|
+
DB = Sequel.connect(CONNECTION)
|
9
|
+
|
10
|
+
desc "Initializes EasyComments database"
|
11
|
+
task :init do
|
12
|
+
DB.create_table :comments do
|
13
|
+
primary_key :id
|
14
|
+
String :name
|
15
|
+
String :email
|
16
|
+
String :post
|
17
|
+
String :body
|
18
|
+
TrueClass :approved, :default=>APPROVE_BY_DEFAULT
|
19
|
+
TrueClass :action_taken, :default=>false
|
20
|
+
DateTime :timestamp
|
21
|
+
end
|
22
|
+
puts "EasyComments database initialized."
|
23
|
+
end
|
24
|
+
|
25
|
+
desc "Updates EasyComments database."
|
26
|
+
task :update do
|
27
|
+
DB.alter_table(:comments) do
|
28
|
+
set_column_default :approved, APPROVE_BY_DEFAULT
|
29
|
+
end
|
30
|
+
puts "EasyComments database updated."
|
31
|
+
end
|
32
|
+
|
33
|
+
desc "Create a new user."
|
34
|
+
task :adduser do
|
35
|
+
print "Username: "
|
36
|
+
username = STDIN.gets.chomp
|
37
|
+
print "Password for #{username}: "
|
38
|
+
password = STDIN.noecho(&:gets).chomp
|
39
|
+
bcrypt_password = BCrypt::Password.create(password)
|
40
|
+
conf = CONFIG
|
41
|
+
if conf[:users].nil?
|
42
|
+
conf.merge!({:users => {username => bcrypt_password}})
|
43
|
+
else
|
44
|
+
conf[:users].merge!({username => bcrypt_password})
|
45
|
+
end
|
46
|
+
File.open("_config.yml", 'w') { |f| YAML.dump(conf, f) }
|
47
|
+
File.open("_config.yml", 'a') { |f| f.write(comment_wall) }
|
48
|
+
puts "\nNew user added."
|
49
|
+
end
|
data/_config.yml
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
---
|
2
|
+
connection: "sqlite://blog.db"
|
3
|
+
approve_by_default: false
|
4
|
+
allow_anonymous_post: false
|
5
|
+
timestamp_format: "%d/%m/%Y - %H:%M"
|
6
|
+
allow_cors: false
|
7
|
+
cors_origin: "*"
|
8
|
+
:users:
|
9
|
+
#
|
10
|
+
##connection : database connection url to be passed to sequel's connect method.
|
11
|
+
##check http://sequel.jeremyevans.net/rdoc/files/doc/opening_databases_rdoc.html
|
12
|
+
##all adapters supported by sequel can be used
|
13
|
+
#
|
14
|
+
##approve_by_default : set to true to allow all coments to be posted without moderation.
|
15
|
+
#
|
16
|
+
##allow_anonymous_post : set to true to allow comments without a name.
|
17
|
+
#
|
18
|
+
##timestamp_format : datetime format to be passed to strftime.
|
19
|
+
##see availabe options here http://ruby-doc.org/core-2.2.1/Time.html#method-i-strftime
|
20
|
+
#
|
21
|
+
##allow_cors : set to true to enable cross-origin resource sharing.
|
22
|
+
#
|
23
|
+
##cors_origin : see available formats here https://github.com/cyu/rack-cors
|
24
|
+
#
|
25
|
+
##users : do not edit this by hand use 'rake adduser' instead.
|
26
|
+
#
|
27
|
+
##if you edit this file after 'rake init' use 'rake update' for the changes to take effect.
|
28
|
+
#
|
data/bin/ec
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#encoding: utf-8
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
local_path = File.expand_path("../../", __FILE__)
|
6
|
+
users_path = Dir.pwd
|
7
|
+
|
8
|
+
files = %w(ec.rb dashboard.rb config.ru _config.yml Rakefile Gemfile)
|
9
|
+
|
10
|
+
def copy_files(local_path, users_path, files, dev=false)
|
11
|
+
files.each do |filename|
|
12
|
+
FileUtils.cp_r local_path + '/' + filename, users_path, :verbose => true
|
13
|
+
end
|
14
|
+
FileUtils.cp_r local_path + "/lib", users_path, :verbose => true
|
15
|
+
FileUtils.cp_r local_path + "/public", users_path, :verbose => true
|
16
|
+
FileUtils.cp_r local_path + "/views", users_path, :verbose => true
|
17
|
+
if dev
|
18
|
+
FileUtils.cp_r local_path + "/spec", users_path, :verbose => true
|
19
|
+
FileUtils.cp_r local_path + '/.rspec', users_path, :verbose => true
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
if ARGV[0] == 'install'
|
24
|
+
if ARGV[1] == '--dev'
|
25
|
+
copy_files(local_path, users_path, files, true)
|
26
|
+
else
|
27
|
+
copy_files(local_path, users_path, files)
|
28
|
+
end
|
29
|
+
puts "done!"
|
30
|
+
elsif ARGV[0] == 'update'
|
31
|
+
files.delete("_config.yml")
|
32
|
+
files.delete("Gemfile")
|
33
|
+
if ARGV[1] == '--dev'
|
34
|
+
copy_files(local_path, users_path, files, true)
|
35
|
+
else
|
36
|
+
copy_files(local_path, users_path, files)
|
37
|
+
end
|
38
|
+
puts "done!"
|
39
|
+
end
|
40
|
+
|
41
|
+
if ARGV[0] == '--help' || ARGV[0] == '-h' || ARGV[0].nil?
|
42
|
+
puts 'ec install, copies all the required files in the current directory.'
|
43
|
+
puts 'ec update, same as install but skips _config.yml and Gemfile.'
|
44
|
+
puts 'pass the --dev flag to "ec install" or "ec update" to also copy the test suite.'
|
45
|
+
end
|
data/config.ru
ADDED
data/dashboard.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
require_relative "lib/easycomments.rb"
|
2
|
+
require_relative "lib/easycomments/ec_dashboard_model.rb"
|
3
|
+
|
4
|
+
class ECDashboard < Sinatra::Application
|
5
|
+
|
6
|
+
include ECDashboardModel
|
7
|
+
|
8
|
+
before do
|
9
|
+
content_type 'application/json'
|
10
|
+
end
|
11
|
+
|
12
|
+
get "/" do
|
13
|
+
content_type 'text/html'
|
14
|
+
send_file 'views/index.html'
|
15
|
+
end
|
16
|
+
|
17
|
+
post '/login' do
|
18
|
+
authenticate(params[:username], params[:password])
|
19
|
+
end
|
20
|
+
|
21
|
+
get "/comments" do
|
22
|
+
get_comments(params[:post])
|
23
|
+
end
|
24
|
+
|
25
|
+
get '/get_all_posts' do
|
26
|
+
get_all_posts
|
27
|
+
end
|
28
|
+
|
29
|
+
post '/edit_comment' do
|
30
|
+
edit_comment(params[:id], params[:new_body])
|
31
|
+
end
|
32
|
+
|
33
|
+
post '/remove_comment' do
|
34
|
+
remove_comment(params[:id])
|
35
|
+
end
|
36
|
+
|
37
|
+
post '/change_approval_status' do
|
38
|
+
comment_change_approval(params[:id])
|
39
|
+
end
|
40
|
+
|
41
|
+
get '/get_total_pending' do
|
42
|
+
get_total_pending
|
43
|
+
end
|
44
|
+
|
45
|
+
get '/get_posts_with_pending' do
|
46
|
+
get_posts_with_pending
|
47
|
+
end
|
48
|
+
|
49
|
+
get '/get_pending_comments' do
|
50
|
+
get_pending_comments(params[:post])
|
51
|
+
end
|
52
|
+
|
53
|
+
post '/ignore_comment' do
|
54
|
+
ignore_comment(params[:id])
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'easycomments'
|
3
|
+
s.version = '1.0.1'
|
4
|
+
s.date = '2015-03-30'
|
5
|
+
s.summary = "Simple and easy to use comment system"
|
6
|
+
s.description = <<EOF
|
7
|
+
EasyComments(EC) is an easy to use comment system with a simple api
|
8
|
+
for posting and retrieving comments.It also comes bundled with a dashboard
|
9
|
+
for moderating your comments.
|
10
|
+
EOF
|
11
|
+
|
12
|
+
s.files = `git ls-files`.split("\n")
|
13
|
+
s.executables << 'ec'
|
14
|
+
|
15
|
+
s.add_development_dependency 'airborne', '~> 0.1', '>=0.1.15'
|
16
|
+
s.add_development_dependency "rake", '~> 10.4', '>= 10.4.2'
|
17
|
+
|
18
|
+
s.authors = ["Zisis Maras"]
|
19
|
+
s.email = 'zisismaras@gmail.com'
|
20
|
+
s.homepage = 'https://github.com/zisismaras/easycomments'
|
21
|
+
s.license = 'MIT'
|
22
|
+
end
|
data/ec.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require_relative "lib/easycomments.rb"
|
2
|
+
require_relative "lib/easycomments/ec_model.rb"
|
3
|
+
|
4
|
+
class EC < Sinatra::Application
|
5
|
+
|
6
|
+
include ECModel
|
7
|
+
|
8
|
+
before do
|
9
|
+
content_type 'application/json'
|
10
|
+
end
|
11
|
+
|
12
|
+
if ALLOW_CORS
|
13
|
+
use Rack::Cors do
|
14
|
+
allow do
|
15
|
+
origins CORS_ORIGIN
|
16
|
+
resource '/comments', :headers => :any, :methods => :get
|
17
|
+
resource '/comment', :headers => :any, :methods => :post
|
18
|
+
end
|
19
|
+
end
|
20
|
+
use Rack::Protection::FrameOptions
|
21
|
+
use Rack::Protection::PathTraversal
|
22
|
+
use Rack::Protection::IPSpoofing
|
23
|
+
else
|
24
|
+
use Rack::Protection::FrameOptions
|
25
|
+
use Rack::Protection::PathTraversal
|
26
|
+
use Rack::Protection::IPSpoofing
|
27
|
+
use Rack::Protection::HttpOrigin
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
get "/comments" do
|
32
|
+
get_comments(params[:post])
|
33
|
+
end
|
34
|
+
|
35
|
+
post "/comment" do
|
36
|
+
post_comment(params)
|
37
|
+
end
|
38
|
+
|
39
|
+
get "/" do
|
40
|
+
redirect "/dashboard"
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Configuration
|
4
|
+
|
5
|
+
extend self
|
6
|
+
|
7
|
+
CONFIG = YAML.load_file('_config.yml')
|
8
|
+
CONNECTION = CONFIG["connection"]
|
9
|
+
APPROVE_BY_DEFAULT = CONFIG["approve_by_default"]
|
10
|
+
ALLOW_ANONYMOUS_POST = CONFIG["allow_anonymous_post"]
|
11
|
+
TIMESTAMP_FORMAT = CONFIG["timestamp_format"]
|
12
|
+
USERNAME = CONFIG["username"]
|
13
|
+
PASSWORD = CONFIG["password"]
|
14
|
+
ALLOW_CORS = CONFIG["allow_cors"]
|
15
|
+
CORS_ORIGIN = CONFIG["cors_origin"]
|
16
|
+
|
17
|
+
#wall of help text to be added in _config.yml
|
18
|
+
def comment_wall
|
19
|
+
comments = <<COMMENTS
|
20
|
+
#
|
21
|
+
##connection : database connection url to be passed to sequel's connect method.
|
22
|
+
##check http://sequel.jeremyevans.net/rdoc/files/doc/opening_databases_rdoc.html
|
23
|
+
##all adapters supported by sequel can be used
|
24
|
+
#
|
25
|
+
##approve_by_default : set to true to allow all coments to be posted without moderation.
|
26
|
+
#
|
27
|
+
##allow_anonymous_post : set to true to allow comments without a name.
|
28
|
+
#
|
29
|
+
##timestamp_format : datetime format to be passed to strftime.
|
30
|
+
##see availabe options here http://ruby-doc.org/core-2.2.1/Time.html#method-i-strftime
|
31
|
+
#
|
32
|
+
##allow_cors : set to true to enable cross-origin resource sharing.
|
33
|
+
#
|
34
|
+
##cors_origin : see available formats here https://github.com/cyu/rack-cors
|
35
|
+
#
|
36
|
+
##users : do not edit this by hand use 'rake adduser' instead.
|
37
|
+
#
|
38
|
+
##if you edit this file after 'rake init' use 'rake update' for the changes to take effect.
|
39
|
+
#
|
40
|
+
COMMENTS
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require_relative "../easycomments.rb"
|
2
|
+
|
3
|
+
module ECDashboardModel
|
4
|
+
extend self
|
5
|
+
|
6
|
+
def get_comments(post)
|
7
|
+
comments = DB[:comments].where(:post => post).all.sort_by{|comment| comment[:id].to_i}.reverse #show latest comment first
|
8
|
+
comments = comments.each{|comment| comment[:timestamp] = comment[:timestamp].strftime(TIMESTAMP_FORMAT)}
|
9
|
+
MultiJson.dump({:comments => comments})
|
10
|
+
end
|
11
|
+
|
12
|
+
def get_all_posts
|
13
|
+
MultiJson.dump({:posts => DB[:comments].map(:post).uniq})
|
14
|
+
end
|
15
|
+
|
16
|
+
def edit_comment(id, new_body)
|
17
|
+
DB[:comments].where(:id => id).update(:body => new_body, :action_taken => true)
|
18
|
+
MultiJson.dump({:status => "Comment successfully edited."})
|
19
|
+
end
|
20
|
+
|
21
|
+
def remove_comment(id)
|
22
|
+
DB[:comments].where(:id => id).delete
|
23
|
+
MultiJson.dump({:status => "Comment successfully removed."})
|
24
|
+
end
|
25
|
+
|
26
|
+
def comment_change_approval(id)
|
27
|
+
comment = DB[:comments].where(:id => id).all.first
|
28
|
+
DB[:comments].where(:id => id).update(:approved => !comment[:approved], :action_taken => true)
|
29
|
+
MultiJson.dump({:status => "Approval status successfully changed."})
|
30
|
+
end
|
31
|
+
|
32
|
+
def get_total_pending
|
33
|
+
pending = DB[:comments].where(:action_taken => false).all.count
|
34
|
+
MultiJson.dump({:pending => pending})
|
35
|
+
end
|
36
|
+
|
37
|
+
def get_posts_with_pending
|
38
|
+
pending =[]
|
39
|
+
posts = DB[:comments].where(:action_taken => false).map(:post).uniq
|
40
|
+
posts.each do |post|
|
41
|
+
pending.push({:post => post, :pending => DB[:comments].where(:post => post, :action_taken => false).count})
|
42
|
+
end
|
43
|
+
MultiJson.dump({:pending => pending})
|
44
|
+
end
|
45
|
+
|
46
|
+
def get_pending_comments(post)
|
47
|
+
comments = DB[:comments].where(:post => post, :action_taken => false).all.sort_by{|comment| comment[:id].to_i}.reverse #show latest comment first
|
48
|
+
comments = comments.each{|comment| comment[:timestamp] = comment[:timestamp].strftime(TIMESTAMP_FORMAT)}
|
49
|
+
MultiJson.dump({:comments => comments})
|
50
|
+
end
|
51
|
+
|
52
|
+
def ignore_comment(id)
|
53
|
+
comment = DB[:comments].where(:id => id).all.first
|
54
|
+
DB[:comments].where(:id => id).update(:action_taken => true)
|
55
|
+
MultiJson.dump({:status => "Comment successfully ignored."})
|
56
|
+
end
|
57
|
+
|
58
|
+
def authenticate(username, password)
|
59
|
+
access = {}
|
60
|
+
CONFIG[:users].each_pair do |u, p|
|
61
|
+
if username == u && BCrypt::Password.new(p) == password
|
62
|
+
access = {:has_access => true}
|
63
|
+
else
|
64
|
+
access = {:has_access => false}
|
65
|
+
end
|
66
|
+
end
|
67
|
+
MultiJson.dump(access)
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require_relative "../easycomments.rb"
|
2
|
+
|
3
|
+
module ECModel
|
4
|
+
|
5
|
+
extend self
|
6
|
+
|
7
|
+
def post_comment(comment)
|
8
|
+
if comment[:body] != "undefined" && comment[:body] != ""
|
9
|
+
if ALLOW_ANONYMOUS_POST
|
10
|
+
comment[:name] = "Anonymous" if comment[:name] == "undefined" || comment[:name] == ""
|
11
|
+
comment[:email] = "no_email" if comment[:email] == "undefined" || comment[:email] == ""
|
12
|
+
save_comment(comment)
|
13
|
+
elsif comment[:name] == "Anonymous" || comment[:name] == "undefined" || comment[:name] == ""
|
14
|
+
MultiJson.dump({:status => "Error : no name provided."})
|
15
|
+
else
|
16
|
+
save_comment(comment)
|
17
|
+
end
|
18
|
+
else
|
19
|
+
MultiJson.dump({:status => "Error : no comment provided."})
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def get_comments(post)
|
24
|
+
comments = DB[:comments].where(:post => post, :approved => true).all.sort_by{|comment| comment[:id].to_i}.reverse #show latest comment first
|
25
|
+
comments = comments.each{|comment| comment[:timestamp] = comment[:timestamp].strftime(TIMESTAMP_FORMAT)}
|
26
|
+
MultiJson.dump({:comments => comments})
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
def escape_comment(comment)
|
31
|
+
comment[:name] = Rack::Utils.escape_html(comment[:name])
|
32
|
+
comment[:email] = Rack::Utils.escape_html(comment[:email])
|
33
|
+
comment[:body] = Rack::Utils.escape_html(comment[:body])
|
34
|
+
comment
|
35
|
+
end
|
36
|
+
|
37
|
+
def save_comment(comment)
|
38
|
+
comment = escape_comment(comment)
|
39
|
+
DB[:comments].insert(:post => comment[:post],
|
40
|
+
:name => comment[:name],
|
41
|
+
:email => comment[:email],
|
42
|
+
:body => comment[:body],
|
43
|
+
:timestamp => Time.now
|
44
|
+
)
|
45
|
+
MultiJson.dump({:status => "New comment posted."})
|
46
|
+
end
|
47
|
+
end
|
data/lib/easycomments.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require "sinatra/base"
|
2
|
+
require "multi_json"
|
3
|
+
require "sequel"
|
4
|
+
require 'rack/cors'
|
5
|
+
require 'rack/utils'
|
6
|
+
require 'rack/protection'
|
7
|
+
require 'bcrypt'
|
8
|
+
require_relative "easycomments/ec_configuration.rb"
|
9
|
+
|
10
|
+
VERSION = "1.0.1"
|
11
|
+
|
12
|
+
include Configuration
|
13
|
+
|
14
|
+
DB = Sequel.connect(CONNECTION)
|
data/public/bower.json
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
{
|
2
|
+
"name": "easycomments_dashboard",
|
3
|
+
"version": "1.0.0",
|
4
|
+
"authors": [
|
5
|
+
"Zisis Maras <zisismaras@gmail.com>"
|
6
|
+
],
|
7
|
+
"main": "index.html",
|
8
|
+
"license": "MIT",
|
9
|
+
"ignore": [
|
10
|
+
"**/.*",
|
11
|
+
"node_modules",
|
12
|
+
"bower_components",
|
13
|
+
"test",
|
14
|
+
"tests"
|
15
|
+
],
|
16
|
+
"dependencies": {
|
17
|
+
"polymer": "Polymer/polymer#~0.5.5",
|
18
|
+
"paper-shadow": "Polymer/paper-shadow#~0.5.5",
|
19
|
+
"font-roboto": "Polymer/font-roboto#~0.5.5",
|
20
|
+
"paper-button": "Polymer/paper-button#~0.5.5",
|
21
|
+
"paper-input": "Polymer/paper-input#~0.5.5",
|
22
|
+
"core-scaffold": "Polymer/core-scaffold#~0.5.5",
|
23
|
+
"core-menu": "Polymer/core-menu#~0.5.5",
|
24
|
+
"core-item": "Polymer/core-item#~0.5.5",
|
25
|
+
"core-header-panel": "Polymer/core-header-panel#~0.5.5",
|
26
|
+
"core-ajax": "polymer/core-ajax#~0.5.5",
|
27
|
+
"paper-toast": "polymer/paper-toast#~0.5.5",
|
28
|
+
"paper-toggle-button": "polymer/paper-toggle-button#~0.5.5",
|
29
|
+
"paper-tabs": "polymer/paper-tabs#~0.5.5",
|
30
|
+
"core-pages": "polymer/core-pages#~0.5.5"
|
31
|
+
}
|
32
|
+
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
{
|
2
|
+
"name": "core-a11y-keys",
|
3
|
+
"private": true,
|
4
|
+
"dependencies": {
|
5
|
+
"polymer": "Polymer/polymer#^0.5"
|
6
|
+
},
|
7
|
+
"devDependencies": {
|
8
|
+
"web-component-tester": "Polymer/web-component-tester#^1"
|
9
|
+
},
|
10
|
+
"ignore": [
|
11
|
+
"**/.*",
|
12
|
+
"node_modules",
|
13
|
+
"bower_components",
|
14
|
+
"test",
|
15
|
+
"tests"
|
16
|
+
],
|
17
|
+
"version": "0.5.5",
|
18
|
+
"homepage": "https://github.com/Polymer/core-a11y-keys",
|
19
|
+
"_release": "0.5.5",
|
20
|
+
"_resolution": {
|
21
|
+
"type": "version",
|
22
|
+
"tag": "0.5.5",
|
23
|
+
"commit": "bb806f0d130c1e276f97b1ddef83400a828c17be"
|
24
|
+
},
|
25
|
+
"_source": "git://github.com/Polymer/core-a11y-keys.git",
|
26
|
+
"_target": "^0.5",
|
27
|
+
"_originalSource": "Polymer/core-a11y-keys"
|
28
|
+
}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
{
|
2
|
+
"name": "core-a11y-keys",
|
3
|
+
"private": true,
|
4
|
+
"dependencies": {
|
5
|
+
"polymer": "Polymer/polymer#^0.5"
|
6
|
+
},
|
7
|
+
"devDependencies": {
|
8
|
+
"web-component-tester": "Polymer/web-component-tester#^1"
|
9
|
+
},
|
10
|
+
"ignore": [
|
11
|
+
"**/.*",
|
12
|
+
"node_modules",
|
13
|
+
"bower_components",
|
14
|
+
"test",
|
15
|
+
"tests"
|
16
|
+
],
|
17
|
+
"version": "0.5.5"
|
18
|
+
}
|