Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
  • 7 commits
  • 53 files changed
  • 0 comments
  • 1 contributor

Showing 53 changed files with 695 additions and 119 deletions. Show diff stats Hide diff stats

  1. 2  Gemfile
  2. 33  Gemfile.lock
  3. BIN  app/assets/images/app/facebook_64.png
  4. BIN  app/assets/images/app/search1.png
  5. BIN  app/assets/images/search.png
  6. 52  app/assets/javascripts/app.js
  7. 68  app/assets/javascripts/app/app.js
  8. 51  app/assets/javascripts/app/jquery.validate.min.js
  9. 0  app/assets/javascripts/{test_names.js.coffee → app/universities.js.coffee}
  10. 2  app/assets/javascripts/application.js
  11. 3  app/assets/javascripts/authentications.js.coffee
  12. 3  app/assets/javascripts/test/test_names.js.coffee
  13. 3  app/assets/javascripts/testing.js
  14. 75  app/assets/stylesheets/app/app.css.scss
  15. 47  app/assets/stylesheets/app/style.css
  16. 115  app/assets/stylesheets/app/style.css.scss
  17. 3  app/assets/stylesheets/authentications.css.scss
  18. 4  app/assets/stylesheets/testing.css
  19. 3  app/assets/stylesheets/universities.css.scss
  20. 13  app/controllers/authentications_controller.rb
  21. 1  app/controllers/test_names_controller.rb
  22. 7  app/controllers/universities_controller.rb
  23. 2  app/helpers/authentications_helper.rb
  24. 2  app/helpers/universities_helper.rb
  25. 3  app/models/authentication.rb
  26. 2  app/models/university.rb
  27. 1  app/models/user.rb
  28. 23  app/views/authentications/index.html.erb
  29. 11  app/views/kaminari/_first_page.html.erb
  30. 8  app/views/kaminari/_gap.html.erb
  31. 11  app/views/kaminari/_last_page.html.erb
  32. 11  app/views/kaminari/_next_page.html.erb
  33. 12  app/views/kaminari/_page.html.erb
  34. 25  app/views/kaminari/_paginator.html.erb
  35. 11  app/views/kaminari/_prev_page.html.erb
  36. 19  app/views/layouts/_login.html.erb
  37. 63  app/views/layouts/application.html.erb
  38. 13  app/views/layouts/testing.html.erb
  39. 1  app/views/universities/index.html.erb
  40. 2  app/views/users/new.html.erb
  41. 3  config/initializers/omniauth.rb
  42. 4  config/routes.rb
  43. 9  db/migrate/20120414092156_create_universities.rb
  44. 11  db/migrate/20120416101839_create_authentications.rb
  45. 17  db/schema.rb
  46. 5  spec/controllers/authentications_controller_spec.rb
  47. 5  spec/controllers/universities_controller_spec.rb
  48. 9  spec/factories/authentications.rb
  49. 6  spec/factories/universities.rb
  50. 15  spec/helpers/authentications_helper_spec.rb
  51. 15  spec/helpers/universities_helper_spec.rb
  52. 5  spec/models/authentication_spec.rb
  53. 5  spec/models/university_spec.rb
2  Gemfile
@@ -27,6 +27,8 @@ gem "kaminari", "~> 0.13.0"
27 27
 # To use ActiveModel has_secure_password
28 28
 gem 'bcrypt-ruby', '~> 3.0.0'
29 29
 
  30
+gem "omniauth-facebook"
  31
+gem "heroku", "~> 2.24.1"
30 32
 # To use Jbuilder templates for JSON
31 33
 # gem 'jbuilder'
32 34
 
33  Gemfile.lock
@@ -28,6 +28,7 @@ GEM
28 28
     activesupport (3.2.1)
29 29
       i18n (~> 0.6)
30 30
       multi_json (~> 1.0)
  31
+    addressable (2.2.7)
31 32
     arel (3.0.2)
32 33
     bcrypt-ruby (3.0.1)
33 34
     builder (3.0.0)
@@ -47,7 +48,18 @@ GEM
47 48
     factory_girl_rails (1.6.0)
48 49
       factory_girl (~> 2.5.0)
49 50
       railties (>= 3.0.0)
  51
+    faraday (0.7.6)
  52
+      addressable (~> 2.2)
  53
+      multipart-post (~> 1.1)
  54
+      rack (~> 1.1)
  55
+    hashie (1.2.0)
  56
+    heroku (2.24.1)
  57
+      launchy (>= 0.3.2)
  58
+      netrc (~> 0.7.1)
  59
+      rest-client (~> 1.6.1)
  60
+      rubyzip
50 61
     hike (1.2.1)
  62
+    httpauth (0.1)
51 63
     i18n (0.6.0)
52 64
     journey (1.0.3)
53 65
     jquery-rails (2.0.1)
@@ -58,6 +70,8 @@ GEM
58 70
       actionpack (>= 3.0.0)
59 71
       activesupport (>= 3.0.0)
60 72
       railties (>= 3.0.0)
  73
+    launchy (2.1.0)
  74
+      addressable (~> 2.2.6)
61 75
     magic_encoding (0.0.2)
62 76
     mail (2.4.3)
63 77
       i18n (>= 0.4.0)
@@ -65,7 +79,21 @@ GEM
65 79
       treetop (~> 1.4.8)
66 80
     mime-types (1.17.2)
67 81
     multi_json (1.1.0)
  82
+    multipart-post (1.1.5)
68 83
     mysql2 (0.3.11)
  84
+    netrc (0.7.1)
  85
+    oauth2 (0.6.0)
  86
+      faraday (~> 0.7)
  87
+      httpauth (~> 0.1)
  88
+      multi_json (~> 1.0)
  89
+    omniauth (1.1.0)
  90
+      hashie (~> 1.2)
  91
+      rack
  92
+    omniauth-facebook (1.2.0)
  93
+      omniauth-oauth2 (~> 1.0.0)
  94
+    omniauth-oauth2 (1.0.1)
  95
+      oauth2 (~> 0.6.0)
  96
+      omniauth (~> 1.0)
69 97
     polyglot (0.3.3)
70 98
     rack (1.4.1)
71 99
     rack-cache (1.2)
@@ -92,6 +120,8 @@ GEM
92 120
     rake (0.9.2.2)
93 121
     rdoc (3.12)
94 122
       json (~> 1.4)
  123
+    rest-client (1.6.7)
  124
+      mime-types (>= 1.16)
95 125
     rspec (2.8.0)
96 126
       rspec-core (~> 2.8.0)
97 127
       rspec-expectations (~> 2.8.0)
@@ -105,6 +135,7 @@ GEM
105 135
       activesupport (>= 3.0)
106 136
       railties (>= 3.0)
107 137
       rspec (~> 2.8.0)
  138
+    rubyzip (0.9.7)
108 139
     sass (3.1.15)
109 140
     sass-rails (3.2.4)
110 141
       railties (~> 3.2.0)
@@ -131,10 +162,12 @@ DEPENDENCIES
131 162
   bcrypt-ruby (~> 3.0.0)
132 163
   coffee-rails (~> 3.2.1)
133 164
   factory_girl_rails
  165
+  heroku (~> 2.24.1)
134 166
   jquery-rails
135 167
   kaminari (~> 0.13.0)
136 168
   magic_encoding (~> 0.0.2)
137 169
   mysql2
  170
+  omniauth-facebook
138 171
   rails (= 3.2.1)
139 172
   rspec (~> 2.8.0)
140 173
   rspec-rails (~> 2.8.1)
BIN  app/assets/images/app/facebook_64.png
BIN  app/assets/images/app/search1.png
BIN  app/assets/images/search.png
52  app/assets/javascripts/app.js
@@ -14,3 +14,55 @@ $(document).ready(function() {
14 14
     }
15 15
   });
16 16
 });
  17
+
  18
+//validates login
  19
+$(document).ready(function(){
  20
+  $('#login').validate({
  21
+    rules: {
  22
+      'email': {
  23
+        required: true,
  24
+        email: true,
  25
+      },
  26
+      'password': {
  27
+        required: true
  28
+      },
  29
+    },
  30
+    messages:{
  31
+      'email': {
  32
+        required: 'Введите email',
  33
+        email: 'Введите корректный email',
  34
+      },
  35
+      'password': 'Введите пароль',
  36
+    }
  37
+  })
  38
+});
  39
+
  40
+$(document).ready(function() {
  41
+
  42
+    var $el, leftPos, newWidth,
  43
+        $mainNav = $("#example-one");
  44
+
  45
+    $mainNav.append("<li id='magic-line'></li>");
  46
+    var $magicLine = $("#magic-line");
  47
+
  48
+    $magicLine
  49
+        .width($(".current_page_item").width())
  50
+        .css("left", $(".current_page_item a").position().left)
  51
+        .data("origLeft", $magicLine.position().left)
  52
+        .data("origWidth", $magicLine.width());
  53
+
  54
+    $("#example-one li a").hover(function() {
  55
+        $el = $(this);
  56
+        leftPos = $el.position().left;
  57
+        newWidth = $el.parent().width();
  58
+        $magicLine.stop().animate({
  59
+            left: leftPos,
  60
+            width: newWidth
  61
+        });
  62
+    }, function() {
  63
+        $magicLine.stop().animate({
  64
+            left: $magicLine.data("origLeft"),
  65
+            width: $magicLine.data("origWidth")
  66
+        });
  67
+    });
  68
+});
68  app/assets/javascripts/app/app.js
... ...
@@ -0,0 +1,68 @@
  1
+$(document).ready(function() {
  2
+  $(".login").click(function(e){
  3
+    e.preventDefault();
  4
+    $("fieldset#login_menu").toggle();
  5
+    $(".login").toggleClass("menu-open");
  6
+  });
  7
+  $("fieldset#login_menu").mouseup(function(){
  8
+    return false
  9
+  });
  10
+  $(document).mouseup(function(e){
  11
+    if($(e.target).parent("a.login").length==0) {
  12
+      $(".login").removeClass("menu-open");
  13
+      $("fieldset#login_menu").hide();
  14
+    }
  15
+  });
  16
+});
  17
+
  18
+//validates login
  19
+$(document).ready(function(){
  20
+  $('#login').validate({
  21
+    rules: {
  22
+      'email': {
  23
+        required: true,
  24
+        email: true,
  25
+      },
  26
+      'password': {
  27
+        required: true
  28
+      },
  29
+    },
  30
+    messages:{
  31
+      'email': {
  32
+        required: 'Введите email',
  33
+        email: 'Введите корректный email',
  34
+      },
  35
+      'password': 'Введите пароль',
  36
+    }
  37
+  })
  38
+});
  39
+
  40
+$(document).ready(function() {
  41
+
  42
+    var $el, leftPos, newWidth,
  43
+        $mainNav = $("#example-one");
  44
+
  45
+    $mainNav.append("<li id='magic-line'></li>");
  46
+    var $magicLine = $("#magic-line");
  47
+
  48
+    $magicLine
  49
+        .width($(".current_page_item").width())
  50
+        .css("left", $(".current_page_item a").position().left)
  51
+        .data("origLeft", $magicLine.position().left)
  52
+        .data("origWidth", $magicLine.width());
  53
+
  54
+    $("#example-one li a").hover(function() {
  55
+        $el = $(this);
  56
+        leftPos = $el.position().left;
  57
+        newWidth = $el.parent().width();
  58
+        $magicLine.stop().animate({
  59
+            left: leftPos,
  60
+            width: newWidth
  61
+        });
  62
+    }, function() {
  63
+        $magicLine.stop().animate({
  64
+            left: $magicLine.data("origLeft"),
  65
+            width: $magicLine.data("origWidth")
  66
+        });
  67
+    });
  68
+});
51  app/assets/javascripts/app/jquery.validate.min.js
... ...
@@ -0,0 +1,51 @@
  1
+/**
  2
+ * jQuery Validation Plugin 1.9.0
  3
+ *
  4
+ * http://bassistance.de/jquery-plugins/jquery-plugin-validation/
  5
+ * http://docs.jquery.com/Plugins/Validation
  6
+ *
  7
+ * Copyright (c) 2006 - 2011 Jörn Zaefferer
  8
+ *
  9
+ * Dual licensed under the MIT and GPL licenses:
  10
+ *   http://www.opensource.org/licenses/mit-license.php
  11
+ *   http://www.gnu.org/licenses/gpl.html
  12
+ */
  13
+(function(c){c.extend(c.fn,{validate:function(a){if(this.length){var b=c.data(this[0],"validator");if(b)return b;this.attr("novalidate","novalidate");b=new c.validator(a,this[0]);c.data(this[0],"validator",b);if(b.settings.onsubmit){a=this.find("input, button");a.filter(".cancel").click(function(){b.cancelSubmit=true});b.settings.submitHandler&&a.filter(":submit").click(function(){b.submitButton=this});this.submit(function(d){function e(){if(b.settings.submitHandler){if(b.submitButton)var f=c("<input type='hidden'/>").attr("name",
  14
+b.submitButton.name).val(b.submitButton.value).appendTo(b.currentForm);b.settings.submitHandler.call(b,b.currentForm);b.submitButton&&f.remove();return false}return true}b.settings.debug&&d.preventDefault();if(b.cancelSubmit){b.cancelSubmit=false;return e()}if(b.form()){if(b.pendingRequest){b.formSubmitted=true;return false}return e()}else{b.focusInvalid();return false}})}return b}else a&&a.debug&&window.console&&console.warn("nothing selected, can't validate, returning nothing")},valid:function(){if(c(this[0]).is("form"))return this.validate().form();
  15
+else{var a=true,b=c(this[0].form).validate();this.each(function(){a&=b.element(this)});return a}},removeAttrs:function(a){var b={},d=this;c.each(a.split(/\s/),function(e,f){b[f]=d.attr(f);d.removeAttr(f)});return b},rules:function(a,b){var d=this[0];if(a){var e=c.data(d.form,"validator").settings,f=e.rules,g=c.validator.staticRules(d);switch(a){case "add":c.extend(g,c.validator.normalizeRule(b));f[d.name]=g;if(b.messages)e.messages[d.name]=c.extend(e.messages[d.name],b.messages);break;case "remove":if(!b){delete f[d.name];
  16
+return g}var h={};c.each(b.split(/\s/),function(j,i){h[i]=g[i];delete g[i]});return h}}d=c.validator.normalizeRules(c.extend({},c.validator.metadataRules(d),c.validator.classRules(d),c.validator.attributeRules(d),c.validator.staticRules(d)),d);if(d.required){e=d.required;delete d.required;d=c.extend({required:e},d)}return d}});c.extend(c.expr[":"],{blank:function(a){return!c.trim(""+a.value)},filled:function(a){return!!c.trim(""+a.value)},unchecked:function(a){return!a.checked}});c.validator=function(a,
  17
+b){this.settings=c.extend(true,{},c.validator.defaults,a);this.currentForm=b;this.init()};c.validator.format=function(a,b){if(arguments.length==1)return function(){var d=c.makeArray(arguments);d.unshift(a);return c.validator.format.apply(this,d)};if(arguments.length>2&&b.constructor!=Array)b=c.makeArray(arguments).slice(1);if(b.constructor!=Array)b=[b];c.each(b,function(d,e){a=a.replace(RegExp("\\{"+d+"\\}","g"),e)});return a};c.extend(c.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",
  18
+validClass:"valid",errorElement:"label",focusInvalid:true,errorContainer:c([]),errorLabelContainer:c([]),onsubmit:true,ignore:":hidden",ignoreTitle:false,onfocusin:function(a){this.lastActive=a;if(this.settings.focusCleanup&&!this.blockFocusCleanup){this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass);this.addWrapper(this.errorsFor(a)).hide()}},onfocusout:function(a){if(!this.checkable(a)&&(a.name in this.submitted||!this.optional(a)))this.element(a)},
  19
+onkeyup:function(a){if(a.name in this.submitted||a==this.lastElement)this.element(a)},onclick:function(a){if(a.name in this.submitted)this.element(a);else a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(a,b,d){a.type==="radio"?this.findByName(a.name).addClass(b).removeClass(d):c(a).addClass(b).removeClass(d)},unhighlight:function(a,b,d){a.type==="radio"?this.findByName(a.name).removeClass(b).addClass(d):c(a).removeClass(b).addClass(d)}},setDefaults:function(a){c.extend(c.validator.defaults,
  20
+a)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",creditcard:"Please enter a valid credit card number.",equalTo:"Please enter the same value again.",accept:"Please enter a value with a valid extension.",maxlength:c.validator.format("Please enter no more than {0} characters."),
  21
+minlength:c.validator.format("Please enter at least {0} characters."),rangelength:c.validator.format("Please enter a value between {0} and {1} characters long."),range:c.validator.format("Please enter a value between {0} and {1}."),max:c.validator.format("Please enter a value less than or equal to {0}."),min:c.validator.format("Please enter a value greater than or equal to {0}.")},autoCreateRanges:false,prototype:{init:function(){function a(e){var f=c.data(this[0].form,"validator"),g="on"+e.type.replace(/^validate/,
  22
+"");f.settings[g]&&f.settings[g].call(f,this[0],e)}this.labelContainer=c(this.settings.errorLabelContainer);this.errorContext=this.labelContainer.length&&this.labelContainer||c(this.currentForm);this.containers=c(this.settings.errorContainer).add(this.settings.errorLabelContainer);this.submitted={};this.valueCache={};this.pendingRequest=0;this.pending={};this.invalid={};this.reset();var b=this.groups={};c.each(this.settings.groups,function(e,f){c.each(f.split(/\s/),function(g,h){b[h]=e})});var d=
  23
+this.settings.rules;c.each(d,function(e,f){d[e]=c.validator.normalizeRule(f)});c(this.currentForm).validateDelegate("[type='text'], [type='password'], [type='file'], select, textarea, [type='number'], [type='search'] ,[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'] ","focusin focusout keyup",a).validateDelegate("[type='radio'], [type='checkbox'], select, option","click",
  24
+a);this.settings.invalidHandler&&c(this.currentForm).bind("invalid-form.validate",this.settings.invalidHandler)},form:function(){this.checkForm();c.extend(this.submitted,this.errorMap);this.invalid=c.extend({},this.errorMap);this.valid()||c(this.currentForm).triggerHandler("invalid-form",[this]);this.showErrors();return this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(a){this.lastElement=
  25
+a=this.validationTargetFor(this.clean(a));this.prepareElement(a);this.currentElements=c(a);var b=this.check(a);if(b)delete this.invalid[a.name];else this.invalid[a.name]=true;if(!this.numberOfInvalids())this.toHide=this.toHide.add(this.containers);this.showErrors();return b},showErrors:function(a){if(a){c.extend(this.errorMap,a);this.errorList=[];for(var b in a)this.errorList.push({message:a[b],element:this.findByName(b)[0]});this.successList=c.grep(this.successList,function(d){return!(d.name in a)})}this.settings.showErrors?
  26
+this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){c.fn.resetForm&&c(this.currentForm).resetForm();this.submitted={};this.lastElement=null;this.prepareForm();this.hideErrors();this.elements().removeClass(this.settings.errorClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b=0,d;for(d in a)b++;return b},hideErrors:function(){this.addWrapper(this.toHide).hide()},valid:function(){return this.size()==
  27
+0},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{c(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").focus().trigger("focusin")}catch(a){}},findLastActive:function(){var a=this.lastActive;return a&&c.grep(this.errorList,function(b){return b.element.name==a.name}).length==1&&a},elements:function(){var a=this,b={};return c(this.currentForm).find("input, select, textarea").not(":submit, :reset, :image, [disabled]").not(this.settings.ignore).filter(function(){!this.name&&
  28
+a.settings.debug&&window.console&&console.error("%o has no name assigned",this);if(this.name in b||!a.objectLength(c(this).rules()))return false;return b[this.name]=true})},clean:function(a){return c(a)[0]},errors:function(){return c(this.settings.errorElement+"."+this.settings.errorClass,this.errorContext)},reset:function(){this.successList=[];this.errorList=[];this.errorMap={};this.toShow=c([]);this.toHide=c([]);this.currentElements=c([])},prepareForm:function(){this.reset();this.toHide=this.errors().add(this.containers)},
  29
+prepareElement:function(a){this.reset();this.toHide=this.errorsFor(a)},check:function(a){a=this.validationTargetFor(this.clean(a));var b=c(a).rules(),d=false,e;for(e in b){var f={method:e,parameters:b[e]};try{var g=c.validator.methods[e].call(this,a.value.replace(/\r/g,""),a,f.parameters);if(g=="dependency-mismatch")d=true;else{d=false;if(g=="pending"){this.toHide=this.toHide.not(this.errorsFor(a));return}if(!g){this.formatAndAdd(a,f);return false}}}catch(h){this.settings.debug&&window.console&&console.log("exception occured when checking element "+
  30
+a.id+", check the '"+f.method+"' method",h);throw h;}}if(!d){this.objectLength(b)&&this.successList.push(a);return true}},customMetaMessage:function(a,b){if(c.metadata){var d=this.settings.meta?c(a).metadata()[this.settings.meta]:c(a).metadata();return d&&d.messages&&d.messages[b]}},customMessage:function(a,b){var d=this.settings.messages[a];return d&&(d.constructor==String?d:d[b])},findDefined:function(){for(var a=0;a<arguments.length;a++)if(arguments[a]!==undefined)return arguments[a]},defaultMessage:function(a,
  31
+b){return this.findDefined(this.customMessage(a.name,b),this.customMetaMessage(a,b),!this.settings.ignoreTitle&&a.title||undefined,c.validator.messages[b],"<strong>Warning: No message defined for "+a.name+"</strong>")},formatAndAdd:function(a,b){var d=this.defaultMessage(a,b.method),e=/\$?\{(\d+)\}/g;if(typeof d=="function")d=d.call(this,b.parameters,a);else if(e.test(d))d=jQuery.format(d.replace(e,"{$1}"),b.parameters);this.errorList.push({message:d,element:a});this.errorMap[a.name]=d;this.submitted[a.name]=
  32
+d},addWrapper:function(a){if(this.settings.wrapper)a=a.add(a.parent(this.settings.wrapper));return a},defaultShowErrors:function(){for(var a=0;this.errorList[a];a++){var b=this.errorList[a];this.settings.highlight&&this.settings.highlight.call(this,b.element,this.settings.errorClass,this.settings.validClass);this.showLabel(b.element,b.message)}if(this.errorList.length)this.toShow=this.toShow.add(this.containers);if(this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);
  33
+if(this.settings.unhighlight){a=0;for(b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass)}this.toHide=this.toHide.not(this.toShow);this.hideErrors();this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return c(this.errorList).map(function(){return this.element})},showLabel:function(a,b){var d=this.errorsFor(a);if(d.length){d.removeClass(this.settings.validClass).addClass(this.settings.errorClass);
  34
+d.attr("generated")&&d.html(b)}else{d=c("<"+this.settings.errorElement+"/>").attr({"for":this.idOrName(a),generated:true}).addClass(this.settings.errorClass).html(b||"");if(this.settings.wrapper)d=d.hide().show().wrap("<"+this.settings.wrapper+"/>").parent();this.labelContainer.append(d).length||(this.settings.errorPlacement?this.settings.errorPlacement(d,c(a)):d.insertAfter(a))}if(!b&&this.settings.success){d.text("");typeof this.settings.success=="string"?d.addClass(this.settings.success):this.settings.success(d)}this.toShow=
  35
+this.toShow.add(d)},errorsFor:function(a){var b=this.idOrName(a);return this.errors().filter(function(){return c(this).attr("for")==b})},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(a){if(this.checkable(a))a=this.findByName(a.name).not(this.settings.ignore)[0];return a},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(a){var b=this.currentForm;return c(document.getElementsByName(a)).map(function(d,
  36
+e){return e.form==b&&e.name==a&&e||null})},getLength:function(a,b){switch(b.nodeName.toLowerCase()){case "select":return c("option:selected",b).length;case "input":if(this.checkable(b))return this.findByName(b.name).filter(":checked").length}return a.length},depend:function(a,b){return this.dependTypes[typeof a]?this.dependTypes[typeof a](a,b):true},dependTypes:{"boolean":function(a){return a},string:function(a,b){return!!c(a,b.form).length},"function":function(a,b){return a(b)}},optional:function(a){return!c.validator.methods.required.call(this,
  37
+c.trim(a.value),a)&&"dependency-mismatch"},startRequest:function(a){if(!this.pending[a.name]){this.pendingRequest++;this.pending[a.name]=true}},stopRequest:function(a,b){this.pendingRequest--;if(this.pendingRequest<0)this.pendingRequest=0;delete this.pending[a.name];if(b&&this.pendingRequest==0&&this.formSubmitted&&this.form()){c(this.currentForm).submit();this.formSubmitted=false}else if(!b&&this.pendingRequest==0&&this.formSubmitted){c(this.currentForm).triggerHandler("invalid-form",[this]);this.formSubmitted=
  38
+false}},previousValue:function(a){return c.data(a,"previousValue")||c.data(a,"previousValue",{old:null,valid:true,message:this.defaultMessage(a,"remote")})}},classRuleSettings:{required:{required:true},email:{email:true},url:{url:true},date:{date:true},dateISO:{dateISO:true},dateDE:{dateDE:true},number:{number:true},numberDE:{numberDE:true},digits:{digits:true},creditcard:{creditcard:true}},addClassRules:function(a,b){a.constructor==String?this.classRuleSettings[a]=b:c.extend(this.classRuleSettings,
  39
+a)},classRules:function(a){var b={};(a=c(a).attr("class"))&&c.each(a.split(" "),function(){this in c.validator.classRuleSettings&&c.extend(b,c.validator.classRuleSettings[this])});return b},attributeRules:function(a){var b={};a=c(a);for(var d in c.validator.methods){var e;if(e=d==="required"&&typeof c.fn.prop==="function"?a.prop(d):a.attr(d))b[d]=e;else if(a[0].getAttribute("type")===d)b[d]=true}b.maxlength&&/-1|2147483647|524288/.test(b.maxlength)&&delete b.maxlength;return b},metadataRules:function(a){if(!c.metadata)return{};
  40
+var b=c.data(a.form,"validator").settings.meta;return b?c(a).metadata()[b]:c(a).metadata()},staticRules:function(a){var b={},d=c.data(a.form,"validator");if(d.settings.rules)b=c.validator.normalizeRule(d.settings.rules[a.name])||{};return b},normalizeRules:function(a,b){c.each(a,function(d,e){if(e===false)delete a[d];else if(e.param||e.depends){var f=true;switch(typeof e.depends){case "string":f=!!c(e.depends,b.form).length;break;case "function":f=e.depends.call(b,b)}if(f)a[d]=e.param!==undefined?
  41
+e.param:true;else delete a[d]}});c.each(a,function(d,e){a[d]=c.isFunction(e)?e(b):e});c.each(["minlength","maxlength","min","max"],function(){if(a[this])a[this]=Number(a[this])});c.each(["rangelength","range"],function(){if(a[this])a[this]=[Number(a[this][0]),Number(a[this][1])]});if(c.validator.autoCreateRanges){if(a.min&&a.max){a.range=[a.min,a.max];delete a.min;delete a.max}if(a.minlength&&a.maxlength){a.rangelength=[a.minlength,a.maxlength];delete a.minlength;delete a.maxlength}}a.messages&&delete a.messages;
  42
+return a},normalizeRule:function(a){if(typeof a=="string"){var b={};c.each(a.split(/\s/),function(){b[this]=true});a=b}return a},addMethod:function(a,b,d){c.validator.methods[a]=b;c.validator.messages[a]=d!=undefined?d:c.validator.messages[a];b.length<3&&c.validator.addClassRules(a,c.validator.normalizeRule(a))},methods:{required:function(a,b,d){if(!this.depend(d,b))return"dependency-mismatch";switch(b.nodeName.toLowerCase()){case "select":return(a=c(b).val())&&a.length>0;case "input":if(this.checkable(b))return this.getLength(a,
  43
+b)>0;default:return c.trim(a).length>0}},remote:function(a,b,d){if(this.optional(b))return"dependency-mismatch";var e=this.previousValue(b);this.settings.messages[b.name]||(this.settings.messages[b.name]={});e.originalMessage=this.settings.messages[b.name].remote;this.settings.messages[b.name].remote=e.message;d=typeof d=="string"&&{url:d}||d;if(this.pending[b.name])return"pending";if(e.old===a)return e.valid;e.old=a;var f=this;this.startRequest(b);var g={};g[b.name]=a;c.ajax(c.extend(true,{url:d,
  44
+mode:"abort",port:"validate"+b.name,dataType:"json",data:g,success:function(h){f.settings.messages[b.name].remote=e.originalMessage;var j=h===true;if(j){var i=f.formSubmitted;f.prepareElement(b);f.formSubmitted=i;f.successList.push(b);f.showErrors()}else{i={};h=h||f.defaultMessage(b,"remote");i[b.name]=e.message=c.isFunction(h)?h(a):h;f.showErrors(i)}e.valid=j;f.stopRequest(b,j)}},d));return"pending"},minlength:function(a,b,d){return this.optional(b)||this.getLength(c.trim(a),b)>=d},maxlength:function(a,
  45
+b,d){return this.optional(b)||this.getLength(c.trim(a),b)<=d},rangelength:function(a,b,d){a=this.getLength(c.trim(a),b);return this.optional(b)||a>=d[0]&&a<=d[1]},min:function(a,b,d){return this.optional(b)||a>=d},max:function(a,b,d){return this.optional(b)||a<=d},range:function(a,b,d){return this.optional(b)||a>=d[0]&&a<=d[1]},email:function(a,b){return this.optional(b)||/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(a)},
  46
+url:function(a,b){return this.optional(b)||/^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(a)},
  47
+date:function(a,b){return this.optional(b)||!/Invalid|NaN/.test(new Date(a))},dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},creditcard:function(a,b){if(this.optional(b))return"dependency-mismatch";if(/[^0-9 -]+/.test(a))return false;var d=0,e=0,f=false;a=a.replace(/\D/g,"");for(var g=a.length-1;g>=
  48
+0;g--){e=a.charAt(g);e=parseInt(e,10);if(f)if((e*=2)>9)e-=9;d+=e;f=!f}return d%10==0},accept:function(a,b,d){d=typeof d=="string"?d.replace(/,/g,"|"):"png|jpe?g|gif";return this.optional(b)||a.match(RegExp(".("+d+")$","i"))},equalTo:function(a,b,d){d=c(d).unbind(".validate-equalTo").bind("blur.validate-equalTo",function(){c(b).valid()});return a==d.val()}}});c.format=c.validator.format})(jQuery);
  49
+(function(c){var a={};if(c.ajaxPrefilter)c.ajaxPrefilter(function(d,e,f){e=d.port;if(d.mode=="abort"){a[e]&&a[e].abort();a[e]=f}});else{var b=c.ajax;c.ajax=function(d){var e=("port"in d?d:c.ajaxSettings).port;if(("mode"in d?d:c.ajaxSettings).mode=="abort"){a[e]&&a[e].abort();return a[e]=b.apply(this,arguments)}return b.apply(this,arguments)}}})(jQuery);
  50
+(function(c){!jQuery.event.special.focusin&&!jQuery.event.special.focusout&&document.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.handle.call(this,e)}c.event.special[b]={setup:function(){this.addEventListener(a,d,true)},teardown:function(){this.removeEventListener(a,d,true)},handler:function(e){arguments[0]=c.event.fix(e);arguments[0].type=b;return c.event.handle.apply(this,arguments)}}});c.extend(c.fn,{validateDelegate:function(a,
  51
+b,d){return this.bind(b,function(e){var f=c(e.target);if(f.is(a))return d.apply(f,arguments)})}})})(jQuery);
0  app/assets/javascripts/test_names.js.coffee → app/assets/javascripts/app/universities.js.coffee
File renamed without changes
2  app/assets/javascripts/application.js
@@ -12,4 +12,4 @@
12 12
 //
13 13
 //= require jquery
14 14
 //= require jquery_ujs
15  
-//= require_tree .
  15
+//= require_directory ./app
3  app/assets/javascripts/authentications.js.coffee
... ...
@@ -0,0 +1,3 @@
  1
+# Place all the behaviors and hooks related to the matching controller here.
  2
+# All this logic will automatically be available in application.js.
  3
+# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/
3  app/assets/javascripts/test/test_names.js.coffee
... ...
@@ -0,0 +1,3 @@
  1
+# Place all the behaviors and hooks related to the matching controller here.
  2
+# All this logic will automatically be available in application.js.
  3
+# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/
3  app/assets/javascripts/testing.js
... ...
@@ -0,0 +1,3 @@
  1
+//= require jquery
  2
+//= require jquery_ujs
  3
+//= require_directory ./test
75  app/assets/stylesheets/app/app.css.scss
@@ -15,7 +15,15 @@
15 15
     -moz-border-radius:4px;
16 16
     border-radius:4px;
17 17
     *background:transparent url('signin-nav-bg-ie.png') no-repeat 0 0;
18  
-    *padding:4px 12px 6px;  
  18
+    *padding:4px 12px 6px;
  19
+    position:relative;
  20
+    margin-left:3px;
  21
+    span {
  22
+      background-image:url("toggle_down_light.png");
  23
+      background-repeat:no-repeat;
  24
+      background-position:100% 50%;
  25
+      padding:4px 16px 6px 0;
  26
+    }  
19 27
   }
20 28
   a.login hover {
21 29
     background:#5599BB;
@@ -27,16 +35,6 @@
27 35
     color:#666!important;
28 36
     outline:none;
29 37
   }
30  
-  a.login span {
31  
-    background-image:url("toggle_down_light.png");
32  
-    background-repeat:no-repeat;
33  
-    background-position:100% 50%;
34  
-    padding:4px 16px 6px 0;
35  
-  }
36  
-  a.login {
37  
-    position:relative;
38  
-    margin-left:3px;
39  
-  }
40 38
 #topnav a.login, #topnav a.login:hover {
41 39
     *background-position:0 3px!important;
42 40
 }
@@ -70,30 +68,30 @@ a.login.menu-open span {
70 68
     *margin-right: -1px;
71 69
     color:#789;
72 70
     font-size:11px;
73  
-}
74  
- 
75  
-#login_menu input[type=text], #login_menu input[type=password] {
  71
+    p {
  72
+      margin:0;
  73
+      .remember {
  74
+        padding:10px 0;
  75
+      }
  76
+    } 
  77
+    a {
  78
+      color:#6AC;
  79
+    }
  80
+    label {
  81
+      font-weight:normal;
  82
+    }
  83
+}
  84
+#login_menu input[type=email], #login_menu input[type=password] {
76 85
     display:block;
77 86
     -moz-border-radius:4px;
78 87
     -webkit-border-radius:4px;
79  
-    border:1px solid #f5f369;
  88
+    border:1px solid #f8e73f;
80 89
     font-size:13px;
81 90
     margin:0 0 5px;
82 91
     padding:5px;
83 92
     width:203px;
84 93
 }
85  
-#login_menu p {
86  
-    margin:0;
87  
-}
88  
-#login_menu a {
89  
-    color:#6AC;
90  
-}
91  
-#login_menu label {
92  
-    font-weight:normal;
93  
-}
94  
-#login_menu p.remember {
95  
-    padding:10px 0;
96  
-}
  94
+
97 95
 #login_menu p.forgot, #login_menu p.complete {
98 96
     clear:both;
99 97
     margin:5px 0;
@@ -106,7 +104,7 @@ a.login.menu-open span {
106 104
     -webkit-border-radius:4px;
107 105
     background:#fb9a0e;
108 106
     border:1px solid #cca97c;
109  
-    color:#fff;
  107
+    color:#eeeedc;
110 108
     text-shadow:0 -1px 0 #39d;
111 109
     padding:4px 10px 5px;
112 110
     font-size:11px;
@@ -126,3 +124,24 @@ border:0;
126 124
   font-size: 11px;
127 125
   float:right;
128 126
 }
  127
+
  128
+//registration
  129
+  a.signup{
  130
+    background:#fba545;
  131
+    padding:4px 6px 6px;
  132
+    text-decoration:none;
  133
+    font-weight:bold;
  134
+    color:#fff;
  135
+    -webkit-border-radius:4px;
  136
+    -moz-border-radius:4px;
  137
+    border-radius:4px;
  138
+    *background:transparent url('signin-nav-bg-ie.png') no-repeat 0 0;
  139
+    *padding:4px 12px 6px;
  140
+    position:relative;
  141
+    margin-left:3px;  
  142
+  }
  143
+  a.signup hover {
  144
+    background:#f06a1a;
  145
+    *background:transparent url("signin-nav-bg-hover-ie.png") no-repeat 0 0;
  146
+    *padding:4px 12px 6px;
  147
+  }
47  app/assets/stylesheets/app/style.css
... ...
@@ -1,47 +0,0 @@
1  
-html,body{margin:0;padding:0;background:#fff url('base_bg.png') repeat-x 0 81px;width:100%;height:100%;font-family:Arial, Helvetica, sans-serif;}
2  
-* html #wrap{height: 100%;}
3  
-p,td{font-family:Arial, Helvetica, sans-serif; margin-top:0px;}
4  
-
5  
-a img{border:0;}
6  
-a{color: #ff8400;text-decoration:underline;}
7  
-a:hover{color: #f5bd01;	text-decoration:underline;}
8  
-a.hidden{text-decoration: none;color:#000;cursor:default;}
9  
-
10  
-form{margin:0;padding:0;}
11  
-div.clr{clear:both;}
12  
-
13  
-ul{margin:0 0 0 20px;padding:0;list-style-type: square;line-height: 16px;}
14  
-
15  
-h1{font-size:20px;font-weight:normal;color:#000;margin:5px 0 10px;}
16  
-h2{font-size:16px;font-weight:normal;color:#000;margin:2px 0 7px;}
17  
-
18  
-#wrap{position:relative; min-height:100%; margin:0 auto; width:100%;}
19  
-#page{width:890px;margin:0 auto; padding-bottom:70px;}
20  
-
21  
-#top{height:81px; overflow:hidden;}
22  
-#header{position:relative; background:url('img01.jpg') no-repeat; height:248px;}
23  
-	#intro{width:386px; margin:30px 0 0 30px; font-size:12px; position:absolute;}
24  
-	#logo{position:absolute; margin:20px 0 0 20px;}
25  
-	#company_name{font-size:26px;font-weight:normal;text-transform: none;color: #ff8400; font-family:Tahoma, Geneva, sans-serif; margin:25px 0 0 95px; width:300px; position:absolute;}
26  
-	#search-box{position:absolute; margin:25px 0 0 610px; width:250px;}
27  
-	.search-area{background:url('search_area.png') no-repeat 0 1px; width:190px; height:29px; border:none; padding-left:5px; padding-right:4px;}
28  
-
29  
-#menu{color: #FFF;padding: 10px 0 0;white-space: nowrap; height:50px;}
30  
-	#menu .item{padding:0 18px; background:url('mbg.png') repeat-x; font-size:14px; vertical-align:top; line-height:35px;}
31  
-	#menu a{text-decoration: none;color: #FFF;}
32  
-	#menu a:hover{color: #FFF;text-decoration: underline;}
33  
-
34  
-#contentwrap{position:relative; overflow:hidden;}
35  
-	#body_area{color:#000;text-align: justify;padding:0 0 10px;vertical-align: top; float:left; width:620px; font-size:12px; margin:20px 0 0 15px;}
36  
-	#sidebar{float:right; width:240px; margin-top:25px;}
37  
-	#sidebar .banner{margin-bottom:10px;}
38  
-	#login_form{height: 20px;width: 150px;font-size: 12px;}
39  
-
40  
-#footer{height:70px; background:#8ec227 url('footer_bg.png') repeat-x top; margin-top:-70px;}
41  
-	#bottom_menu{width:880px;margin:0 auto;color:#fff;text-align:left;padding: 15px 0px 4px; font-size:12px;}
42  
-	#bottom_menu a{color:#fff;text-decoration:underline; padding:0 10px;}
43  
-	#bottom_menu a:hover{color:#000;text-decoration:underline;}
44  
-
45  
-	#bottom_addr{width:860px;margin:0 auto;color:#000;text-align:left;padding: 4px 0px 15px; font-size:11px;}
46  
-	#bottom_addr a{text-decoration:underline;}
47  
-	#bottom_addr a:hover{text-decoration: underline;}
115  app/assets/stylesheets/app/style.css.scss
... ...
@@ -0,0 +1,115 @@
  1
+html,body{margin:0;padding:0;background:#fff url('base_bg.png') repeat-x 0 81px;width:100%;height:100%;font-family:Arial, Helvetica, sans-serif;}
  2
+* html #wrap{height: 100%;}
  3
+p{font-family:Arial, Helvetica, sans-serif; margin-top:0px;}
  4
+
  5
+a img{border:0;}
  6
+a{color: #ff8400;text-decoration:underline;}
  7
+a:hover{color: #f5bd01;	text-decoration:underline;}
  8
+a.hidden{text-decoration: none;color:#000;cursor:default;}
  9
+
  10
+form{margin:0;padding:0;}
  11
+div.clr{clear:both;}
  12
+
  13
+/*ul{margin:0 0 0 20px;padding:0;list-style-type: square;line-height: 16px;}*/
  14
+
  15
+h1{font-size:20px;font-weight:normal;color:#000;margin:5px 0 10px;}
  16
+h2{font-size:16px;font-weight:normal;color:#000;margin:2px 0 7px;}
  17
+
  18
+#wrap{position:relative; min-height:100%; margin:0 auto; width:100%;}
  19
+#page{width:890px;margin:0 auto; padding-bottom:70px;}
  20
+
  21
+#top{height:81px; overflow:hidden;}
  22
+#header{position:relative; background:url('img01.jpg') no-repeat; height:248px;}
  23
+	#intro{width:386px; margin:30px 0 0 30px; font-size:12px; position:absolute;}
  24
+	#logo{position:absolute; margin:20px 0 0 20px;}
  25
+	#company_name{font-size:26px;font-weight:normal;text-transform: none;color: #ff8400; font-family:Tahoma, Geneva, sans-serif; margin:25px 0 0 95px; width:300px; position:absolute;}
  26
+
  27
+
  28
+#menu {
  29
+  color: #FFF;
  30
+  padding: 10px 0 0;
  31
+  white-space: nowrap; 
  32
+  height:50px;
  33
+}
  34
+/*	#menu .item{padding:0 18px; background:url('mbg.png') repeat-x; font-size:14px; vertical-align:top; line-height:35px;}*/
  35
+/*	#menu a{text-decoration: none;color: #FFF;}*/
  36
+/*	#menu a:hover{color: #FFF;text-decoration: underline;}*/
  37
+/*	*/
  38
+/*	#menu {*/
  39
+/*	  float:center;*/
  40
+/*	  ul{*/
  41
+/*	    list-style-type:none; */
  42
+/*	    li {*/
  43
+/*	      font-size:14px;*/
  44
+/*	      padding:0 18px;*/
  45
+/*	      vertical-align:top; */
  46
+/*	      line-height:35px;*/
  47
+/*	      text-align:center;*/
  48
+/*	      display: inline;*/
  49
+/*	      background: url('mbg.png') repeat-x;*/
  50
+/*	      a {*/
  51
+/*	        text-decoration:none;*/
  52
+/*	        color: #FFF;*/
  53
+/*	      }*/
  54
+/*	    }*/
  55
+/*	  }*/
  56
+/*  }*/
  57
+#example-one { 
  58
+  margin: 0 auto;
  59
+  list-style: none;
  60
+  position: relative;
  61
+  width: 960px;
  62
+  li { display: inline;
  63
+    a { color: #bbb; font-size: 14px; display: block; float: left; padding: 6px 10px 4px 10px; text-decoration: none; text-transform: uppercase; }
  64
+    a:hover { color: white; }
  65
+  }
  66
+}
  67
+#magic-line { position: absolute; bottom: -2px; left: 0; width: 100px; height: 2px; background: #fe4902; }
  68
+#search {
  69
+  float:right;
  70
+  padding-top: 4px;
  71
+  #q {
  72
+  -webkit-border-radius:8px;
  73
+  -moz-border-radius:8px;
  74
+  border-radius:8px;
  75
+  -o-border-radius:8px;
  76
+  height:20px;
  77
+  width:200px;
  78
+  border:none;
  79
+  float:left;
  80
+  }
  81
+  #q:hover{
  82
+    border:none; 
  83
+  }
  84
+  #submit-search{
  85
+    position:relative;
  86
+    left:-19px;
  87
+    border:none;
  88
+    background:#fff url("search1.png") no-repeat 0px;
  89
+    width:20px;
  90
+    height:20px;
  91
+    -webkit-border-radius:8px;
  92
+    -moz-border-radius:8px;
  93
+    border-radius:8px;
  94
+    -o-border-radius:8px;
  95
+  }
  96
+  #submit-search:hover{
  97
+    cursor:pointer;
  98
+  }
  99
+}
  100
+
  101
+
  102
+#contentwrap{position:relative; overflow:hidden;}
  103
+	#body_area{color:#000;text-align: justify;padding:0 0 10px;vertical-align: top; float:left; width:620px; font-size:12px; margin:20px 0 0 15px;}
  104
+	#sidebar{float:right; width:240px; margin-top:25px;}
  105
+	#sidebar .banner{margin-bottom:10px;}
  106
+	#login_form{height: 20px;width: 150px;font-size: 12px;}
  107
+
  108
+#footer{height:70px; background:#8ec227 url('footer_bg.png') repeat-x top; margin-top:-70px;}
  109
+	#bottom_menu{width:880px;margin:0 auto;color:#fff;text-align:left;padding: 15px 0px 4px; font-size:12px;}
  110
+	#bottom_menu a{color:#fff;text-decoration:underline; padding:0 10px;}
  111
+	#bottom_menu a:hover{color:#000;text-decoration:underline;}
  112
+
  113
+	#bottom_addr{width:860px;margin:0 auto;color:#000;text-align:left;padding: 4px 0px 15px; font-size:11px;}
  114
+	#bottom_addr a{text-decoration:underline;}
  115
+	#bottom_addr a:hover{text-decoration: underline;}
3  app/assets/stylesheets/authentications.css.scss
... ...
@@ -0,0 +1,3 @@
  1
+// Place all the styles related to the authentications controller here.
  2
+// They will automatically be included in application.css.
  3
+// You can use Sass (SCSS) here: http://sass-lang.com/
4  app/assets/stylesheets/testing.css
... ...
@@ -0,0 +1,4 @@
  1
+ /*
  2
+ *= require_self
  3
+ *=require_directory ./testing
  4
+*/
3  app/assets/stylesheets/universities.css.scss
... ...
@@ -0,0 +1,3 @@
  1
+// Place all the styles related to the universities controller here.
  2
+// They will automatically be included in application.css.
  3
+// You can use Sass (SCSS) here: http://sass-lang.com/
13  app/controllers/authentications_controller.rb
... ...
@@ -0,0 +1,13 @@
  1
+class AuthenticationsController < ApplicationController
  2
+  
  3
+  def index
  4
+    @authentications = current_user.authentications if current_user
  5
+  end
  6
+  
  7
+  def create
  8
+    auth = request.env["rack.auth"]
  9
+    current_user.authentications.find_or_create_by_provider_and_uid(auth['provider'], auth['uid'])
  10
+    flash[:notice] = "Authentication successful."
  11
+    redirect_to authentications_url    
  12
+  end
  13
+end
1  app/controllers/test_names_controller.rb
... ...
@@ -1,6 +1,7 @@
1 1
 #encoding:UTF-8
2 2
 class TestNamesController < ApplicationController
3 3
   respond_to :html
  4
+  layout 'testing'
4 5
    
5 6
   def index
6 7
     @tests = TestName.all
7  app/controllers/universities_controller.rb
... ...
@@ -0,0 +1,7 @@
  1
+#encoding:UTF-8
  2
+class UniversitiesController < ApplicationController
  3
+
  4
+  def index
  5
+    @title = "Университеты"    
  6
+  end
  7
+end
2  app/helpers/authentications_helper.rb
... ...
@@ -0,0 +1,2 @@
  1
+module AuthenticationsHelper
  2
+end
2  app/helpers/universities_helper.rb
... ...
@@ -0,0 +1,2 @@
  1
+module UniversitiesHelper
  2
+end
3  app/models/authentication.rb
... ...
@@ -0,0 +1,3 @@
  1
+class Authentication < ActiveRecord::Base
  2
+  belongs_to :user
  3
+end
2  app/models/university.rb
... ...
@@ -0,0 +1,2 @@
  1
+class University < ActiveRecord::Base
  2
+end
1  app/models/user.rb
... ...
@@ -1,5 +1,6 @@
1 1
 #encoding:UTF-8
2 2
 class User < ActiveRecord::Base
  3
+  has_many :authentications
3 4
   has_secure_password
4 5
   
5 6
   attr_accessible :email, :password, :password_confirmation
23  app/views/authentications/index.html.erb
... ...
@@ -0,0 +1,23 @@
  1
+<% if @authentications %>
  2
+  <% unless @authentications.empty? %>
  3
+    <p><strong>You can sign in to this account using:</strong></p>
  4
+    <div class="authentications">
  5
+      <% for authentication in @authentications %>
  6
+        <div class="authentication">
  7
+          <%= image_tag "#{authentication.provider}_32.png", :size => "32x32" %>
  8
+          <div class="provider"><%= authentication.provider.titleize %></div>
  9
+          <div class="uid"><%= authentication.uid %></div>
  10
+          <%= link_to "X", authentication, :confirm => 'Are you sure you want to remove this authentication option?', :method => :delete, :class => "remove" %>
  11
+        </div>
  12
+      <% end %>
  13
+      <div class="clear"></div>
  14
+    </div>
  15
+  <% end %>
  16
+  <p><strong>Add another service to sign in with:</strong></p>
  17
+<% else %>
  18
+  <p><strong>Sign in through one of these services:</strong></p>
  19
+<% end %>
  20
+<a href="/auth/facebook" class="auth_provider">
  21
+  <%= image_tag "facebook_64.png", :size => "60x60", :alt => "Facebook" %>
  22
+  Facebook
  23
+</a>
11  app/views/kaminari/_first_page.html.erb
... ...
@@ -0,0 +1,11 @@
  1
+<%# Link to the "First" page
  2
+  - available local variables
  3
+    url:           url to the first page
  4
+    current_page:  a page object for the currently displayed page
  5
+    num_pages:     total number of pages
  6
+    per_page:      number of items to fetch per page
  7
+    remote:        data-remote
  8
+-%>
  9
+<li class="first">
  10
+  <%= link_to_unless current_page.first?, raw(t 'views.pagination.first'), url, :remote => remote %>
  11
+</li>
8  app/views/kaminari/_gap.html.erb
... ...
@@ -0,0 +1,8 @@
  1
+<%# Non-link tag that stands for skipped pages...
  2
+  - available local variables
  3
+    current_page:  a page object for the currently displayed page
  4
+    num_pages:     total number of pages
  5
+    per_page:      number of items to fetch per page
  6
+    remote:        data-remote
  7
+-%>
  8
+<li class="page gap"><%= raw(t 'views.pagination.truncate') %></li>
11  app/views/kaminari/_last_page.html.erb
... ...
@@ -0,0 +1,11 @@
  1
+<%# Link to the "Last" page
  2
+  - available local variables
  3
+    url:           url to the last page
  4
+    current_page:  a page object for the currently displayed page
  5
+    num_pages:     total number of pages
  6
+    per_page:      number of items to fetch per page
  7
+    remote:        data-remote
  8
+-%>
  9
+<li class="last">
  10
+  <%= link_to_unless current_page.last?, raw(t 'views.pagination.last'), url, {:remote => remote} %>
  11
+</li>
11  app/views/kaminari/_next_page.html.erb
... ...
@@ -0,0 +1,11 @@
  1
+<%# Link to the "Next" page
  2
+  - available local variables
  3
+    url:           url to the next page
  4
+    current_page:  a page object for the currently displayed page
  5
+    num_pages:     total number of pages
  6
+    per_page:      number of items to fetch per page
  7
+    remote:        data-remote
  8
+-%>
  9
+<li class="next">
  10
+  <%= link_to_unless current_page.last?, raw(t 'views.pagination.next'), url, :rel => 'next', :remote => remote %>
  11
+</li>
12  app/views/kaminari/_page.html.erb
... ...
@@ -0,0 +1,12 @@
  1
+<%# Link showing page number
  2
+  - available local variables
  3
+    page:          a page object for "this" page
  4
+    url:           url to this page
  5
+    current_page:  a page object for the currently displayed page
  6
+    num_pages:     total number of pages
  7
+    per_page:      number of items to fetch per page
  8
+    remote:        data-remote
  9
+-%>
  10
+<li class="page<%= ' current' if page.current? %>">
  11
+  <%= link_to_unless page.current?, page, url, opts = {:remote => remote, :rel => page.next? ? 'next' : page.prev? ? 'prev' : nil} %>
  12
+</li>
25  app/views/kaminari/_paginator.html.erb
... ...
@@ -0,0 +1,25 @@
  1
+<%# The container tag
  2
+  - available local variables
  3
+    current_page:  a page object for the currently displayed page
  4
+    num_pages:     total number of pages
  5
+    per_page:      number of items to fetch per page
  6
+    remote:        data-remote
  7
+    paginator:     the paginator that renders the pagination tags inside
  8
+-%>
  9
+<%= paginator.render do -%>
  10
+  <div class="pagination">
  11
+    <ul>
  12
+    <%= first_page_tag unless current_page.first? %>
  13
+    <%= prev_page_tag unless current_page.first? %>
  14
+    <% each_page do |page| -%>
  15
+      <% if page.left_outer? || page.right_outer? || page.inside_window? -%>
  16
+        <%= page_tag page %>
  17
+      <% elsif !page.was_truncated? -%>
  18
+        <%= gap_tag %>
  19
+      <% end -%>
  20
+    <% end -%>
  21
+    <%= next_page_tag unless current_page.last? %>
  22
+    <%= last_page_tag unless current_page.last? %>
  23
+    </ul>
  24
+  </div>
  25
+<% end -%>
11  app/views/kaminari/_prev_page.html.erb
... ...
@@ -0,0 +1,11 @@
  1
+<%# Link to the "Previous" page
  2
+  - available local variables
  3
+    url:           url to the previous page
  4
+    current_page:  a page object for the currently displayed page
  5
+    num_pages:     total number of pages
  6
+    per_page:      number of items to fetch per page
  7
+    remote:        data-remote
  8
+-%>
  9
+<li class="prev">
  10
+  <%= link_to_unless current_page.first?, raw(t 'views.pagination.previous'), url, :rel => 'prev', :remote => remote %>
  11
+</li>
19  app/views/layouts/_login.html.erb
... ...
@@ -0,0 +1,19 @@
  1
+    <% if current_user %>
  2
+      <div id="current_user">
  3
+      <%= current_user.email %>
  4
+      <%= link_to 'Выйти', logout_path %>
  5
+      </div>
  6
+    <% else %>
  7
+    <div id="topnav"><span><%= link_to 'Регистрация', signup_path, :class => "signup" %></span><span><%= link_to 'Вход', login_path, :class => "login" %></span></div>       
  8
+      <fieldset id="login_menu">
  9
+        <%= form_tag(sessions_path, :id => "login") do %>
  10
+          <%= label_tag :email, "Email" %>
  11
+          <%= email_field_tag :email %>
  12
+  
  13
+          <%= label_tag :password, "пароль" %>
  14
+          <%= password_field_tag :password %>
  15
+  
  16
+          <%= submit_tag "Войти", :id => "login_submit" %>
  17
+        <% end %>
  18
+      </fieldset>
  19
+    <% end %>
63  app/views/layouts/application.html.erb
@@ -2,39 +2,25 @@
2 2
 <html>
3 3
 <head>
4 4
   <title>EducationWebsite</title>
  5
+  <%= favicon_link_tag %>
5 6
   <%= stylesheet_link_tag    "application", :media => "all" %>
6 7
   <%= javascript_include_tag "application" %>
7 8
   <%= csrf_meta_tags %>
8 9
 </head>
9 10
 <body>
10 11
 <div id="wrap">
  12
+
  13
+  <!--login-->
  14
+  <%= render  'layouts/login' %>  
  15
+  <!--end login-->
11 16
   
12  
-    <% if current_user %>
13  
-      <div id="current_user">
14  
-      <%= current_user.email %>
15  
-      <%= link_to 'Выйти', logout_path %>
16  
-      </div>
17  
-    <% else %>
18  
-    <div id="topnav">Уже?<span><%= link_to 'Вход', login_path, :class => "login" %></span></div>       
19  
-      <fieldset id="login_menu">
20  
-        <%= form_tag(sessions_path, :id => "login") do %>
21  
-          <%= label_tag :email, "Email" %>
22  
-          <%= email_field_tag :email %>
23  
-  
24  
-          <%= label_tag :password, "пароль" %>
25  
-          <%= password_field_tag :password %>
26  
-  
27  
-          <%= submit_tag "Вход", :id => "login_submit" %>
28  
-        <% end %>
29  
-      </fieldset>
30  
-    <% end %>
31 17
   <div id="page">
32 18
   <!--top-->
33 19
   <div id="top">
34 20
     <div id="logo"><%= link_to image_tag('logo.png'), root_path  %></div>
35 21
     <div id="company_name">Сайт для абитуриентов</div>
36 22
 
37  
-    <div id="search-box">
  23
+<!--    <div id="search-box">
38 24
       <table width="100%" border="0" cellspacing="0" cellpadding="0">
39 25
         <tr>
40 26
           <td><input type="text" class="search-area"></td>
@@ -43,33 +29,28 @@
43 29
         </tr>
44 30
       </table>
45 31
     </div>
46  
-
  32
+-->
47 33
   </div>
48 34
   <!--end top-->
49 35
   <div id="menu">
50  
-    <table border="0" align="center" cellpadding="0" cellspacing="0">
51  
-    <tr>
52  
-      <td width="11"><img src="/assets/ml.png" width="11" height="33" alt=""></td>
53  
-      <td class="item"><%= link_to 'Главная', root_path %></td>
54  
-      <td width="42"><img src="/assets/ms.png" width="42" height="33" alt=""></td>
55  
-      <td class="item"><%= link_to 'О нас', about_path %></td>
56  
-      <td width="42"><img src="/assets/ms.png" width="42" height="33" alt=""></td>
57  
-      <td class="item"><%= link_to 'Тестирование', test_names_path %></td>
58  
-      <td width="42"><img src="/assets/ms.png" width="42" height="33" alt=""></td>
59  
-      <td class="item"><%= link_to 'ссылка4', new_user_path %></td>
60  
-      <td width="42"><img src="/assets/ms.png" width="42" height="33" alt=""></td>
61  
-      <td class="item"><%= link_to 'ссылка5', "#"  %></td>
62  
-      <td width="42"><img src="/assets/ms.png" width="42" height="33" alt=""></td>
63  
-      <td class="item"><%= link_to 'ссылка6', "#" %></td>
64  
-      <td width="11"><img src="/assets/mr.png" width="11" height="33" alt=""></td>
65  
-    </tr>
66  
-    </table>
  36
+    <ul id="example-one">
  37
+      <li class="current_page_item"><%= link_to 'Главная', root_path %></li>
  38
+      <li><%= link_to 'О нас', about_path  %></li>
  39
+      <li><%= link_to 'Тестирование', test_names_path %></li>
  40
+      <li><%= link_to 'ВУЗЫ', universities_path %></li>
  41
+      <li></li>
  42
+    </ul>
  43
+    <div id="search">
  44
+      <%= form_tag sessions_path do %>
  45
+        <%= text_field_tag :q, nil %>
  46
+        <%= submit_tag "", :id => 'submit-search' %>
  47
+      <% end %>
  48
+    </div>
67 49
   </div>
68 50
   
69 51
   <div id="header">
70 52
     <div id="intro">Выпускной класс... Позади годы, проведенные в школе, впереди - взрослая жизнь. И для многих выпускников один из первых шагов в этой жизни - поступление в ВУЗ. Университеты, институты, академии - как выбрать из множества ВУЗов именно тот, который нужен тебе? На какую специальность поступать учиться? Но для поступления в ВУЗ недостаточно только желания ! Необходимо еще иметь достаточно высокий уровень знаний, позволяющий поступить в выбранный университет или академию. </div>
71 53
 
72  
-
73 54
   </div>
74 55
   <div id="contentwrap">
75 56
     <div id="body_area">
@@ -80,11 +61,11 @@
80 61
 </div>
81 62
 
82 63
 
83  
-<!--<div id="footer">
  64
+<div id="footer">
84 65
 	<div id="bottom_menu"><a href="#">Главная</a> |  <a href="#">О нас</a> |  <a href="#">Тестирование</a> |  <a href="#">ссылка4</a> |  <a href="#">ссылка5</a> |  <a href="#">ссылка6</a></div>
85 66
 	<div id="bottom_addr">© 2012. All Rights Reserved</div>
86 67
 </div>
87  
--->
  68
+
88 69
 
89 70
 </body>
90 71
 </html>
13  app/views/layouts/testing.html.erb
... ...
@@ -0,0 +1,13 @@
  1
+<!DOCTYPE html>
  2
+<html>
  3
+<head>
  4
+  <title>EducationWebsite</title>
  5
+  <%= stylesheet_link_tag    "admin", :media => "all" %>
  6
+  <%= javascript_include_tag "testing" %>
  7
+  <%= csrf_meta_tags %>
  8
+</head>
  9
+<body>
  10
+<%= link_to 'Выход', root_path %>
  11
+<%= yield %>
  12
+</body>
  13
+</html>
1  app/views/universities/index.html.erb
... ...
@@ -0,0 +1 @@
  1
+Вузы
2  app/views/users/new.html.erb
... ...
@@ -1,7 +1,7 @@
1 1
 <% flash.each do |name, msg| %>
2 2
   <%= msg %>
3 3
 <% end %>
4  
-<%= form_for @user do |f| %>
  4
+<%= form_for(@user, :id => "signup") do |f| %>
5 5
   <%= f.label :email %>
6 6
   <%= f.email_field :email %>
7 7
   
3  config/initializers/omniauth.rb
... ...
@@ -0,0 +1,3 @@
  1
+Rails.application.config.middleware.use OmniAuth::Builder do
  2
+  provider :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET']
  3
+end
4  config/routes.rb
... ...
@@ -1,5 +1,9 @@
1 1
 EducationWebsite::Application.routes.draw do
2 2
 
  3
+  resources :authentications
  4
+  match '/auth/:provider/callback' => 'authentications#create' 
  5
+  resources :universities
  6
+
3 7
   resources :users
4 8
   resource :sessions
5 9
   
9  db/migrate/20120414092156_create_universities.rb
... ...
@@ -0,0 +1,9 @@
  1
+class CreateUniversities < ActiveRecord::Migration
  2
+  def change
  3
+    create_table :universities do |t|
  4
+      t.string :name
  5
+      t.text :description
  6
+      t.timestamps
  7
+    end
  8
+  end
  9
+end
11  db/migrate/20120416101839_create_authentications.rb
... ...
@@ -0,0 +1,11 @@
  1
+class CreateAuthentications < ActiveRecord::Migration
  2
+  def change
  3
+    create_table :authentications do |t|
  4
+      t.integer :user_id
  5
+      t.string :provider
  6
+      t.string :uid
  7
+
  8
+      t.timestamps
  9
+    end
  10
+  end
  11
+end
17  db/schema.rb
@@ -11,7 +11,15 @@
11 11
 #
12 12
 # It's strongly recommended to check this file into your version control system.
13 13
 
14  
-ActiveRecord::Schema.define(:version => 20120409073536) do
  14
+ActiveRecord::Schema.define(:version => 20120416101839) do
  15
+
  16
+  create_table "authentications", :force => true do |t|
  17
+    t.integer  "user_id"
  18
+    t.string   "provider"
  19
+    t.string   "uid"
  20
+    t.datetime "created_at", :null => false
  21
+    t.datetime "updated_at", :null => false
  22
+  end
15 23
 
16 24
   create_table "questions", :force => true do |t|
17 25
     t.string   "title"
@@ -32,6 +40,13 @@
32 40
     t.text     "description"
33 41
   end
34 42
 
  43
+  create_table "universities", :force => true do |t|
  44
+    t.string   "name"
  45
+    t.text     "description"
  46
+    t.datetime "created_at",  :null => false
  47
+    t.datetime "updated_at",  :null => false
  48
+  end
  49
+
35 50
   create_table "users", :force => true do |t|
36 51
     t.string   "email"
37 52
     t.string   "password_digest"
5  spec/controllers/authentications_controller_spec.rb
... ...
@@ -0,0 +1,5 @@
  1
+require 'spec_helper'
  2
+
  3
+describe AuthenticationsController do
  4
+
  5
+end
5  spec/controllers/universities_controller_spec.rb
... ...
@@ -0,0 +1,5 @@
  1
+require 'spec_helper'
  2
+
  3
+describe UniversitiesController do
  4
+
  5
+end
9  spec/factories/authentications.rb
... ...
@@ -0,0 +1,9 @@
  1
+# Read about factories at http://github.com/thoughtbot/factory_girl
  2
+
  3
+FactoryGirl.define do
  4
+  factory :authentication do
  5
+    user_id 1
  6
+    provider "MyString"
  7
+    uid "MyString"
  8
+  end
  9
+end
6  spec/factories/universities.rb
... ...
@@ -0,0 +1,6 @@
  1
+# Read about factories at http://github.com/thoughtbot/factory_girl
  2
+
  3
+FactoryGirl.define do
  4
+  factory :university do
  5
+  end
  6
+end
15  spec/helpers/authentications_helper_spec.rb
... ...
@@ -0,0 +1,15 @@
  1
+require 'spec_helper'
  2
+
  3
+# Specs in this file have access to a helper object that includes
  4
+# the AuthenticationsHelper. For example:
  5
+#
  6
+# describe AuthenticationsHelper do
  7
+#   describe "string concat" do
  8
+#     it "concats two strings with spaces" do
  9
+#       helper.concat_strings("this","that").should == "this that"
  10
+#     end
  11
+#   end
  12
+# end
  13
+describe AuthenticationsHelper do
  14
+  pending "add some examples to (or delete) #{__FILE__}"
  15
+end
15  spec/helpers/universities_helper_spec.rb
... ...
@@ -0,0 +1,15 @@
  1
+require 'spec_helper'
  2
+
  3
+# Specs in this file have access to a helper object that includes
  4
+# the UniversitiesHelper. For example:
  5
+#
  6
+# describe UniversitiesHelper do
  7
+#   describe "string concat" do
  8
+#     it "concats two strings with spaces" do
  9
+#       helper.concat_strings("this","that").should == "this that"
  10
+#     end
  11
+#   end
  12
+# end
  13
+describe UniversitiesHelper do
  14
+  pending "add some examples to (or delete) #{__FILE__}"
  15
+end
5  spec/models/authentication_spec.rb
... ...
@@ -0,0 +1,5 @@
  1
+require 'spec_helper'
  2
+
  3
+describe Authentication do
  4
+  pending "add some examples to (or delete) #{__FILE__}"
  5
+end
5  spec/models/university_spec.rb
... ...
@@ -0,0 +1,5 @@
  1
+require 'spec_helper'
  2
+
  3
+describe University do
  4
+  pending "add some examples to (or delete) #{__FILE__}"
  5
+end

No commit comments for this range

Something went wrong with that request. Please try again.