user_announcements 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md ADDED
File without changes
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2013 YOURNAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # UserAnnouncements
2
+
3
+ Manage and display site-wide announcements by user, role and announcement type.
4
+
5
+ ## Under construction
data/Rakefile ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ require 'rdoc/rdoc'
11
+ require 'rake/rdoctask'
12
+ RDoc::Task = Rake::RDocTask
13
+ end
14
+
15
+ RDoc::Task.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'UserAnnouncements'
18
+ rdoc.options << '--line-numbers'
19
+ rdoc.rdoc_files.include('README.rdoc')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
22
+
23
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
24
+ load 'rails/tasks/engine.rake'
25
+
26
+
27
+
28
+ Bundler::GemHelper.install_tasks
29
+
@@ -0,0 +1,42 @@
1
+ class Admin::AnnouncementsController < Admin::BaseController
2
+ before_filter :find_announcement, :only => [:edit, :update, :destroy]
3
+
4
+ def index
5
+ @announcements = Announcement.all#AnnouncementFinder.ordered
6
+ end
7
+
8
+ def new
9
+ @announcement = Announcement.new_with_defaults
10
+ end
11
+
12
+ def edit
13
+ end
14
+
15
+ def create
16
+ @announcement = Announcement.new(params.fetch(:announcement))
17
+ if @announcement.save
18
+ redirect_to admin_announcements_path, :flash => { success: 'Announcement created'}
19
+ else
20
+ render "new"
21
+ end
22
+ end
23
+
24
+ def update
25
+ if @announcement.update_attributes(params.fetch(:announcement))
26
+ redirect_to admin_announcements_path, :flash => { success: 'Announcement updated' }
27
+ else
28
+ render "edit"
29
+ end
30
+ end
31
+
32
+ def destroy
33
+ @announcement.destroy
34
+ redirect_to admin_announcements_path, :flash => { success: 'Announcement deleted' }
35
+ end
36
+
37
+ protected
38
+
39
+ def find_announcement
40
+ @announcement = Announcement.find(params.fetch(:id))
41
+ end
42
+ end
@@ -0,0 +1,12 @@
1
+ class Admin::BaseController < ApplicationController
2
+ before_filter :ensure_admin_user
3
+
4
+ private
5
+
6
+ def ensure_admin_user
7
+ # FIXME
8
+ # unless current_user.has_role?(:admin)
9
+ # redirect_to root_path
10
+ # end
11
+ end
12
+ end
@@ -0,0 +1,26 @@
1
+ class UserAnnouncementsController < ApplicationController
2
+ before_filter :ensure_current_user
3
+
4
+ def index
5
+ @announcements = AnnouncementFinder.past_or_current
6
+ @hidden_announcement_ids = UserAnnouncement.hidden_announcement_ids_for(current_user.id)
7
+ end
8
+
9
+ def hide
10
+ @announcement_id = params.fetch(:id)
11
+ UserAnnouncement.create_for(current_user, @announcement_id)
12
+ end
13
+
14
+ def unhide
15
+ UserAnnouncement.delete_all(user_id: current_user.id, announcement_id: params.fetch(:id))
16
+ redirect_to action: 'index'
17
+ end
18
+
19
+ private
20
+
21
+ def ensure_current_user
22
+ rescue NameError
23
+ raise "You must have a current_user method"
24
+ end
25
+
26
+ end
@@ -0,0 +1,66 @@
1
+ module UserAnnouncementsHelper
2
+
3
+
4
+ # style: "warning"
5
+ # type: "blog"
6
+ # role: "admin super-admin"
7
+ def announcements(options={})
8
+ return if controller.controller_name == 'user_announcements'
9
+
10
+ announcements_rows = AnnouncementFinder.current_for_user(current_user)
11
+ divs = announcements_rows.map do |announcement|
12
+ announcement_div(announcement)
13
+ end
14
+
15
+ safe_join(divs, "\n")
16
+ end
17
+
18
+ def announcement_div(announcement)
19
+ # <div class="alert">
20
+ # <button type="button" class="close" data-dismiss="alert">&times;</button>
21
+ # <strong>Warning!</strong> Best check yo self, you're not looking too good.
22
+ # </div>
23
+
24
+ div_for announcement, class: 'alert', style: 'width:40em' do
25
+ link_to(hide_user_announcement_path(announcement), remote: true) do
26
+ content_tag(:button, raw('&times;'), type: 'button', class: 'close', data: {dismissx: 'alert'})
27
+ end +
28
+ announcement.body.html_safe
29
+ end
30
+ # div_for(announcement) do
31
+ # announcement.body.html_safe +
32
+ # link_to("hide announcement", 'hide_announcement_path(announcement)', remote: true)
33
+ # end
34
+ end
35
+
36
+ def unhide_announcement_link(announcement)
37
+ if @hidden_announcement_ids.include?(announcement.id)
38
+ content_tag(:div) do
39
+ link_to('Unhide', unhide_user_announcement_path(announcement), method: :post)
40
+ end
41
+ end
42
+ end
43
+
44
+ def boolean_display(boolean)
45
+ ( boolean ? '&#10004;' : '&nbsp;' ).html_safe
46
+ end
47
+
48
+ def active_model_errors(model)
49
+ return unless model.errors.present?
50
+
51
+ content_tag(:div, class: ['alert', 'alert-error']) do
52
+ content_tag(:h4, "Correct the following errors:") +
53
+ content_tag(:ul) do
54
+ safe_join(model.errors.full_messages.map { |msg| content_tag(:li, msg) }, "\n")
55
+ end
56
+ end
57
+ end
58
+
59
+ def ua_datetime_p(f, method)
60
+ content_tag(:p, class: 'datetime-select') do
61
+ f.label(method) +
62
+ f.datetime_select(method)
63
+ end
64
+ end
65
+
66
+ end
@@ -0,0 +1,41 @@
1
+ class Announcement < ActiveRecord::Base
2
+ attr_accessible :body, :starts_at, :ends_at, :active
3
+
4
+ has_many :user_announcements, :dependent => :destroy
5
+
6
+ validates_presence_of :body, :starts_at, :ends_at
7
+
8
+
9
+ PAST = 'past'
10
+ CURRENT = 'current'
11
+ FUTURE = 'future'
12
+
13
+ def status
14
+ case
15
+ when ends_at.try(:past?) then PAST
16
+ when starts_at.try(:future?) then FUTURE
17
+ else CURRENT
18
+ end
19
+ end
20
+
21
+ def current?
22
+ status == CURRENT
23
+ end
24
+
25
+ def status_order
26
+ { FUTURE => 1, CURRENT => 2, PAST => 3 }[status]
27
+ end
28
+
29
+ class << self
30
+
31
+ def new_with_defaults
32
+ new do |ann|
33
+ ann.active = true
34
+ ann.starts_at = Time.now.at_beginning_of_day
35
+ ann.ends_at = 1.week.from_now.at_midnight
36
+ end
37
+
38
+ end
39
+
40
+ end
41
+ end
@@ -0,0 +1,35 @@
1
+ class AnnouncementFinder
2
+
3
+ class << self
4
+
5
+
6
+ # def ordered
7
+ # Announcement.all.sort_by(&:status_order)
8
+ # end
9
+
10
+ def current
11
+ Announcement.where("(starts_at is null or starts_at < :now) and (ends_at is null or ends_at > :now)", :now => DateTime.now)
12
+ end
13
+
14
+ def past_or_current
15
+ Announcement.where("(starts_at is null or starts_at < :now)", :now => DateTime.now).order('created_at desc')
16
+ end
17
+
18
+ def current_for_user(user)
19
+ for_user(user, current)
20
+ end
21
+
22
+ # def past_or_current_for_user(user)
23
+ # # FIXME: apply roles
24
+ # past_or_current
25
+ # end
26
+
27
+ def for_user(user, type)
28
+ hidden_announcement_ids = UserAnnouncement.hidden_announcement_ids_for(user.id)
29
+ result = type
30
+ result = result.where("id not in (?)", hidden_announcement_ids) if hidden_announcement_ids.present?
31
+ result.sort_by(&:status_order)
32
+ end
33
+ end
34
+
35
+ end
@@ -0,0 +1,19 @@
1
+ class UserAnnouncement < ActiveRecord::Base
2
+ attr_accessible :user_id, :announcement_id
3
+
4
+ class << self
5
+
6
+ def hidden_announcement_ids_for(user_id)
7
+ where(user_id: user_id).pluck(:announcement_id)
8
+ end
9
+
10
+ def create_for(current_user, announcement_id)
11
+ create!(
12
+ user_id: current_user.id,
13
+ announcement_id: announcement_id
14
+ )
15
+ end
16
+
17
+ end
18
+
19
+ end
@@ -0,0 +1,9 @@
1
+ <tr id="<%= dom_id(announcement) %>" class='<%= announcement.status %>'>
2
+ <td><%=raw announcement.body %></td>
3
+ <td><%= announcement.starts_at.try(:to_s, :db) %></td>
4
+ <td><%= announcement.ends_at.try(:to_s, :db) %></td>
5
+ <td><%= announcement.status %></td>
6
+ <td><%= boolean_display(announcement.active)%></td>
7
+ <td><%= link_to('edit', edit_admin_announcement_path(announcement), :class => 'btn btn-mini') %></td>
8
+ <td><%= link_to('delete', admin_announcement_path(announcement), :data => {confirm: 'Are you sure?'}, :method => :delete, :class => 'btn btn-mini btn-danger') %></td>
9
+ </tr>
@@ -0,0 +1,31 @@
1
+ <%= form_for [:admin, @announcement], :html => {:class => 'form-horizontal'} do |f| %>
2
+ <%= active_model_errors(f.object) %>
3
+ <%#= f.input :subject, :as => :text, :input_html => {:size => "60x3", class: 'span6'} %>
4
+ <%#= f.input(:starts_at, :as => :string, :input_html => {class: 'datepicker'}) %>
5
+ <%#= f.input(:ends_at, :as => :string, :input_html => {class: 'datepicker'}) %>
6
+ <p>
7
+ <%= f.label(:body) %>
8
+ <%= f.text_area :body, size: "60x10", class: 'span6' %>
9
+ </p>
10
+
11
+ <%= ua_datetime_p(f, :starts_at) %>
12
+
13
+ <%= ua_datetime_p(f, :ends_at) %>
14
+
15
+ <p>
16
+ <%= f.check_box(:active) %>
17
+ <%= f.label :active %>
18
+ </p>
19
+
20
+ <div class="form-actions">
21
+ <%= f.submit :class => 'btn btn-primary' %>
22
+ <%= link_to("Cancel", admin_announcements_path, :class => 'btn') %>
23
+ </div>
24
+ <% end %>
25
+
26
+ <style>
27
+ p.datetime-select select {
28
+ width: 8em;
29
+ }
30
+ </style>
31
+
@@ -0,0 +1,3 @@
1
+ <h1>Edit Announcement</h1>
2
+
3
+ <%= render partial: 'form' %>
@@ -0,0 +1,22 @@
1
+ <h1>Announcements</h1>
2
+
3
+ <p>
4
+ <%= link_to('New Announcement', new_admin_announcement_path(), :class => 'btn btn-primary') %>
5
+ </p>
6
+
7
+ <table id="admin-announcements" class="table table-striped table-bordered table-condensed table-hover">
8
+ <thead>
9
+ <tr>
10
+ <th>Announcement</th>
11
+ <th>Starts</th>
12
+ <th>Ends</th>
13
+ <th>Status</th>
14
+ <th>Active</th>
15
+ <th colspan="2" width="1%">Actions</th>
16
+ </tr>
17
+ </thead>
18
+
19
+ <tbody>
20
+ <%= render @announcements %>
21
+ </tbody>
22
+ </table>
@@ -0,0 +1,3 @@
1
+ <h1>New Announcement</h1>
2
+
3
+ <%= render partial: 'form' %>
@@ -0,0 +1,14 @@
1
+ <tr id="<%= dom_id(announcement) %>">
2
+ <td class='date'><%= announcement.created_at.try(:to_s, :db) %></td>
3
+ <td>
4
+ <%= announcement.body.html_safe %>
5
+ <%= unhide_announcement_link(announcement) %>
6
+ </td>
7
+ </tr>
8
+
9
+ <style>
10
+ td.date {
11
+ white-space: nowrap;
12
+ vertical-align: top;
13
+ }
14
+ </style>
@@ -0,0 +1 @@
1
+ $("#announcement_<%= j params[:id] %>").remove();
@@ -0,0 +1,13 @@
1
+ <h1>Announcements</h1>
2
+
3
+ <table border="1" cellspacing="0" cellpadding="4">
4
+ <thead>
5
+ <tr>
6
+ <th>Date</th>
7
+ <th>Announcement</th>
8
+ </tr>
9
+ </thead>
10
+ <tbody>
11
+ <%= render partial: 'user_announcements/announcement', collection: @announcements %>
12
+ </tbody>
13
+ </table>
data/config/routes.rb ADDED
@@ -0,0 +1,12 @@
1
+ Rails.application.routes.draw do
2
+
3
+ resources :user_announcements, path: '/announcements' do
4
+ get :hide, on: :member
5
+ post :unhide, on: :member
6
+ end
7
+ # match 'announcements/:id/hide', to: 'announcements#hide', as: 'hide_announcement'
8
+ namespace :admin do
9
+ resources :announcements
10
+ end
11
+
12
+ end
@@ -0,0 +1,9 @@
1
+ class CreateUserAnnouncementTables < ActiveRecord::Migration
2
+ def change
3
+ create_table :announcements do |t|
4
+ t.text :body
5
+
6
+ t.timestamps
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,17 @@
1
+ class CreateUserAnnouncementTables < ActiveRecord::Migration
2
+ def change
3
+ create_table :announcements do |t|
4
+ t.text :body
5
+ t.datetime :starts_at
6
+ t.datetime :ends_at
7
+ t.boolean :active
8
+ t.timestamps
9
+ end
10
+
11
+ create_table :user_announcements, :force => true do |t|
12
+ t.integer :user_id
13
+ t.integer :announcement_id
14
+ t.timestamps
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,32 @@
1
+ require 'rails/generators/active_record/migration'
2
+
3
+ class UserAnnouncementsGenerator < Rails::Generators::Base
4
+ include Rails::Generators::Migration
5
+ extend ActiveRecord::Generators::Migration
6
+
7
+ desc "Put the code"
8
+ source_root File.join(File.dirname(__FILE__), "templates")
9
+
10
+ def install
11
+ # copy_javascript if needs_js_copied?
12
+ migration_template "create_user_announcement_tables.rb", "db/migrate/create_user_announcement_tables.rb"
13
+ end
14
+
15
+ private
16
+
17
+ def copy_javascript
18
+ copy_file File.join(javascript_path, 'announcements.js'), js_destination
19
+ end
20
+
21
+ def javascript_path
22
+ File.join(%w(.. .. .. .. app assets javascripts))
23
+ end
24
+
25
+ def needs_js_copied?
26
+ ::Rails.version < '3.1' || !::Rails.application.config.assets.enabled
27
+ end
28
+
29
+ def js_destination
30
+ 'public/javascripts/announcements.js'
31
+ end
32
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :user_announcements do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,6 @@
1
+ module UserAnnouncements
2
+ class Engine < ::Rails::Engine
3
+ config.generators.integration_tool :rspec
4
+ config.generators.test_framework :rspec
5
+ end
6
+ end
@@ -0,0 +1,3 @@
1
+ module UserAnnouncements
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,4 @@
1
+ require "user_announcements/engine"
2
+
3
+ module UserAnnouncements
4
+ end
metadata ADDED
@@ -0,0 +1,336 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: user_announcements
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Steve Downey
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-05-22 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rails
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: jquery-rails
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: sass-rails
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: '3.2'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '3.2'
62
+ - !ruby/object:Gem::Dependency
63
+ name: bootstrap-sass
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 2.3.1.0
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 2.3.1.0
78
+ - !ruby/object:Gem::Dependency
79
+ name: rspec-rails
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: capybara
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: guard-rspec
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: guard-spork
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: sqlite3
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ - !ruby/object:Gem::Dependency
159
+ name: bootstrap-view-helpers
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ - !ruby/object:Gem::Dependency
175
+ name: better_errors
176
+ requirement: !ruby/object:Gem::Requirement
177
+ none: false
178
+ requirements:
179
+ - - ! '>='
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ type: :development
183
+ prerelease: false
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ! '>='
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ - !ruby/object:Gem::Dependency
191
+ name: binding_of_caller
192
+ requirement: !ruby/object:Gem::Requirement
193
+ none: false
194
+ requirements:
195
+ - - ! '>='
196
+ - !ruby/object:Gem::Version
197
+ version: '0'
198
+ type: :development
199
+ prerelease: false
200
+ version_requirements: !ruby/object:Gem::Requirement
201
+ none: false
202
+ requirements:
203
+ - - ! '>='
204
+ - !ruby/object:Gem::Version
205
+ version: '0'
206
+ - !ruby/object:Gem::Dependency
207
+ name: redcarpet
208
+ requirement: !ruby/object:Gem::Requirement
209
+ none: false
210
+ requirements:
211
+ - - ! '>='
212
+ - !ruby/object:Gem::Version
213
+ version: '0'
214
+ type: :development
215
+ prerelease: false
216
+ version_requirements: !ruby/object:Gem::Requirement
217
+ none: false
218
+ requirements:
219
+ - - ! '>='
220
+ - !ruby/object:Gem::Version
221
+ version: '0'
222
+ - !ruby/object:Gem::Dependency
223
+ name: yard
224
+ requirement: !ruby/object:Gem::Requirement
225
+ none: false
226
+ requirements:
227
+ - - ! '>='
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ none: false
234
+ requirements:
235
+ - - ! '>='
236
+ - !ruby/object:Gem::Version
237
+ version: '0'
238
+ - !ruby/object:Gem::Dependency
239
+ name: quiet_assets
240
+ requirement: !ruby/object:Gem::Requirement
241
+ none: false
242
+ requirements:
243
+ - - ! '>='
244
+ - !ruby/object:Gem::Version
245
+ version: '0'
246
+ type: :development
247
+ prerelease: false
248
+ version_requirements: !ruby/object:Gem::Requirement
249
+ none: false
250
+ requirements:
251
+ - - ! '>='
252
+ - !ruby/object:Gem::Version
253
+ version: '0'
254
+ - !ruby/object:Gem::Dependency
255
+ name: thin
256
+ requirement: !ruby/object:Gem::Requirement
257
+ none: false
258
+ requirements:
259
+ - - ! '>='
260
+ - !ruby/object:Gem::Version
261
+ version: '0'
262
+ type: :development
263
+ prerelease: false
264
+ version_requirements: !ruby/object:Gem::Requirement
265
+ none: false
266
+ requirements:
267
+ - - ! '>='
268
+ - !ruby/object:Gem::Version
269
+ version: '0'
270
+ description:
271
+ email:
272
+ - steve.downtown@gmail.com
273
+ executables: []
274
+ extensions: []
275
+ extra_rdoc_files: []
276
+ files:
277
+ - app/controllers/admin/announcements_controller.rb
278
+ - app/controllers/admin/base_controller.rb
279
+ - app/controllers/user_announcements_controller.rb
280
+ - app/helpers/user_announcements_helper.rb
281
+ - app/models/announcement.rb
282
+ - app/models/announcement_finder.rb
283
+ - app/models/user_announcement.rb
284
+ - app/views/admin/announcements/_announcement.html.erb
285
+ - app/views/admin/announcements/_form.html.erb
286
+ - app/views/admin/announcements/edit.html.erb
287
+ - app/views/admin/announcements/index.html.erb
288
+ - app/views/admin/announcements/new.html.erb
289
+ - app/views/user_announcements/_announcement.html.erb
290
+ - app/views/user_announcements/hide.js.erb
291
+ - app/views/user_announcements/index.html.erb
292
+ - config/routes.rb
293
+ - db/migrate/20130521175710_create_announcements.rb
294
+ - lib/generators/templates/create_user_announcement_tables.rb
295
+ - lib/generators/user_announcements_generator.rb
296
+ - lib/tasks/user_announcements_tasks.rake
297
+ - lib/user_announcements/engine.rb
298
+ - lib/user_announcements/version.rb
299
+ - lib/user_announcements.rb
300
+ - MIT-LICENSE
301
+ - CHANGELOG.md
302
+ - Rakefile
303
+ - README.md
304
+ homepage: https://github.com/stevedowney/user_announcements
305
+ licenses: []
306
+ post_install_message:
307
+ rdoc_options: []
308
+ require_paths:
309
+ - lib
310
+ required_ruby_version: !ruby/object:Gem::Requirement
311
+ none: false
312
+ requirements:
313
+ - - ! '>='
314
+ - !ruby/object:Gem::Version
315
+ version: '0'
316
+ segments:
317
+ - 0
318
+ hash: -1264060976197441369
319
+ required_rubygems_version: !ruby/object:Gem::Requirement
320
+ none: false
321
+ requirements:
322
+ - - ! '>='
323
+ - !ruby/object:Gem::Version
324
+ version: '0'
325
+ segments:
326
+ - 0
327
+ hash: -1264060976197441369
328
+ requirements: []
329
+ rubyforge_project:
330
+ rubygems_version: 1.8.25
331
+ signing_key:
332
+ specification_version: 3
333
+ summary: Manage and display site-wide announcements by user, role and announcement
334
+ type.
335
+ test_files: []
336
+ has_rdoc: