CSC/ECE 517 Fall 2013/ch2 0e808 nsv: Difference between revisions
Line 230: | Line 230: | ||
* Cloud 66 | * Cloud 66 | ||
= yml files = | = yml files' changes = | ||
[[File:Capistrano.jpg|frame|right|<ref>http://www.capistranorb.com/</ref>|Capistrano Logo]] | [[File:Capistrano.jpg|frame|right|<ref>http://www.capistranorb.com/</ref>|Capistrano Logo]] |
Revision as of 01:37, 31 October 2013
E808: Refactor and test Participant, AssignmentParticipant, & CourseParticipant
The requirements provided for the Open Source System project were as follows :
Classes:
participant.rb (197 lines)
assignment_participant.rb (476 lines)
course_participant.rb (90 lines)
What they do:
These classes keep track of a user who is participating in an assignment or a course. participant.rb is the superclass, and the other two are the subclasses.
What is needed:
The methods are complex; there are a lot of them (assignment_particpant has 44) and there is a lot of duplicated code. assignment_participant contains code for detecting cycles of high grades (which can indicate collusion in reviews). It would be better moved to another class.
Introduction
A cursory analysis of the code of the three model classes showed the existence of code duplication. In a lot of the cases the Don't Repeat Yourself (DRY) principle was violated.
In keeping with the Agile methodology, which involves having regular discussions with all stakeholders, the design check for the project was performed with a meeting with the Instructor.
UML Class Diagram
A subset of the [UML] class diagram including only the related classes for this project can be drawn as shown.
The participant is the superclass for subclasses AssignmentParticipant and CourseParticipant. In the database to actually distinguish between these a type attribute is used which can take values as 'AssignmentParticipant' or 'CourseParticipant' while a participant that does not belong to either an assignment nor a course cannot exist in the system as he just becomes a user and not a participant.
A participant has a user i.e. only a user can become a participant.
An AssignmentParticipant has an assignment and a CourseParticipant has a course. This relationship is defined by the parent_id attribute of a participant.
Participant model: participant.rb
The Participant model class being the base class should only contain code or methods that are relevant or needed by both the subclasses. But instead , it was cluttered with methods that would be better placed in one of the child classes as they are relevant to only that subclass. Such methods were moved to the respective sub-classes. Also certain functionalities that were common between both subclasses were repeated in both leading to code repetition. Such methods were moved to Participant class and will be dealt with in the later sections of this article. Several methods in Participant model required renaming and refactoring to ensure that the change is reflected in the entire project. The names were changed to follow method naming convention. Deprecated code was removed and re-coded to ensure that the code worked in future versions of Rails as well.
Sr. No. | Method Name | Changes Made | Reason For Change |
---|---|---|---|
1 | able_to_submit | It has been commented out. | Method not called or used anywhere. Also the method just returned the value of the attribute submit_allowed which is already taken care of by attr_accessors. |
2 | force_delete | The deprecated code in this method has been changed. | To ensure the code works in future versions of Rails. |
3 | get_average_question_score | Renamed to average_question_score and refactored. | To conform to method naming convention. |
4 | get_average_score | Renamed to average_score and refactored also moved to the model assignment_participant.rb. Removed empty parentheses from declaration | The new name is more in keeping with method naming conventions. Removal of empty parentheses helps with poetry mode of code. The method was moved because calculation of average score is only relevant to AssignmentParticipant and not to CourseParticipant. |
5 | get_current_stage | Moved to the model - assignment_participants.rb | The method was moved because getting current stage of an assignment is only relevant to AssignmentParticipant and not to CourseParticipant. |
6 | get_stage_deadline | Moved to model - assignment_participant.rb | Just like get_current_stage, this method too is only relevant to AssignmentParticipant and not to CourseParticipant. |
7 | get_topic_string | Renamed to topic_string and refactored. | To follow method naming convention |
8 | review_response_maps | Moved to model - assignment_participant.rb | Reviews are made only on assignments and hence ReviewResponseMaps would only exist for between the participants of an assignment. Thus this method would be better placed in AssignmentParticipant. |
After changes were made, the existing tests ran successfully.
AssignmentParticipant model: assignment_participant.rb
Several methods in AssignmentParticipant model class required renaming and refactoring to ensure that the change is reflected in the entire project. The names were changed to follow method naming conventions in Ruby. Deprecated code was removed and re-coded to ensure that the code worked in future version of Rails as well. Duplicate codes were commented out. Methods that are more general in the sub classes were moved to the parent class. Some methods that calculate the collusion in reviews between students were moved to a newly created model class called CollusionCycle in file collusion_cycle.rb .
Sr. No. | Method Name | Changes Made | Reason For Change |
---|---|---|---|
1 | get_course_string | Renamed to course_string and refactored | To follow method naming convention |
2 | get_cycle_deviation_score | Moved to collusion_cycle.rb model class | Related methods that calculate collusion in reviews have been moved to the newly created collusion_cycle.rb model class |
3 | get_cycle_similarity_score | Moved to collusion_cycle.rb model class | Related methods that calculate collusion in reviews have been moved to the newly created collusion_cycle.rb model class |
4 | get_feedback | Renamed to feedback and refactored | To follow method naming convention |
5 | get_files | Renamed to files_in_directory and refactored | To follow method naming convention |
6 | get_four_node_cycles | Moved to collusion_cycle.rb model class | Related methods that calculate collusion in reviews have been moved to the newly created collusion_cycle.rb model class |
7 | fullname | Moved to parent model class – participant.rb | General methods of the subclass are moved to Parent class |
8 | get_metareviews | Renamed to metareviews and refactored | To follow method naming convention |
9 | name | Commented the method | The method is already in parent model class – participant.rb and can be used in this subclass through inheritance |
10 | name | Commented the method | The method is already in parent model class – participant.rb and can be used in this subclass through inheritance. Also it is a duplicate method in patricipant.rb |
11 | get_review_score | Renamed to review_score and refactored. Deprecated code has been removed and replaced with correct code. | To follow method naming convention and ensure the code works in future versions. |
12 | get_reviewees | Renamed to reviewees and refactored. Deprecated code has been removed and replaced with correct code. | To follow method naming convention and ensure the code works in future versions. |
13 | get_reviewers | Renamed to reviewers and refactored . Deprecated code has been commented and replaced with correct code. | To follow method naming convention and ensure the code works in future versions. |
14 | get_reviews | Renamed to reviews and refactored | To follow method naming convention |
15 | get_reviews_by_reviewer | Renamed to reviews_by_reviewer and refactored | To follow method naming convention |
16 | get_reviews_by_reviewer | Commented the method | To remove duplicated method in this class |
17 | get_scores | Renamed to scores and refactored | To follow method naming convention |
18 | get_submitted_files | Renamed to submitted_files and refactored | To follow method naming convention |
19 | get_teammate_reviews | Renamed to teammate_reviews and refactored | To follow method naming convention |
20 | get_three_node_cycles | Moved to collusion_cycle.rb model class | Related methods that calculate collusion in reviews have been moved to the newly created collusion_cycle.rb model class |
21 | get_topic_string | Method has been Commented | It is already present in model super class – participant.rb |
22 | get_two_node_cycles | Moved to collusion_cycle.rb model class | Related methods that calculate collusion in reviews have been moved to the newly created collusion_cycle.rb model class |
23 | get_wiki_submissions | Renamed to wiki_submissions and refactored | To follow method naming convention |
After changes were made, the existing tests ran successfully.
CourseParticipant model:course_participant.rb
<ref>http://www.urbancode.com/html/solutions/deployment-automation.html</ref> Automation of a process is required when the manual process is more error prone. Also, for large real world applications, the manual process is very complex and time consuming. Incomplete documentation hampers a manual process further. Deployment also has to be done in many environments and involves varied steps to be followed in a specific order. Manual process needs repetition of same procedure to each and every environment which leads to many errors and the process becomes costly. In web applications each new release has to be deployed to and tested in development, testing and production environments.The number of software releases in web applications are more and hence the need to automate release management is also greater.
Automation of deployment delivers applications faster and with fewer errors. The defined software deployment process can be applied across all environments consistently every time. With various automated application deployment platforms now readily available, manual deployments have become a thing of the past.
Lets take a look at the various Deployment Automation tools available to Ruby on Rails applications. For the purposes of this article the process of manual deployment of a Ruby on Rails application is out of scope.
Tests
Some of the automated tools that are widely used for the process of deployment with Ruby on Rails are
- Capistrano
- Heroku
- Vlad
- AppFog
- AWS Elastic Beanstalk
- OpenShift
- Cloud 66
yml files' changes
Capistrano is a Ruby tool which helps deploy an application to the server. Capistrano allows deploying to multiple machines at a time. It has many advanced options which help to deploy different kinds of applications. It also supports the scripting and execution of tasks.
Capistrano can be used to:
- Deploy applications onto many machines simultaneously.
- Automate the audits
- Automate the common tasks of a team.
Capistrano can be made a part of a larger software by integrating it with another Ruby software.
<ref>http://www.capistranorb.com/documentation/getting-started/installation/</ref>
General Usage
The following commands will clone Capistrano, build the gem and install it locally.
$ gem install capistrano --pre --trust-policy HighSecurity
Or grab the bleeding edge head from:
$ git clone -b v3 https://github.com/capistrano/capistrano.git $ cd capistrano $ gem build *.gemspec $ gem install *.gem
Signed Rubygems
As Capistrano is a signed gem, you should always be careful to use the --trust-policy flag when installing Gems, or since Bundler 1.3 you should use the same flag:
$ gem install capistrano --pre --trust-policy HighSecurity $ bundle install --trust-policy HighSecurity
If you get a message that looks like:
ERROR: While executing gem ... (Gem::Security::Exception) unsigned gems are not allowed by the High Security policy
Then please complain to your Gem author, and have them start signing their Gems.
Usage in a Rails project
Add the following lines to the Gemfile to the :development group ideally.
group :development do gem 'capistrano-rails', '~> 0.0.7' end
routes.rb
Heroku is a cloud Platform as a Service (PaaS) which supports several programming languages. PaaS is a service model of Cloud computing wherein the provider offers resources like servers, software, database, etc. to the developer. Heroku helps manage environment-specific configurations separately from the source code, which provides greater security.
Heroku is not just a deployment environment but it also impacts the development process. There are several principles of the development of application on Heroku.
• Applications and Codebases : Most of the development of the application is done on application’s codebase which is stored in a Version Control System (VCS)
• Dependencies : All the application dependencies such as plugins should be declared explicitly
• Configuration : Configuration of an application is all that varies in different deploys
Getting Started with Heroku
1. To get started with Heroku, go to https://id.heroku.com/signup/devcenter, signup for a Heroku account.
2. Then, download and install the Heroku toolbelt at https://toolbelt.heroku.com/ for your development system. You can also use Heroku command line instead of the online Heroku application.
3. After installing one of them, login using the email address and password used when creating the Heroku account:
<ref>https://github.com/heroku/heroku</ref>
$ heroku login Enter your Heroku credentials. Email: adam@example.com Password: Could not find an existing public key. Would you like to generate one? [Yn] Generating new SSH public key. Uploading SSH public key /Users/adam/.ssh/id_rsa.pub
Deploying Applications
Heroku uses git primarily to deploy the applications. When an application is created on Heroku, it associates the new git which is remote with the local git repository.
As a result, deploying code is just the familiar git push, but to the heroku remote instead:
<ref>https://devcenter.heroku.com/articles/how-heroku-works#deploying-applications</ref>
$ git push heroku master
Vlad
Vlad is another automated deployment tool which is simple to use. It integrates with rake and uses standard tools like SSH, rsync etc.
The main features of Vlad include
- It uses very few dependencies which are simple.
- It can execute commands on more than one server.
- It syncs files to one or more servers.
- It matches local and remote tasks.
- It runs tests very fast.
Getting started with Vlad<ref>http://docs.seattlerb.org/vlad/doco/getting_started_txt.html</ref>
Create a deploy file, usually in “config/deploy.rb”:
set :application, "project" set :domain, "example.com" set :deploy_to, "/path/to/install" set :repository, 'http://svn.example.com/project/branches/stable/'
This defaults to using ‘svn export’ from repository, and a single server for app, db, and www.
If you want a multi-config environment, change your config like so:
set :application, "project" set :repository, 'http://svn.example.com/project/branches/stable/' task :beta do set :domain, "beta.example.com" set :deploy_to, "/path/to/install-beta" end task :dev do set :domain, "dev.example.com" set :deploy_to, "/path/to/install-dev" end task :prod do set :domain, "example.com" set :deploy_to, "/path/to/install" end
Add the following to your Rakefile:
begin require 'vlad' Vlad.load rescue LoadError # do nothing end
Vlad.load has a lot of flexibility.
You can install vlad via:
% rake vlad:invoke COMMAND='sudo gem install vlad -y'
Initial Launch
Run rake vlad:setup vlad:update vlad:migrate vlad:start
<ref>http://docs.seattlerb.org/vlad/index.html</ref>
Running Vlad
- Using rake
task :shazam! do Rake::Task[:action1].invoke Rake::Task[:action2].invoke end
- Using SSH
Host example.com User fluffy_bunny
AppFog
AppFog is a PaaS built on Cloud Foundry which is another PaaS platform for deploying applications.
Features of AppFog are
- It launches and runs fast.
- It does not require configuring servers or installing frameworks.
- It is compatible with code management systems like git, svn etc.
Installing AppFog<ref>http://blog.appfog.com/getting-started-with-appfogs-command-line/</ref>
‘af‘ command line tool is written in Ruby for installation.
Download and install Ruby Installer for Windows. The installer already includes RubyGems.
Be sure you use the Ruby-enabled command prompt window when you later install and use af. You access this command prompt from the Windows Start menu (All Programs > Ruby > Start Command Prompt with Ruby).
Finally, update RubyGems from the Ruby Command Prompt:
$ gem update --system $ gem install af
Login with:
$ af login
Finally from within your source code directory:
$ af update hello-node
Getting Started with AppFog
target [url] Reports current target or sets a new target login [email] [--email, --password] Login info System and account information
AWS Elastic Beanstalk
Amazon Wen Services(AWS) offers Infrastructure as a Service (IaaS) and provides a complete set of resources for the development of a web application in minutes. AWS Elastic Beanstalk is a deployment tool of the AWS cloud.
With AWS Elastic Beanstalk, applications can be quickly deployed and managed in the AWS cloud without worrying about the infrastructure that runs those applications. AWS Elastic Beanstalk reduces management complexity without restricting choice or control. Once the application is uploaded AWS Elastic Beanstalk automatically handles the details of capacity provisioning, load balancing, scaling, and application health monitoring. AWS Elastic Beanstalk uses highly reliable and scalable services.
AWS CLI
AWS Elastic Beanstalk uses a command line tool Eb, which helps you to deploy your application easily.
Getting Started with Eb<ref>http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/command-reference-get-started.html</ref>
To get started with the beanstalk CLI, you will need to download the command line tools at the AWS Sample Code & Libraries website.
Step 1: Initialize Your Git Repository
Eb is a command line interface that enables you to deploy applications quickly and more easily using Git. Eb is available as part of the Elastic Beanstalk command line tools package.
1. To install eb,install the following software onto your local computer:
- Git 1.6.6 or later. To download Git, go to http://git-scm.com/.
- PowerShell 2.0.
2. Initialize your Git repository.
git init
Step 2: Configuring AWS Elastic Beanstalk
1. From your directory where you created your local repository, type the following command.
eb init
2. When you are prompted for the access key ID, type your access key ID.
Enter your AWS Access Key ID (current value is "AKIAIOSFODNN7EXAMPLE"):
3. When you are prompted for the secret access key, type your secret access key.
Enter your AWS Secret Access Key (current value is "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"):
4. When you are prompted for the AWS Elastic Beanstalk application name, type the name of the application.
Enter an AWS Elastic Beanstalk application name (auto-generated value is "windows"):
Note: If you have a space in your application name, make sure you do not use quotes.
5. When you are prompted for the AWS Elastic Beanstalk environment name, type the name of the environment. AWS Elastic Beanstalk automatically creates an environment name based on your application name. If you want to accept the default, press Enter.
Enter an AWS Elastic Beanstalk environment name (current value is "HelloWorld-env"):
6. When you are prompted to create an Amazon RDS DB instance, type y or n. For this example, we'll type y.
Create an RDS DB Instance? [y/n]:
7. When you are prompted to enter your RDS user master password, type your password containing from 8 to 16 printable ASCII characters (excluding /, \, and @).
Enter an RDS DB master password: Retype password to confirm:
You can now get started with the AWS Elastic Beanstalk.
OpenShift
Another free and open source PaaS for deploying applications is OpenShift created by [RedHat].
Considerations
- Databases
To use the application outside the OpenShift environment one needs to change the variables as the application is configured to use database in production mode in OpenShift.
- Assets
The assets are precompiled everytime application is pushed to OpenShift.
- Security
Security related variables are to be unique across the application.
<ref>https://github.com/openshift/rails-example</ref> Installation
1. Create an account at http://openshift.redhat.com/
2. Create a rails application
rhc app create -a railsapp -t ruby-1.9
3. Add mysql support to your application
rhc cartridge add -a railsapp -c mysql-5.1
4. Add this upstream Rails quickstart repository
cd railsapp git remote add upstream -m master git://github.com/openshift/rails-example.git git pull -s recursive -X theirs upstream master
5. Push your new code
git push
Future scope
Cloud 66 combines the convenience of Platform-as-a-Service (PaaS) and the flexibility and control of Infrastructure-as-a-Service (IaaS). This platform allows easy deployment of application, so there is no overhead of configuring or monitoring the servers.
Cloud 66 Command line Toolbelt
Toolbelt is an open source released to deploy the application.
<ref>http://blog.cloud66.com/</ref>
Getting Started with Cloud 66
1. Go to the sign up page and create a Cloud 66 account.
2. Go to Cloud 66 Dashboard and build your first stack.
Installation
Installation of toolbelt uses the following command
Gem install c66
This automatically searches the newest version and installs it.
Changes in routes.rb
The following routes were added to make the code run error free.
Routes for submit_hyperlink and remove_hyperlink were added below
resources :submitted_content do collection do get :view get :edit post :submit_hyperlink get :remove_hyperlink end end
Routes for get and post method for export were added here
resources :export_file do collection do get :start get :export post :export end end
Routes for cancel, accept and decline were added here
resources :invitation do collection do get :cancel get :accept get :decline end end
Conclusion
Comparison and contrast between various deployment automated tools such as Capistrano, Heroku, Vlad, AppFog, OpenShift, Cloud66, AWS Beanstalk shows that each has its own pros and cons. For instance, in a client based application where handing over the control of the application to a third party such as the deployment tool provider is impossible, AWS Beanstalk would be the obvious choice for the developer. On the other hand, a novice Rails application developer might find all he needs in the starter plan of Heroku with the added bonus of a huge support community available to him for troubleshooting as he stumbles his way across the development of the application. One may also choose the tool that provides the specific database support for your application. In case of large scale corporations where budgets are not that limited, the increasing costs with up-scaling of some tools would not be an obstacle. Thus, various considerations about the application such as scalability requirement, security concerns, cost, availability of own resources such as servers etc., will help determine which tool is the most suitable for that application.
References
<references/>
See Also
- OSS - E808 project VCL link http://152.7.99.84:3000/ (may be disabled after a month)
- OSS - E808 project on GitHub https://github.com/npari/expertiza_oss808
- Expertiza project documentation can be found at http://wikis.lib.ncsu.edu/index.php/Expertiza
- The working Expertiza site is accessible at link http://expertiza.ncsu.edu/