easycomments 1.0.1
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.
- 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
|
+
}
|