jakewendt-documents 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. data/README.rdoc +72 -0
  2. data/app/controllers/documents_controller.rb +97 -0
  3. data/app/models/document.rb +28 -0
  4. data/app/views/documents/_document.html.erb +15 -0
  5. data/app/views/documents/_form.html.erb +19 -0
  6. data/app/views/documents/edit.html.erb +4 -0
  7. data/app/views/documents/index.html.erb +11 -0
  8. data/app/views/documents/new.html.erb +3 -0
  9. data/app/views/documents/preview.html.erb +15 -0
  10. data/config/document.yml +54 -0
  11. data/config/routes.rb +5 -0
  12. data/generators/documents/USAGE +0 -0
  13. data/generators/documents/documents_generator.rb +69 -0
  14. data/generators/documents/templates/functional/documents_controller_test.rb +219 -0
  15. data/generators/documents/templates/javascripts/documents.js +0 -0
  16. data/generators/documents/templates/migrations/add_attachments_document_to_document.rb +19 -0
  17. data/generators/documents/templates/migrations/create_documents.rb +19 -0
  18. data/generators/documents/templates/migrations/polymorphicize_document_owner.rb +13 -0
  19. data/generators/documents/templates/stylesheets/documents.css +0 -0
  20. data/generators/documents/templates/unit/document_test.rb +115 -0
  21. data/lib/documents.rb +54 -0
  22. data/lib/documents/factories.rb +4 -0
  23. data/lib/documents/file_utils_extension.rb +18 -0
  24. data/lib/documents/owner.rb +12 -0
  25. data/lib/documents/pending.rb +72 -0
  26. data/lib/documents/tasks.rb +1 -0
  27. data/lib/tasks/application.rake +40 -0
  28. data/lib/tasks/database.rake +52 -0
  29. data/lib/tasks/documentation.rake +68 -0
  30. data/lib/tasks/rcov.rake +41 -0
  31. data/lib/tasks/ucb_ccls_engine_tasks.rake +50 -0
  32. metadata +364 -0
@@ -0,0 +1,19 @@
1
+ class AddAttachmentsDocumentToDocument < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :documents, :document_file_name, :string
4
+ add_column :documents, :document_content_type, :string
5
+ add_column :documents, :document_file_size, :integer
6
+ add_column :documents, :document_updated_at, :datetime
7
+
8
+ add_index :documents, :document_file_name, :unique => true
9
+ end
10
+
11
+ def self.down
12
+ remove_index :documents, :document_file_name
13
+
14
+ remove_column :documents, :document_file_name
15
+ remove_column :documents, :document_content_type
16
+ remove_column :documents, :document_file_size
17
+ remove_column :documents, :document_updated_at
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ class CreateDocuments < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :documents do |t|
4
+ t.references :owner
5
+ t.string :title, :null => false
6
+ t.text :abstract
7
+ t.boolean :shared_with_all,
8
+ :default => false, :null => false
9
+ t.boolean :shared_with_select,
10
+ :default => false, :null => false
11
+ t.timestamps
12
+ end
13
+ add_index :documents, :owner_id
14
+ end
15
+
16
+ def self.down
17
+ drop_table :documents
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ class PolymorphicizeDocumentOwner < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :documents, :owner_type, :string
4
+ remove_index :documents, :owner_id
5
+ add_index :documents, [:owner_id,:owner_type]
6
+ end
7
+
8
+ def self.down
9
+ remove_index :documents, [:owner_id,:owner_type]
10
+ add_index :documents, :owner_id
11
+ remove_column :documents, :owner_type_string
12
+ end
13
+ end
@@ -0,0 +1,115 @@
1
+ require File.dirname(__FILE__) + '/../../test_helper'
2
+
3
+ class Documents::DocumentTest < ActiveSupport::TestCase
4
+
5
+ assert_should_require(:title,
6
+ :model => 'Document')
7
+ assert_should_belong_to(:owner,:class_name => 'User',
8
+ :model => 'Document')
9
+
10
+ test "should create document" do
11
+ assert_difference 'Document.count' do
12
+ object = create_object
13
+ assert !object.new_record?,
14
+ "#{object.errors.full_messages.to_sentence}"
15
+ end
16
+ end
17
+
18
+ # test "should return class s3_access_key_id" do
19
+ # s3_access_key_id = Document.s3_access_key_id
20
+ # assert_equal "test_access_key_id", s3_access_key_id
21
+ # end
22
+ #
23
+ # test "should return class s3_secret_access_key" do
24
+ # s3_secret_access_key = Document.s3_secret_access_key
25
+ # assert_equal "test_secret_access_key", s3_secret_access_key
26
+ # end
27
+ #
28
+ # test "should return class s3_protocol" do
29
+ # s3_protocol = Document.s3_protocol
30
+ # assert_equal "https://", s3_protocol
31
+ # end
32
+ #
33
+ # test "should return class s3_host" do
34
+ # s3_host = Document.s3_host
35
+ # assert_equal "s3.amazonaws.com", s3_host
36
+ # end
37
+ #
38
+ # test "should return s3_access_key_id" do
39
+ # object = create_object
40
+ # s3_access_key_id = object.s3_access_key_id
41
+ # assert_equal "test_access_key_id", s3_access_key_id
42
+ # end
43
+ #
44
+ # test "should return s3_secret_access_key" do
45
+ # object = create_object
46
+ # s3_secret_access_key = object.s3_secret_access_key
47
+ # assert_equal "test_secret_access_key", s3_secret_access_key
48
+ # end
49
+ #
50
+ # test "should return s3_expires_on within the hour" do
51
+ # object = create_object
52
+ # s3_expires_on = object.s3_expires_on
53
+ # assert_not_nil s3_expires_on
54
+ # printf "Pausing for 3 seconds"
55
+ # sleep 5
56
+ # assert_equal s3_expires_on, object.s3_expires_on
57
+ # end
58
+ #
59
+ # test "should return s3_string_to_sign" do
60
+ # object = create_object(:document_file_name => "BogusFileName")
61
+ # assert_equal object.document.url,
62
+ # "/system/documents/#{object.id}/original/BogusFileName."
63
+ # assert_match /\AGET\n\n\n\d+\n\/system\/documents\/\d+\/original\/BogusFileName.\z/,
64
+ # object.s3_string_to_sign
65
+ # #puts object.document.url
66
+ # # => /system/documents/1/original/BogusFileName.
67
+ # #puts object.document.path
68
+ # # => /Users/jake/github_repo/jakewendt/ucb_ccls_engine/test/documents/1/BogusFileName.
69
+ # end
70
+ #
71
+ # test "should return s3_signature" do
72
+ # Document.any_instance.stubs(:s3_string_to_sign).returns(
73
+ # "GET\n\n\n1281066749\n/system/documents/1/original/BogusFileName.")
74
+ # object = create_object(:document_file_name => "BogusFileName")
75
+ # assert_not_nil object.s3_signature
76
+ # assert_equal "sZveTMHwpLQk0tA7amx2JNqN7NY%3D", object.s3_signature
77
+ # # => sZveTMHwpLQk0tA7amx2JNqN7NY%3D
78
+ # end
79
+ #
80
+ # test "should return s3_path" do
81
+ # Document.any_instance.stubs(:s3_expires_on).returns(
82
+ # "1281066749")
83
+ # Document.any_instance.stubs(:s3_string_to_sign).returns(
84
+ # "GET\n\n\n1281066749\n/system/documents/1/original/BogusFileName.")
85
+ # object = create_object(:document_file_name => "BogusFileName")
86
+ # assert_not_nil object.s3_path
87
+ # assert_equal "/system/documents/#{object.id}/original/BogusFileName.?" +
88
+ # "AWSAccessKeyId=test_access_key_id&" +
89
+ # "Signature=sZveTMHwpLQk0tA7amx2JNqN7NY%3D&Expires=1281066749",
90
+ # object.s3_path
91
+ # end
92
+ #
93
+ # test "should return s3_url" do
94
+ # Document.any_instance.stubs(:s3_expires_on).returns(
95
+ # "1281066749")
96
+ # Document.any_instance.stubs(:s3_string_to_sign).returns(
97
+ # "GET\n\n\n1281066749\n/system/documents/1/original/BogusFileName.")
98
+ # object = create_object(:document_file_name => "BogusFileName")
99
+ # assert_not_nil object.s3_url
100
+ # assert_equal "https://s3.amazonaws.com" +
101
+ # "/system/documents/#{object.id}/original/BogusFileName.?" +
102
+ # "AWSAccessKeyId=test_access_key_id&" +
103
+ # "Signature=sZveTMHwpLQk0tA7amx2JNqN7NY%3D&Expires=1281066749",
104
+ # object.s3_url
105
+ # end
106
+
107
+ protected
108
+
109
+ def create_object(options = {})
110
+ record = Factory.build(:document,options)
111
+ record.save
112
+ record
113
+ end
114
+
115
+ end
data/lib/documents.rb ADDED
@@ -0,0 +1,54 @@
1
+ require 'active_record'
2
+ require 'active_support'
3
+ require 'ruby_extension'
4
+ require 'rails_helpers'
5
+ require 'authorized'
6
+ require 'gravatar'
7
+ require 'calnet_authenticated'
8
+ require 'acts_as_list'
9
+ module Documents
10
+ # predefine namespace
11
+ end
12
+ require 'documents/owner'
13
+
14
+ # This doesn't seem necessary
15
+ %w{models controllers}.each do |dir|
16
+ path = File.expand_path(File.join(File.dirname(__FILE__), '../app', dir))
17
+ ActiveSupport::Dependencies.autoload_paths << path
18
+ ActiveSupport::Dependencies.autoload_once_paths << path
19
+ end
20
+
21
+ HTML::WhiteListSanitizer.allowed_attributes.merge(%w(
22
+ id class style
23
+ ))
24
+
25
+ if !defined?(RAILS_ENV) || RAILS_ENV == 'test'
26
+ require 'active_support'
27
+ require 'active_support/test_case'
28
+ require 'factory_girl'
29
+ require 'assert_this_and_that'
30
+ require 'documents/factories'
31
+ require 'documents/pending'
32
+ end
33
+
34
+ if RUBY_PLATFORM =~ /java/i
35
+ require 'documents/file_utils_extension'
36
+ end
37
+
38
+ require 'paperclip'
39
+ if defined? ::Paperclip::Glue
40
+ ActiveRecord::Base.send(:include, ::Paperclip::Glue)
41
+ else
42
+ ActiveRecord::Base.send(:include, ::Paperclip)
43
+ end
44
+
45
+ ActionController::Routing::Routes.add_configuration_file(
46
+ File.expand_path(
47
+ File.join(
48
+ File.dirname(__FILE__), '../config/routes.rb')))
49
+
50
+ ActionController::Base.view_paths <<
51
+ File.expand_path(
52
+ File.join(
53
+ File.dirname(__FILE__), '../app/views'))
54
+
@@ -0,0 +1,4 @@
1
+ Factory.define :document do |f|
2
+ f.sequence(:title) { |n| "Title#{n}" }
3
+ # f.sequence(:document_file_name) { |n| "document_file_name#{n}" }
4
+ end
@@ -0,0 +1,18 @@
1
+ # Needed for Paperclip gem 2.3.3
2
+ # http://jira.codehaus.org/browse/JRUBY-3381
3
+ # http://github.com/thoughtbot/paperclip/issues/issue/193
4
+ # Errno::EACCES: Permission denied - /var/folders/kV/kV5XVPtqE9uZBCjn3z6vmk+++TM/-Tmp-/stream,19661,34729.pdf or /Users/jakewendt/github_repo/jakewendt/ucb_ccls_buffler/development/documents/2/edit_save_wireframe.pdf
5
+ FileUtils.module_eval do
6
+ class << self
7
+ alias_method :built_in_mv, :mv
8
+
9
+ def mv(src, dest, options = {})
10
+ begin
11
+ built_in_mv(src, dest, options)
12
+ rescue Errno::EACCES
13
+ cp(src, dest)
14
+ rm(src)
15
+ end
16
+ end
17
+ end
18
+ end unless FileUtils.methods.include?('built_in_mv')
@@ -0,0 +1,12 @@
1
+ module Documents::Owner
2
+ def self.included(base)
3
+ base.extend(PrepMethod)
4
+ end
5
+ module PrepMethod
6
+ def document_owner(*args)
7
+ options = args.extract_options!
8
+ has_many :documents, :as => :owner
9
+ end
10
+ end
11
+ end
12
+ ActiveRecord::Base.send(:include,Documents::Owner)
@@ -0,0 +1,72 @@
1
+ # Some code from jeremymcanally's "pending"
2
+ # http://github.com/jeremymcanally/pending/tree/master
3
+
4
+ module ActiveSupport
5
+ module Testing
6
+ module Pending
7
+
8
+ unless defined?(Spec)
9
+
10
+ @@pending_cases = []
11
+ @@at_exit = false
12
+
13
+ def pending(description = "", &block)
14
+ if description.is_a?(Symbol)
15
+ is_pending = $tags[description]
16
+ return block.call unless is_pending
17
+ end
18
+
19
+ if block_given?
20
+ failed = false
21
+
22
+ begin
23
+ block.call
24
+ rescue Exception
25
+ failed = true
26
+ end
27
+
28
+ flunk("<#{description}> did not fail.") unless failed
29
+ end
30
+
31
+ caller[0] =~ (/(.*):(.*):in `(.*)'/)
32
+ #puts caller.inspect
33
+
34
+ # looks like we lose the name of the 'method' in 1.9.1
35
+ #"/Users/jakewendt/github_repo/jakewendt/ucb_ccls_homex/test/unit/subject_test.rb:145:in `block in <class:SubjectTest>'",
36
+
37
+ # @@pending_cases << "#{$3} at #{$1}, line #{$2}"
38
+ # Gotta remember these as the next Regex will overwrite them.
39
+ filename = $1
40
+ linenumber = $2
41
+ # ruby 1.8.7
42
+ # Hx/Addresses Controller should NOT create new address with employee login and invalid address:
43
+ # ruby 1.9.1
44
+ #Hx/Addresses Controller block (2 levels) in <class:AddressesControllerTest>:
45
+ testmethod = $3
46
+
47
+ model = self.class.to_s.gsub(/Test$/,'').titleize
48
+ method = testmethod.gsub(/_/,' ').gsub(/^test /,'')
49
+ @@pending_cases << "#{model} #{method}:\n.\t#{filename} line #{linenumber}"
50
+ # @@pending_cases << "#{testmethod} at #{filename}, line #{linenumber}"
51
+ print "P"
52
+
53
+ @@at_exit ||= begin
54
+ at_exit do
55
+ # For some reason, special characters don't always
56
+ # print the way you would expect. Leading white space (tabs)
57
+ # and some carriage returns just weren't happening?
58
+ # Is this at_exit doing some parsing??
59
+ puts "\nPending Cases:"
60
+ @@pending_cases.each do |test_case|
61
+ puts test_case
62
+ end
63
+ puts " \n"
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ end
70
+ end
71
+ end
72
+ ActiveSupport::TestCase.send(:include, ActiveSupport::Testing::Pending)
@@ -0,0 +1 @@
1
+ Dir["#{File.dirname(__FILE__)}/../tasks/**/*.rake"].sort.each { |ext| load ext }
@@ -0,0 +1,40 @@
1
+ namespace :app do
2
+
3
+ # task :args_as_array do
4
+ # args = $*.dup.slice(1..-1)
5
+ # puts args.collect {|arg| "X:" << arg }.join("\n")
6
+ # exit
7
+ # end
8
+
9
+ desc "Add some expected users."
10
+ task :add_users => :environment do
11
+ puts "Adding users"
12
+ %w( 859908 228181 855747 214766 180918 66458 808 768475
13
+ 10883 86094 754783 769067 854720 16647 ).each do |uid|
14
+ puts " - Adding user with uid:#{uid}:"
15
+ User.find_create_and_update_by_uid(uid)
16
+ end
17
+ end
18
+
19
+ desc "Deputize user by UID"
20
+ task :deputize => :environment do
21
+ puts
22
+ if ENV['uid'].blank?
23
+ puts "User's CalNet UID required."
24
+ puts "Usage: rake #{$*} uid=INTEGER"
25
+ puts
26
+ exit
27
+ end
28
+ if !User.exists?(:uid => ENV['uid'])
29
+ puts "No user found with uid=#{ENV['uid']}."
30
+ puts
31
+ exit
32
+ end
33
+ user = User.find(:first, :conditions => { :uid => ENV['uid'] })
34
+ puts "Found user #{user.displayname}. Deputizing..."
35
+ user.deputize
36
+ puts "User deputized: #{user.is_administrator?}"
37
+ puts
38
+ end
39
+
40
+ end
@@ -0,0 +1,52 @@
1
+ namespace :db do
2
+
3
+ desc "Create yml fixtures for given model in database\n" <<
4
+ "rake db:extract_fixtures_from pages"
5
+ task :extract_fixtures_from => :environment do
6
+ me = $*.shift
7
+ while( table_name = $*.shift )
8
+ File.open("#{RAILS_ROOT}/db/#{table_name}.yml", 'w') do |file|
9
+ data = table_name.singularize.capitalize.constantize.find(
10
+ :all).collect(&:attributes)
11
+ file.write data.inject({}) { |hash, record|
12
+ record.delete('created_at')
13
+ record.delete('updated_at')
14
+ hash["#{table_name}_#{record['id']}"] = record
15
+ hash
16
+ }.to_yaml
17
+ end
18
+ end
19
+ exit
20
+ end
21
+
22
+ desc "Dump MYSQL table descriptions."
23
+ task :describe => :environment do
24
+ puts
25
+ puts "FYI: This task ONLY works on MYSQL databases."
26
+ puts
27
+ config = ActiveRecord::Base.connection.instance_variable_get(:@config)
28
+ #=> {:adapter=>"mysql", :host=>"localhost", :password=>nil, :username=>"root", :database=>"my_development", :encoding=>"utf8"}
29
+
30
+ tables = ActiveRecord::Base.connection.execute('show tables;')
31
+ while( table = tables.fetch_row ) do
32
+ puts "Table: #{table}"
33
+
34
+ # may have to include host and port
35
+ system("mysql --table=true " <<
36
+ "--user=#{config[:username]} " <<
37
+ "--password='#{config[:password]}' " <<
38
+ "--execute='describe #{table}' " <<
39
+ config[:database]);
40
+
41
+ #
42
+ # mysql formats the table well so doing it by hand is something that
43
+ # will have to wait until I feel like wasting my time
44
+ #
45
+ # columns = ActiveRecord::Base.connection.execute("describe #{table};")
46
+ # while( column = columns.fetch_hash ) do
47
+ # puts column.keys Extra Default Null Type Field Key
48
+ # end
49
+ end
50
+ end
51
+
52
+ end
@@ -0,0 +1,68 @@
1
+ #
2
+ # This file has been copied from rails
3
+ # .../rails-2.3.5/lib/tasks/documentation.rake
4
+ # so that parts of it could be modified.
5
+
6
+ namespace :doc do |doc|
7
+
8
+ # Rake::RDocTask.new("app") { |rdoc|
9
+ #
10
+ # We cannot overwrite or override an RDoc rake task.
11
+ # Redefining it here actually creates another
12
+ # of the same name and both are run when
13
+ # `rake doc:app` is called. The Rakefile
14
+ # is modified to handle the modifications.
15
+ #
16
+ # Actually, that's not entirely true. This would
17
+ # add another task, but you can remove and override
18
+ # a task. The rdoc_rails plugin was overriding my
19
+ # override, which caused all the frustration!!!
20
+ #
21
+ # }
22
+
23
+ plugins = FileList['vendor/plugins/**'].collect { |plugin|
24
+ File.basename(plugin) }
25
+
26
+ namespace :plugins do
27
+ # Define doc tasks for each plugin
28
+ plugins.each do |plugin|
29
+
30
+ # clear rails' Rake::Task of the same name
31
+ Rake::Task[plugin].clear_actions
32
+ Rake::Task[plugin].clear_prerequisites
33
+
34
+ Rake::RDocTask.new(plugin) { |rdoc|
35
+ plugin_base = "vendor/plugins/#{plugin}"
36
+ ENV['format'] ||= 'railsfish'
37
+ rdoc.rdoc_dir = "doc/plugins/#{plugin}"
38
+ rdoc.template = ENV['template'] if ENV['template']
39
+ rdoc.title = "#{plugin.titlecase} Plugin Documentation"
40
+ rdoc.options << '--line-numbers' << '--inline-source'
41
+ rdoc.options << '--charset' << 'utf-8'
42
+ rdoc.options << '--format' << ENV['format']
43
+ rdoc.rdoc_files.include("#{plugin_base}/lib/**/*.rb")
44
+ rdoc.rdoc_files.include("#{plugin_base}/app/**/*.rb")
45
+
46
+ %w( README README.rdoc ).each do |readme|
47
+ if File.exist?("#{plugin_base}/#{readme}")
48
+ rdoc.main = "#{plugin_base}/#{readme}"
49
+ break
50
+ end
51
+ end
52
+ %w( TODO.org MIT-LICENSE LICENSE CHANGELOG README README.rdoc ).each do |possible_file|
53
+ if File.exist?("#{plugin_base}/#{possible_file}")
54
+ rdoc.rdoc_files.include("#{plugin_base}/#{possible_file}")
55
+ end
56
+ end
57
+ }
58
+
59
+ end
60
+ end
61
+
62
+ task :parse_readme => :environment do
63
+ require 'rdoc/markup/to_html'
64
+ h = RDoc::Markup::ToHtml.new
65
+ puts h.convert( File.read('README.rdoc') )
66
+ end
67
+
68
+ end