enju_purchase_request 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (131) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +3 -0
  3. data/Rakefile +45 -0
  4. data/app/controllers/order_lists_controller.rb +94 -0
  5. data/app/controllers/orders_controller.rb +129 -0
  6. data/app/controllers/purchase_requests_controller.rb +139 -0
  7. data/app/models/order.rb +35 -0
  8. data/app/models/order_list.rb +53 -0
  9. data/app/models/purchase_request.rb +89 -0
  10. data/app/views/order_lists/edit.html.erb +37 -0
  11. data/app/views/order_lists/index.atom.builder +11 -0
  12. data/app/views/order_lists/index.html.erb +34 -0
  13. data/app/views/order_lists/index.rss.builder +31 -0
  14. data/app/views/order_lists/new.html.erb +32 -0
  15. data/app/views/order_lists/show.html.erb +40 -0
  16. data/app/views/orders/edit.html.erb +30 -0
  17. data/app/views/orders/index.atom.builder +11 -0
  18. data/app/views/orders/index.html.erb +40 -0
  19. data/app/views/orders/index.rss.builder +38 -0
  20. data/app/views/orders/new.html.erb +34 -0
  21. data/app/views/orders/show.html.erb +23 -0
  22. data/app/views/purchase_requests/_index.html.erb +85 -0
  23. data/app/views/purchase_requests/_index_order_list.html.erb +76 -0
  24. data/app/views/purchase_requests/_new.html.erb +76 -0
  25. data/app/views/purchase_requests/_new_order_list.html.erb +74 -0
  26. data/app/views/purchase_requests/edit.html.erb +66 -0
  27. data/app/views/purchase_requests/index.atom.builder +15 -0
  28. data/app/views/purchase_requests/index.csv.erb +4 -0
  29. data/app/views/purchase_requests/index.html.erb +5 -0
  30. data/app/views/purchase_requests/index.rss.builder +38 -0
  31. data/app/views/purchase_requests/new.html.erb +5 -0
  32. data/app/views/purchase_requests/show.html.erb +94 -0
  33. data/config/routes.rb +18 -0
  34. data/db/migrate/123_create_purchase_requests.rb +30 -0
  35. data/db/migrate/126_create_orders.rb +18 -0
  36. data/db/migrate/20081009062129_create_order_lists.rb +21 -0
  37. data/lib/enju_purchase_request/bookmark_url.rb +45 -0
  38. data/lib/enju_purchase_request/bookstore.rb +3 -0
  39. data/lib/enju_purchase_request/engine.rb +14 -0
  40. data/lib/enju_purchase_request/url_validator.rb +10 -0
  41. data/lib/enju_purchase_request/version.rb +3 -0
  42. data/lib/enju_purchase_request.rb +7 -0
  43. data/lib/tasks/enju_purchase_request_tasks.rake +4 -0
  44. data/spec/controllers/order_lists_controller_spec.rb +476 -0
  45. data/spec/controllers/orders_controller_spec.rb +481 -0
  46. data/spec/controllers/purchase_requests_controller_spec.rb +537 -0
  47. data/spec/dummy/Rakefile +7 -0
  48. data/spec/dummy/app/assets/javascripts/application.js +9 -0
  49. data/spec/dummy/app/assets/stylesheets/application.css +7 -0
  50. data/spec/dummy/app/controllers/application_controller.rb +104 -0
  51. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  52. data/spec/dummy/app/models/ability.rb +25 -0
  53. data/spec/dummy/app/models/bookmark.rb +29 -0
  54. data/spec/dummy/app/models/bookstore.rb +31 -0
  55. data/spec/dummy/app/models/role.rb +5 -0
  56. data/spec/dummy/app/models/user.rb +29 -0
  57. data/spec/dummy/app/models/user_group.rb +2 -0
  58. data/spec/dummy/app/models/user_has_role.rb +4 -0
  59. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  60. data/spec/dummy/app/views/page/403.html.erb +9 -0
  61. data/spec/dummy/app/views/page/403.mobile.erb +5 -0
  62. data/spec/dummy/app/views/page/403.xml.erb +4 -0
  63. data/spec/dummy/app/views/page/404.html.erb +9 -0
  64. data/spec/dummy/app/views/page/404.mobile.erb +5 -0
  65. data/spec/dummy/app/views/page/404.xml.erb +4 -0
  66. data/spec/dummy/config/application.rb +45 -0
  67. data/spec/dummy/config/boot.rb +10 -0
  68. data/spec/dummy/config/database.yml +25 -0
  69. data/spec/dummy/config/environment.rb +5 -0
  70. data/spec/dummy/config/environments/development.rb +30 -0
  71. data/spec/dummy/config/environments/production.rb +60 -0
  72. data/spec/dummy/config/environments/test.rb +39 -0
  73. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  74. data/spec/dummy/config/initializers/devise.rb +209 -0
  75. data/spec/dummy/config/initializers/inflections.rb +10 -0
  76. data/spec/dummy/config/initializers/mime_types.rb +6 -0
  77. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  78. data/spec/dummy/config/initializers/session_store.rb +8 -0
  79. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  80. data/spec/dummy/config/locales/en.yml +5 -0
  81. data/spec/dummy/config/routes.rb +60 -0
  82. data/spec/dummy/config.ru +4 -0
  83. data/spec/dummy/db/migrate/006_create_items.rb +36 -0
  84. data/spec/dummy/db/migrate/124_create_bookstores.rb +21 -0
  85. data/spec/dummy/db/migrate/20111201121844_create_roles.rb +12 -0
  86. data/spec/dummy/db/migrate/20111201155456_create_users.rb +13 -0
  87. data/spec/dummy/db/migrate/20111201155513_add_devise_to_users.rb +31 -0
  88. data/spec/dummy/db/migrate/20111201163342_create_user_groups.rb +12 -0
  89. data/spec/dummy/db/migrate/20111201163718_create_user_has_roles.rb +10 -0
  90. data/spec/dummy/db/schema.rb +156 -0
  91. data/spec/dummy/db/test.sqlite3 +0 -0
  92. data/spec/dummy/log/development.log +0 -0
  93. data/spec/dummy/log/sunspot-solr-test.log +222 -0
  94. data/spec/dummy/log/test.log +137771 -0
  95. data/spec/dummy/public/404.html +26 -0
  96. data/spec/dummy/public/422.html +26 -0
  97. data/spec/dummy/public/500.html +26 -0
  98. data/spec/dummy/public/favicon.ico +0 -0
  99. data/spec/dummy/script/rails +6 -0
  100. data/spec/dummy/solr/conf/admin-extra.html +31 -0
  101. data/spec/dummy/solr/conf/elevate.xml +36 -0
  102. data/spec/dummy/solr/conf/mapping-ISOLatin1Accent.txt +246 -0
  103. data/spec/dummy/solr/conf/protwords.txt +21 -0
  104. data/spec/dummy/solr/conf/schema.xml +238 -0
  105. data/spec/dummy/solr/conf/scripts.conf +24 -0
  106. data/spec/dummy/solr/conf/solrconfig.xml +934 -0
  107. data/spec/dummy/solr/conf/spellings.txt +2 -0
  108. data/spec/dummy/solr/conf/stopwords.txt +58 -0
  109. data/spec/dummy/solr/conf/synonyms.txt +31 -0
  110. data/spec/dummy/solr/data/test/index/segments.gen +0 -0
  111. data/spec/dummy/solr/data/test/index/segments_1 +0 -0
  112. data/spec/dummy/solr/data/test/spellchecker/segments.gen +0 -0
  113. data/spec/dummy/solr/data/test/spellchecker/segments_1 +0 -0
  114. data/spec/factories/bookstore.rb +5 -0
  115. data/spec/factories/order.rb +6 -0
  116. data/spec/factories/order_list.rb +7 -0
  117. data/spec/factories/purchase_request.rb +6 -0
  118. data/spec/factories/user.rb +34 -0
  119. data/spec/fixtures/order_lists.yml +40 -0
  120. data/spec/fixtures/orders.yml +50 -0
  121. data/spec/fixtures/purchase_requests.yml +129 -0
  122. data/spec/fixtures/roles.yml +21 -0
  123. data/spec/fixtures/user_has_roles.yml +41 -0
  124. data/spec/fixtures/users.yml +69 -0
  125. data/spec/models/order_list_spec.rb +24 -0
  126. data/spec/models/order_spec.rb +21 -0
  127. data/spec/models/purchase_request_spec.rb +31 -0
  128. data/spec/spec_helper.rb +44 -0
  129. data/spec/support/controller_macros.rb +48 -0
  130. data/spec/support/devise.rb +4 -0
  131. metadata +394 -0
@@ -0,0 +1,66 @@
1
+ <div id="content_detail" class="ui-corner-all">
2
+ <h1 class="title"><%= t('page.editing', :model => t('activerecord.models.purchase_request')) -%></h1>
3
+ <div id="content_list">
4
+
5
+ <%= form_for(@purchase_request) do |f| -%>
6
+ <%= f.error_messages -%>
7
+
8
+ <div class="field">
9
+ <%= f.label t('activerecord.models.user') -%><br />
10
+ <%= link_to @purchase_request.user.username, @purchase_request.user -%>
11
+ <%= f.hidden_field :user_id -%>
12
+ </div>
13
+
14
+ <div class="field">
15
+ <%= f.label :title -%><br />
16
+ <%= f.text_area :title, :class => 'resource_textarea' -%>
17
+ </div>
18
+
19
+ <div class="field">
20
+ <%= f.label :author -%><br />
21
+ <%= f.text_area :author, :class => 'resource_textarea' -%>
22
+ </div>
23
+
24
+ <div class="field">
25
+ <%= f.label :publisher -%><br />
26
+ <%= f.text_area :publisher, :class => 'resource_textarea' -%>
27
+ </div>
28
+
29
+ <div class="field">
30
+ <%= f.label :isbn -%><br />
31
+ <%= f.text_field :isbn, :class => 'resource_isbn_issn' -%>
32
+ </div>
33
+
34
+ <div class="field">
35
+ <%= f.label :pub_date -%><br />
36
+ <%= f.text_field :pub_date -%>
37
+ </div>
38
+
39
+ <div class="field">
40
+ <%= f.label :price -%><br />
41
+ <%= f.text_field :price, :class => 'resource_integer' -%>
42
+ </div>
43
+
44
+ <div class="field">
45
+ <%= f.label :url -%><br />
46
+ <%= f.url_field :url, :class => 'resource_url' -%>
47
+ </div>
48
+
49
+ <div class="field">
50
+ <%= f.label :note -%><br />
51
+ <%= f.text_area :note, :class => 'resource_textarea' -%>
52
+ </div>
53
+
54
+ <div class="actions">
55
+ <%= f.submit %>
56
+ </div>
57
+ <%- end -%>
58
+ </div>
59
+ </div>
60
+
61
+ <div id="submenu" class="ui-corner-all">
62
+ <ul>
63
+ <li><%= link_to t('page.show'), @purchase_request -%></li>
64
+ <li><%= link_to t('page.back'), user_purchase_requests_path(@purchase_request.user, :page => flash[:page] ||= nil) -%></li>
65
+ </ul>
66
+ </div>
@@ -0,0 +1,15 @@
1
+ atom_feed(:url => purchase_requests_url(:format => :atom)) do |feed|
2
+ if @user
3
+ feed.title t('purchase_request.user_purchase_request', :login_name => @user.username)
4
+ else
5
+ feed.title t('purchase_request.library_group_purchase_request', :library_group_name => @library_group.display_name.localize)
6
+ end
7
+ feed.updated(@purchase_requests.first ? @purchase_requests.first.created_at : Time.zone.now)
8
+
9
+ @purchase_requests.each do |purchase_request|
10
+ feed.entry(purchase_request) do |entry|
11
+ entry.title(purchase_request.title)
12
+ entry.author(purchase_request.author)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,4 @@
1
+ title,author,publisher,created_at,order_list_title,ordered_at,bookstore
2
+ <%- @purchase_requests.each do |purchase_request| -%>
3
+ "<%=h purchase_request.title.gsub(/"/, '""') -%>",<%=h purchase_request.author -%>,<%=h purchase_request.publisher -%>,<%=h purchase_request.created_at -%>,<%=h purchase_request.order_list.title rescue nil -%>,<%=h purchase_request.order_list.ordered_at rescue nil -%>,<%=h purchase_request.order_list.bookstore.name rescue nil%><%= "\n" -%>
4
+ <%- end -%>
@@ -0,0 +1,5 @@
1
+ <%- if @order_list -%>
2
+ <%= render 'index_order_list' -%>
3
+ <%- else -%>
4
+ <%= render 'index' -%>
5
+ <%- end -%>
@@ -0,0 +1,38 @@
1
+ xml.instruct! :xml, :version=>"1.0"
2
+ xml.rss('version' => "2.0",
3
+ 'xmlns:opensearch' => "http://a9.com/-/spec/opensearch/1.1/",
4
+ 'xmlns:atom' => "http://www.w3.org/2005/Atom"){
5
+ xml.channel{
6
+ xml.description "Next-L Enju, an open source integrated library system developed by Project Next-L"
7
+ if @user
8
+ xml.title t('purchase_request.user_purchase_request', :login_name => @user.username)
9
+ xml.link user_purchase_requests_url(@user)
10
+ xml.tag! "atom:link", :rel => 'self', :href => user_purchase_requests_url(@user, :format => :rss)
11
+ xml.tag! "atom:link", :rel => 'alternate', :href => user_purchase_requests_url(@user)
12
+ else
13
+ xml.title t('purchase_request.library_group_purchase_request', :library_group_name => @library_group.display_name.localize)
14
+ xml.link purchase_requests_url
15
+ xml.tag! "atom:link", :rel => 'self', :href => purchase_requests_url(:format => :rss)
16
+ xml.tag! "atom:link", :rel => 'alternate', :href => purchase_requests_url
17
+ end
18
+ xml.language @locale.to_s
19
+ xml.ttl "60"
20
+ #xml.tag! "atom:link", :rel => 'search', :type => 'application/opensearchdescription+xml', :href => "http://#{request.host_with_port}/page/opensearch"
21
+ unless params[:query].blank?
22
+ xml.tag! "opensearch:totalResults", @count[:query_result]
23
+ xml.tag! "opensearch:startIndex", @purchase_requests.offset + 1
24
+ xml.tag! "opensearch:itemsPerPage", @purchase_requests.per_page
25
+ #xml.tag! "opensearch:Query", :role => 'request', :searchTerms => params[:query], :startPage => (params[:page] || 1)
26
+ end
27
+ @purchase_requests.each do |purchase_request|
28
+ xml.item do
29
+ xml.title purchase_request.title
30
+ #xml.description(purchase_request.title)
31
+ # rfc822
32
+ xml.pubDate purchase_request.created_at.utc.rfc822
33
+ xml.link user_purchase_request_url(purchase_request.user, purchase_request)
34
+ xml.guid user_purchase_request_url(purchase_request.user, purchase_request), :isPermaLink => "true"
35
+ end
36
+ end
37
+ }
38
+ }
@@ -0,0 +1,5 @@
1
+ <%- if @order_list -%>
2
+ <%= render 'new_order_list' -%>
3
+ <%- else -%>
4
+ <%= render 'new' -%>
5
+ <%- end -%>
@@ -0,0 +1,94 @@
1
+ <div id="content_detail" class="ui-corner-all">
2
+ <h1 class="title"><%= t('page.showing', :model => t('activerecord.models.purchase_request')) -%></h1>
3
+ <div id="content_list">
4
+ <p id="notice"><%= notice %></p>
5
+
6
+ <p>
7
+ <strong><%= t('activerecord.models.user') -%>:</strong>
8
+ <%= link_to @purchase_request.user.username, @purchase_request.user -%>
9
+ </p>
10
+
11
+ <p>
12
+ <strong><%= t('activerecord.models.order_list') -%>:</strong>
13
+ <%- if @purchase_request.order_list -%>
14
+ <%= link_to @purchase_request.order_list.title, order_list_purchase_requests_path(@purchase_request.order_list) -%>
15
+ <%- else -%>
16
+ <%= t('purchase_request.not_ordered') -%>
17
+ <%- end -%>
18
+ </p>
19
+
20
+ <p>
21
+ <strong><%= t('activerecord.attributes.purchase_request.title') -%>:</strong>
22
+ <%= @purchase_request.title -%>
23
+ </p>
24
+
25
+ <p>
26
+ <strong><%= t('activerecord.attributes.purchase_request.author') -%>:</strong>
27
+ <%= @purchase_request.author -%>
28
+ </p>
29
+
30
+ <p>
31
+ <strong><%= t('activerecord.attributes.purchase_request.publisher') -%>:</strong>
32
+ <%= @purchase_request.publisher -%>
33
+ </p>
34
+
35
+ <p>
36
+ <strong><%= t('activerecord.attributes.purchase_request.isbn') -%>:</strong>
37
+ <%= @purchase_request.isbn -%>
38
+ </p>
39
+
40
+ <p>
41
+ <strong><%= t('activerecord.attributes.purchase_request.pub_date') -%>:</strong>
42
+ <%= @purchase_request.pub_date -%>
43
+ </p>
44
+
45
+ <p>
46
+ <strong><%= t('activerecord.attributes.purchase_request.price') -%>:</strong>
47
+ <%= @purchase_request.price -%>
48
+ </p>
49
+
50
+ <p>
51
+ <strong><%= t('activerecord.attributes.purchase_request.url') -%>:</strong>
52
+ <%= link_to @purchase_request.url, @purchase_request.url if @purchase_request.url? -%>
53
+ </p>
54
+
55
+ <p>
56
+ <strong><%= t('activerecord.attributes.purchase_request.note') -%>:</strong>
57
+ <%= @purchase_request.note -%>
58
+ </p>
59
+
60
+ <p>
61
+ <strong><%= t('activerecord.attributes.order_list.ordered_at') -%>:</strong>
62
+ <%= l(@purchase_request.order_list.ordered_at) if @purchase_request.order_list rescue nil -%>
63
+ </p>
64
+
65
+ <p>
66
+ <strong><%= t('page.created_at') -%>:</strong>
67
+ <%= l(@purchase_request.created_at) -%>
68
+ </p>
69
+
70
+ <p>
71
+ <strong><%= t('page.updated_at') -%>:</strong>
72
+ <%= l(@purchase_request.updated_at) -%>
73
+ </p>
74
+
75
+ </div>
76
+ </div>
77
+
78
+ <div id="submenu" class="ui-corner-all">
79
+ <ul>
80
+ <%- if @purchase_request.order_list -%>
81
+ <li><%= link_to t('purchase_request.remove_from_order_list'), order_list_order_path(@purchase_request.order_list, @purchase_request.order), :method => :delete, :confirm => t('page.are_you_sure') -%></li>
82
+ <%- else -%>
83
+ <li><%= link_to t('purchase_request.add_to_order_list'), new_purchase_request_order_path(@purchase_request) -%></li>
84
+ <%- end -%>
85
+ <%- if @user -%>
86
+ <li><%= link_to t('page.new', :model => t('activerecord.models.purchase_request')), new_purchase_request_path %></li>
87
+ <%- end -%>
88
+ <li><%= link_to t('page.edit'), edit_purchase_request_path(@purchase_request) -%></li>
89
+ <%- if current_user.has_role?('Librarian') -%>
90
+ <li><%= link_to t('page.destroy'), @purchase_request_path, :confirm => t('page.are_you_sure'), :method => :delete -%></li>
91
+ <%- end -%>
92
+ <li><%= link_to t('page.back'), user_purchase_requests_path(@purchase_request.user, :page => flash[:page] ||= nil) -%></li>
93
+ </ul>
94
+ </div>
data/config/routes.rb ADDED
@@ -0,0 +1,18 @@
1
+ Rails.application.routes.draw do
2
+ resources :purchase_requests do
3
+ resource :order
4
+ end
5
+ resources :users do
6
+ resources :purchase_requests, :only => :index
7
+ end
8
+ resources :order_lists do
9
+ resources :purchase_requests
10
+ end
11
+ resources :order_lists do
12
+ resource :order
13
+ end
14
+ resources :orders
15
+ resources :bookstores do
16
+ resources :order_lists
17
+ end
18
+ end
@@ -0,0 +1,30 @@
1
+ class CreatePurchaseRequests < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :purchase_requests do |t|
4
+ t.integer :user_id, :null => false
5
+ t.text :title, :null => false
6
+ t.text :author
7
+ t.text :publisher
8
+ t.string :isbn
9
+ t.datetime :date_of_publication
10
+ t.integer :price
11
+ t.string :url
12
+ t.text :note
13
+ t.datetime :accepted_at
14
+ t.datetime :denied_at
15
+ t.datetime :created_at
16
+ t.datetime :updated_at
17
+ t.datetime :deleted_at
18
+ t.string :state
19
+ t.string :pub_date
20
+
21
+ t.timestamps
22
+ end
23
+ add_index :purchase_requests, :user_id
24
+ add_index :purchase_requests, :state
25
+ end
26
+
27
+ def self.down
28
+ drop_table :purchase_requests
29
+ end
30
+ end
@@ -0,0 +1,18 @@
1
+ class CreateOrders < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :orders do |t|
4
+ t.integer :order_list_id, :null => false
5
+ t.integer :purchase_request_id, :null => false
6
+ t.integer :position
7
+ t.string :state
8
+
9
+ t.timestamps
10
+ end
11
+ add_index :orders, :order_list_id
12
+ add_index :orders, :purchase_request_id
13
+ end
14
+
15
+ def self.down
16
+ drop_table :orders
17
+ end
18
+ end
@@ -0,0 +1,21 @@
1
+ class CreateOrderLists < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :order_lists do |t|
4
+ t.integer :user_id, :null => false
5
+ t.integer :bookstore_id, :null => false
6
+ t.text :title, :null => false
7
+ t.text :note
8
+ t.datetime :ordered_at
9
+ t.datetime :deleted_at
10
+ t.string :state
11
+
12
+ t.timestamps
13
+ end
14
+ add_index :order_lists, :user_id
15
+ add_index :order_lists, :bookstore_id
16
+ end
17
+
18
+ def self.down
19
+ drop_table :order_lists
20
+ end
21
+ end
@@ -0,0 +1,45 @@
1
+ module BookmarkUrl
2
+ def my_host?
3
+ url = ::Addressable::URI.parse(self)
4
+ unless url.host
5
+ raise ::Addressable::URI::InvalidURIError
6
+ end
7
+ config_url = ::Addressable::URI.parse(LibraryGroup.site_config.url)
8
+ if url.host == config_url.host and url.port == config_url.port and ['http', 'https'].include?(url.scheme)
9
+ true
10
+ else
11
+ false
12
+ end
13
+ end
14
+
15
+ def bookmarkable?
16
+ if self.my_host?
17
+ url = ::Addressable::URI.parse(self)
18
+ path = url.path.split("/").reverse
19
+ if path[1] == "manifestations" and Manifestation.where(:id => path[0]).first
20
+ true
21
+ else
22
+ false
23
+ end
24
+ else
25
+ true
26
+ end
27
+ rescue ::Addressable::URI::InvalidURIError
28
+ false
29
+ end
30
+
31
+ def bookmarkable_id
32
+ if self.my_host?
33
+ path = ::Addressable::URI.parse(self).path.split("/").reverse
34
+ unless path[1] == "manifestations"
35
+ nil
36
+ else
37
+ path[0]
38
+ end
39
+ end
40
+ end
41
+ end
42
+
43
+ class String
44
+ include BookmarkUrl
45
+ end
@@ -0,0 +1,3 @@
1
+ class Bookstore < ActiveRecord::Base
2
+ has_many :order_lists
3
+ end
@@ -0,0 +1,14 @@
1
+ require 'devise'
2
+ require 'cancan'
3
+ require 'will_paginate'
4
+ require 'sunspot_rails'
5
+ require 'state_machine'
6
+ require 'attribute_normalizer'
7
+ require 'configatron'
8
+ require 'addressable/uri'
9
+ require 'nkf'
10
+
11
+ module EnjuPurchaseRequest
12
+ class Engine < Rails::Engine
13
+ end
14
+ end
@@ -0,0 +1,10 @@
1
+ class UrlValidator < ActiveModel::EachValidator
2
+ def validate_each(record, attribute, value)
3
+ url = ::Addressable::URI.parse(value)
4
+ if url
5
+ unless ['http', 'https'].include?(url.scheme)
6
+ record.errors.add(attribute.to_sym)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,3 @@
1
+ module EnjuPurchaseRequest
2
+ VERSION = "0.0.3"
3
+ end
@@ -0,0 +1,7 @@
1
+ require "enju_purchase_request/engine"
2
+ require "enju_purchase_request/bookstore"
3
+ require "enju_purchase_request/url_validator"
4
+ require "enju_purchase_request/bookmark_url"
5
+
6
+ module EnjuPurchaseRequest
7
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :enju_purchase_request do
3
+ # # Task goes here
4
+ # end