enju_purchase_request 0.0.3

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.
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