poodle-rb 0.0.9 → 0.1.0

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 (64) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +8 -12
  3. data/app/controllers/poodle/admin_controller.rb +6 -0
  4. data/app/views/layouts/poodle/application.html.erb +1 -1
  5. data/app/views/layouts/poodle/public.html.erb +1 -1
  6. data/config/initializers/poodle_validators.rb +59 -0
  7. data/config/initializers/state_machines_scopes.rb +23 -0
  8. data/lib/poodle/action_view/theme_helper.rb +32 -28
  9. data/lib/poodle/engine.rb +9 -0
  10. data/lib/poodle/version.rb +1 -1
  11. data/{test → spec}/dummy/README.rdoc +0 -0
  12. data/{test → spec}/dummy/Rakefile +0 -0
  13. data/{test → spec}/dummy/app/assets/javascripts/application.js +0 -0
  14. data/{test → spec}/dummy/app/assets/stylesheets/application.css +0 -0
  15. data/{test → spec}/dummy/app/controllers/application_controller.rb +0 -0
  16. data/{test → spec}/dummy/app/helpers/application_helper.rb +0 -0
  17. data/spec/dummy/app/models/profile_picture.rb +8 -0
  18. data/spec/dummy/app/models/user.rb +5 -0
  19. data/spec/dummy/app/uploaders/image_uploader.rb +81 -0
  20. data/{test → spec}/dummy/app/views/layouts/application.html.erb +0 -0
  21. data/{test → spec}/dummy/bin/bundle +0 -0
  22. data/{test → spec}/dummy/bin/rails +0 -0
  23. data/{test → spec}/dummy/bin/rake +0 -0
  24. data/{test → spec}/dummy/config.ru +0 -0
  25. data/{test → spec}/dummy/config/application.rb +1 -1
  26. data/{test → spec}/dummy/config/boot.rb +0 -0
  27. data/{test → spec}/dummy/config/database.yml +0 -0
  28. data/{test → spec}/dummy/config/environment.rb +0 -0
  29. data/{test → spec}/dummy/config/environments/development.rb +0 -0
  30. data/{test → spec}/dummy/config/environments/production.rb +0 -0
  31. data/{test → spec}/dummy/config/environments/test.rb +2 -1
  32. data/{test → spec}/dummy/config/initializers/assets.rb +0 -0
  33. data/{test → spec}/dummy/config/initializers/backtrace_silencers.rb +0 -0
  34. data/{test → spec}/dummy/config/initializers/cookies_serializer.rb +0 -0
  35. data/{test → spec}/dummy/config/initializers/filter_parameter_logging.rb +0 -0
  36. data/{test → spec}/dummy/config/initializers/inflections.rb +0 -0
  37. data/{test → spec}/dummy/config/initializers/mime_types.rb +0 -0
  38. data/{test → spec}/dummy/config/initializers/session_store.rb +0 -0
  39. data/{test → spec}/dummy/config/initializers/wrap_parameters.rb +0 -0
  40. data/{test → spec}/dummy/config/routes.rb +0 -0
  41. data/{test → spec}/dummy/config/secrets.yml +0 -0
  42. data/spec/dummy/db/migrate/20131108102728_create_profile_pictures.rb +9 -0
  43. data/spec/dummy/db/migrate/20140402113213_create_users.rb +10 -0
  44. data/spec/dummy/db/schema.rb +29 -0
  45. data/spec/dummy/db/test.sqlite3 +0 -0
  46. data/spec/dummy/log/test.log +8276 -0
  47. data/{test → spec}/dummy/public/404.html +0 -0
  48. data/{test → spec}/dummy/public/422.html +0 -0
  49. data/{test → spec}/dummy/public/500.html +0 -0
  50. data/{test → spec}/dummy/public/favicon.ico +0 -0
  51. data/spec/dummy/public/uploads/profile_picture/image/1/large_test.jpg +0 -0
  52. data/spec/dummy/public/uploads/profile_picture/image/1/medium_test.jpg +0 -0
  53. data/spec/dummy/public/uploads/profile_picture/image/1/test.jpg +0 -0
  54. data/spec/dummy/public/uploads/profile_picture/image/1/thumb_test.jpg +0 -0
  55. data/spec/dummy/spec/helpers/theme_helper_spec.rb +160 -0
  56. data/spec/dummy/spec/support/factories/profile_pictures.rb +6 -0
  57. data/spec/dummy/spec/support/factories/test.jpg +0 -0
  58. data/spec/dummy/spec/support/factories/users.rb +13 -0
  59. data/spec/spec_helper.rb +34 -0
  60. metadata +262 -74
  61. data/test/dummy/config/locales/en.yml +0 -23
  62. data/test/integration/navigation_test.rb +0 -10
  63. data/test/poodle_test.rb +0 -7
  64. data/test/test_helper.rb +0 -19
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5076200e66c69d100fcaf53e119af7d0b531e6cd
4
- data.tar.gz: 0ee7019551074bf4972a333f1f46c8c9ee2e672e
3
+ metadata.gz: 979fff07efaad933578909ad85a7623c2cc7bbc7
4
+ data.tar.gz: df9b48a604f41d12044669ae7b566eae9b8f8087
5
5
  SHA512:
6
- metadata.gz: 438afb0dc03f4378a77864071211fdafe90fb0c17b33ed6b8c215bc56e75127d49d1698316dfd7c84faf2f2d4a241d371c6fd7e024a155ff41127d8421e30520
7
- data.tar.gz: 9b61aee8ec7716104bda0d2d7f743270e5c21eb01e7c38e260d95d124122c6eb737ceafb8f355239b474ad5321f8d029ac68257ebf1fd8ef4b3f0d1696ed713c
6
+ metadata.gz: b7b1e22bfe5e726174c181ef0a45e9beb992d9965798c46ff8be5d44d667dfd5b01367e7f7f12bb5422614910df66059082e443523d5c6fdd378641acd3419e5
7
+ data.tar.gz: 0491858e489f85f6e023775b29ba352c868eeb499cf9c3c0a3bd0e19444e5618616c069341295165c140757dbe6321fb68e31beb8650614781d695611e6ec20c
data/Rakefile CHANGED
@@ -5,7 +5,6 @@ rescue LoadError
5
5
  end
6
6
 
7
7
  require 'rdoc/task'
8
-
9
8
  RDoc::Task.new(:rdoc) do |rdoc|
10
9
  rdoc.rdoc_dir = 'rdoc'
11
10
  rdoc.title = 'Poodle'
@@ -14,21 +13,18 @@ RDoc::Task.new(:rdoc) do |rdoc|
14
13
  rdoc.rdoc_files.include('lib/**/*.rb')
15
14
  end
16
15
 
17
- APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
16
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
18
17
  load 'rails/tasks/engine.rake'
19
18
 
20
-
21
-
22
19
  Bundler::GemHelper.install_tasks
23
20
 
24
- require 'rake/testtask'
21
+ Dir[File.join(File.dirname(__FILE__), 'tasks/**/*.rake')].each {|f| load f }
25
22
 
26
- Rake::TestTask.new(:test) do |t|
27
- t.libs << 'lib'
28
- t.libs << 'test'
29
- t.pattern = 'test/**/*_test.rb'
30
- t.verbose = false
31
- end
23
+ require 'rspec/core'
24
+ require 'rspec/core/rake_task'
25
+
26
+ desc "Run all specs in spec directory (excluding plugin specs)"
27
+ RSpec::Core::RakeTask.new(:spec => 'app:db:test:prepare')
32
28
 
33
29
 
34
- task default: :test
30
+ task default: :spec
@@ -146,5 +146,11 @@ module Poodle
146
146
  end
147
147
  end
148
148
 
149
+ def render_show
150
+ respond_to do |format|
151
+ format.js { render action: :show }
152
+ end
153
+ end
154
+
149
155
  end
150
156
  end
@@ -4,7 +4,7 @@
4
4
  <title><%= title -%></title>
5
5
  <%= meta_tags %>
6
6
  <link rel="icon" href="/assets/favicon.ico" type="image/png">
7
- <%= stylesheet_link_tag "poodle/application", :media => "all" -%>
7
+ <%= stylesheet_link_tag "application", :media => "all" -%>
8
8
  <%= csrf_meta_tags -%>
9
9
  <%= yield :javascript_header -%>
10
10
  </head>
@@ -4,7 +4,7 @@
4
4
  <title><%= title -%></title>
5
5
  <%= meta_tags %>
6
6
  <link rel="icon" href="/assets/favicon.ico" type="image/png">
7
- <%= stylesheet_link_tag "poodle/application", :media => "all" -%>
7
+ <%= stylesheet_link_tag "application", :media => "all" -%>
8
8
  <%= csrf_meta_tags -%>
9
9
  <%= yield :javascript_header -%>
10
10
  </head>
@@ -0,0 +1,59 @@
1
+ module PoodleValidators
2
+
3
+ def generate_validation_options(attribute, options)
4
+ reg_exp = /\A[a-zA-Z1-9\-\ \(\)\.+]*\z/i
5
+ options.reverse_merge!(
6
+ presence: true,
7
+ min_length: 3,
8
+ max_length: 256,
9
+ format: reg_exp,
10
+ uniqueness: false,
11
+ mandatory: false
12
+ )
13
+
14
+ if options.has_key?(:condition_method) && !options[:condition_method].blank?
15
+ condition_proc = proc {|obj| obj.send(options[:condition_method])}
16
+ elsif options.has_key?(:mandatory) && options[:mandatory] == false
17
+ condition_proc = proc {|obj| !obj.send(attribute).blank?}
18
+ else
19
+ condition_proc = nil
20
+ end
21
+
22
+ voptions = {
23
+ presence: options[:presence],
24
+ length: { minimum: options[:min_length], maximum: options[:max_length]},
25
+ format: {:with => options[:format]}
26
+ }
27
+ voptions.merge!(uniqueness: options[:uniqueness]) if options[:uniqueness]
28
+ voptions.merge!(if: condition_proc) if condition_proc
29
+
30
+ voptions
31
+ end
32
+
33
+ def validate_string(attribute, **options)
34
+ voptions = generate_validation_options(attribute, options)
35
+ validates attribute, **voptions
36
+ end
37
+
38
+ def validate_username(attribute, **options)
39
+ reg_exp = /\A[a-zA-Z0-9\_]*\z/
40
+ options.merge!(mandatory: true, max_length: 3, max_length: 128, format: reg_exp, :uniqueness => {:case_sensitive => false})
41
+ voptions = generate_validation_options(attribute, options)
42
+ validates attribute, **voptions
43
+ end
44
+
45
+ def validate_email(attribute, **options)
46
+ reg_exp = /\A(|(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6})\z/i
47
+ options.merge!(mandatory: true, format: reg_exp, :uniqueness => {:case_sensitive => false})
48
+ voptions = generate_validation_options(attribute, options)
49
+ validates attribute, **voptions
50
+ end
51
+
52
+ def validate_password(attribute, **options)
53
+ reg_exp = /\A(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9!@$#&*_\.,;:])/
54
+ options.merge!(mandatory: true, format: reg_exp, min_length: 7, max_length: 256)
55
+ voptions = generate_validation_options(attribute, options)
56
+ validates attribute, **voptions
57
+ end
58
+
59
+ end
@@ -0,0 +1,23 @@
1
+ module StateMachinesScopes
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+
6
+ # Will generate a bunch of instance methods (scopes) which can be used for filtering by status
7
+ # == Examples
8
+ # >>> User.approveds
9
+ # >>> User.pendings
10
+ # => ActiveRecord::Relation Object
11
+ self.state_machines.each do |name, machine|
12
+ machine.states.map(&:name).each do |my_status|
13
+ metaclass = class << self; self ; end
14
+ metaclass.instance_eval do
15
+ define_method(my_status.to_s.pluralize) do
16
+ where( status: my_status )
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ end
@@ -3,11 +3,12 @@ module Poodle
3
3
  # This module creates Bootstrap wrappers around basic View Tags
4
4
  module ThemeHelper
5
5
  # theme_fa_icon('plus')
6
- # <i class='fa fa-plus mr-10'></i>
6
+ # <i class='fa fa-plus'></i>
7
7
  # theme_fa_icon('plus', 'lg')
8
- # <i class='fa fa-plus fa-lg mr-10'></i>
8
+ # <i class='fa fa-plus fa-lg'></i>
9
9
  def theme_fa_icon(icon_text, size="")
10
- "<i class='fa fa-#{icon_text} #{size.blank? ? "" : "fa-"+size}'></i>"
10
+ size_class = %w{lg 2x 3x 4x 5x}.include?(size.strip) ? " fa-#{size.strip}" : ""
11
+ "<i class='fa fa-#{icon_text}#{size_class}'></i>"
11
12
  end
12
13
 
13
14
  # theme_button_text('New Project')
@@ -124,8 +125,9 @@ module Poodle
124
125
  end
125
126
  end
126
127
 
127
- def clear_tag(height)
128
- content_tag(:div, "", class: "clearfix cl-#{height}")
128
+ def clear_tag(height=nil)
129
+ height_class = height ? " cl-#{height}" : ""
130
+ content_tag(:div, "", class: "clearfix#{height_class}")
129
131
  end
130
132
 
131
133
  # Example
@@ -226,13 +228,6 @@ module Poodle
226
228
  end
227
229
  end
228
230
 
229
- #<% if request.xhr? %>
230
- # <%= render :partial=>"layouts/poodle/common/flash_message" %>
231
- #<% end %>
232
- def theme_flash_message
233
- render :partial=>"layouts/poodle/common/flash_message" if request.xhr?
234
- end
235
-
236
231
  # Example
237
232
  # theme_more_widget(object, data_columns=[:id, :created_at, :updated_at], super_admin = true)
238
233
  # is equivalent to:
@@ -315,37 +310,46 @@ module Poodle
315
310
  end
316
311
 
317
312
  # Example
318
- # theme_user_image(@user, @role)
313
+ # place_holder(width: 60, height: 40, text: "Not Found")
319
314
  # is equivalent to:
320
- def theme_user_image(user, **options)
315
+ # "http://placehold.it/60x40&text=Not Found"
316
+ def palceholdit(**options)
317
+ options.reverse_merge!( width: 60, height: 60, text: "<No Image>" )
318
+ "http://placehold.it/#{options[:width]}x#{options[:height]}&text=#{options[:text]}"
319
+ end
321
320
 
322
- url_domain = defined?(QAuthRubyClient) ? QAuthRubyClient.configuration.q_auth_url : "http://localhost:3000"
321
+ # Example
322
+ # theme_user_image(@user)
323
+ # is equivalent to:
324
+ def theme_user_image(user, method_name, **options)
325
+
326
+ url_domain = defined?(QAuthRubyClient) ? QAuthRubyClient.configuration.q_auth_url : "http://localhost:9001"
323
327
 
324
328
  options.reverse_merge!(
325
- role: nil,
326
329
  width: 60,
327
330
  height: options[:width],
328
- popover: true,
329
- size: "thumb",
330
331
  url_domain: url_domain,
331
332
  place_holder: { width: options[:width], height: options[:height], text: "<No Image>" },
332
- html_options: {
333
- class: "",
334
- style: "width:100%;height:auto;cursor:pointer;"
335
- }
333
+ html_options: { class: "", style: "width:100%;height:auto;cursor:pointer;" }
334
+ )
335
+
336
+ options[:place_holder].reverse_merge!(
337
+ width: options[:width],
338
+ height: options[:height],
339
+ text: "<No Image>"
336
340
  )
337
341
 
338
342
  options[:html_options].reverse_merge!(
339
343
  "data-toggle" => "popover",
340
344
  "data-placement" => "bottom",
341
- title: user.name,
342
- "data-content" => (options[:role] ? options[:role].name : "")
345
+ "title" => user.name,
346
+ "data-content" => options[:popover] === true ? "" : options[:popover].to_s
343
347
  ) if options[:popover]
344
348
 
345
- if user.send("#{options[:size]}_url").blank?
346
- url = "http://placehold.it/#{options[:place_holder][:width]}x#{options[:place_holder][:height]}&text=#{options[:place_holder][:text]}"
347
- else
348
- url = options[:url_domain] + user.send("#{options[:size]}_url")
349
+ begin
350
+ url = options[:url_domain] + user.send(:eval, method_name)
351
+ rescue
352
+ url = palceholdit()
349
353
  end
350
354
 
351
355
  content_tag(:div) do
@@ -1,7 +1,15 @@
1
1
  module Poodle
2
2
  class Engine < ::Rails::Engine
3
+
3
4
  isolate_namespace Poodle
4
5
 
6
+ config.generators do |g|
7
+ g.test_framework :rspec, :fixture => false
8
+ g.fixture_replacement :factory_girl, :dir => 'spec/factories'
9
+ g.assets false
10
+ g.helper false
11
+ end
12
+
5
13
  initializer "poodle.configure_rails_initialization" do |app|
6
14
 
7
15
  ActiveSupport.on_load :action_view do
@@ -28,6 +36,7 @@ module Poodle
28
36
  helper Poodle::TitleHelper
29
37
  helper Poodle::UrlHelper
30
38
  end
39
+
31
40
  end
32
41
  end
33
42
  end
@@ -1,3 +1,3 @@
1
1
  module Poodle
2
- VERSION = "0.0.9"
2
+ VERSION = "0.1.0"
3
3
  end
File without changes
File without changes
@@ -0,0 +1,8 @@
1
+ class ProfilePicture < ActiveRecord::Base
2
+
3
+ # Associations
4
+ belongs_to :user
5
+
6
+ mount_uploader :image, ImageUploader
7
+
8
+ end
@@ -0,0 +1,5 @@
1
+ class User < ActiveRecord::Base
2
+
3
+ has_one :profile_picture, :dependent => :destroy
4
+
5
+ end
@@ -0,0 +1,81 @@
1
+ # encoding: utf-8
2
+
3
+ class ImageUploader < CarrierWave::Uploader::Base
4
+
5
+ # Include RMagick or MiniMagick support:
6
+ include CarrierWave::RMagick
7
+ # include CarrierWave::MiniMagick
8
+
9
+ # Choose what kind of storage to use for this uploader:
10
+ #storage Rails.env.production? ? :fog : :file
11
+ storage :file
12
+
13
+ def root
14
+ Rails.root.join 'public/'
15
+ end
16
+
17
+ # Override the directory where uploaded files will be stored.
18
+ # This is a sensible default for uploaders that are meant to be mounted:
19
+ def store_dir
20
+ "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
21
+ end
22
+
23
+ version :large do
24
+ resize_to_limit(540, 540)
25
+ end
26
+
27
+ version :medium do
28
+ resize_to_fill(232, 232)
29
+ end
30
+
31
+ version :thumb do
32
+ #process :crop
33
+ resize_to_fill(116, 116)
34
+ end
35
+
36
+ # def crop
37
+ # if model.crop_x.present?
38
+ # resize_to_limit(540, 540)
39
+ # manipulate! do |img|
40
+ # x = model.crop_x.to_i
41
+ # y = model.crop_y.to_i
42
+ # w = model.crop_w.to_i
43
+ # h = model.crop_h.to_i
44
+ # img.crop!(x, y, w, h)
45
+ # end
46
+ # end
47
+ # end
48
+
49
+ # Provide a default URL as a default if there hasn't been a file uploaded:
50
+ # def default_url
51
+ # # For Rails 3.1+ asset pipeline compatibility:
52
+ # # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
53
+ #
54
+ # "/images/fallback/" + [version_name, "default.png"].compact.join('_')
55
+ # end
56
+
57
+ # Process files as they are uploaded:
58
+ # process :scale => [200, 300]
59
+ #
60
+ # def scale(width, height)
61
+ # # do something
62
+ # end
63
+
64
+ # Create different versions of your uploaded files:
65
+ # version :thumb do
66
+ # process :scale => [50, 50]
67
+ # end
68
+
69
+ # Add a white list of extensions which are allowed to be uploaded.
70
+ # For images you might use something like this:
71
+ # def extension_white_list
72
+ # %w(jpg jpeg gif png)
73
+ # end
74
+
75
+ # Override the filename of the uploaded files:
76
+ # Avoid using model.id or version_name here, see uploader/store.rb for details.
77
+ # def filename
78
+ # "something.jpg" if original_filename
79
+ # end
80
+
81
+ end
File without changes
File without changes
File without changes
File without changes
@@ -3,7 +3,7 @@ require File.expand_path('../boot', __FILE__)
3
3
  require 'rails/all'
4
4
 
5
5
  Bundler.require(*Rails.groups)
6
- require "poodle"
6
+ require "poodle-rb"
7
7
 
8
8
  module Dummy
9
9
  class Application < Rails::Application
File without changes
File without changes
@@ -13,7 +13,7 @@ Rails.application.configure do
13
13
  config.eager_load = false
14
14
 
15
15
  # Configure static asset server for tests with Cache-Control for performance.
16
- config.serve_static_assets = true
16
+ config.serve_static_files = true
17
17
  config.static_cache_control = 'public, max-age=3600'
18
18
 
19
19
  # Show full error reports and disable caching.
@@ -36,4 +36,5 @@ Rails.application.configure do
36
36
 
37
37
  # Raises error for missing translations
38
38
  # config.action_view.raise_on_missing_translations = true
39
+ config.active_record.raise_in_transactional_callbacks = true
39
40
  end