poodle-rb 0.0.9 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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