Giter Site home page Giter Site logo

scalania's Introduction

Scalania - learn Scala by examples

Join the chat at https://gitter.im/jaceklaskowski/scalania

Build Status Stories in Ready Coverage Status

How to get started with the project | How to open the project in IntelliJ IDEA 14.0.3 | How to contribute | Tools used

The project's aim is to smooth your learning path to master Scala programming language. It's been very successful during @WarszawScala meetups in Warsaw, Poland - see Scalania webpage on meetup.

The project uses Typesafe Activator and offers tests with answers that are all supposed to help people learning (and ultimately mastering) Scala while solving problems described in S-99: Ninety-Nine Scala Problems (package pl.japila.scalania.s99) and doing the exercises that accompany the Scala course Scala i programowanie funkcyjne or are part of the Project Euler (package pl.japila.scalania.euler). Recently, examples from StackOverflow have been added.

Warsaw Scala Enthusiasts group has been using the project quite regularly during their meetups.

How to get started with the project

  • In the directory where you downloaded (cloned) the scalania project, e.g. ~/oss/scalania, run ./activator (on Mac OS/Linux) or activator (on Windows).

      โžœ  scalania git:(master) ./activator
      [info] Loading global plugins from /Users/jacek/.sbt/0.13/plugins
      [info] Loading project definition from /Users/jacek/dev/oss/scalania/project
      [info] Set current project to scalania (in build file:/Users/jacek/dev/oss/scalania/)
      [scalania]>
    
  • Pick a problem to work on. They are in exercises/src/main/scala directory.

    Say, you want to start with pl.japila.scalania.collection.P07. Run the corresponding test specification using ~exercises/testOnly *collection.P07Spec* (the asterisks are important as they are a part of a regular expression).

    Hint: Use [TAB] while in the activator shell.

      [scalania]> ~exercises/testOnly *collection.P07Spec*
      [info] [scapegoat] setting output dir to [/Users/jacek/dev/oss/scalania/exercises/target/scala-2.11/scapegoat-report]
      [info] [scapegoat] disabled inspections: X
      [info] [scapegoat] enabled inspections: ArraysToString
      [info] [scapegoat] ignored file patterns: X
      [info] P07Spec
      [info] 
      [info] sumOfPrecedingElements should
      [info] x Sum all preceding elements in a collection.
      [error]    an implementation is missing (P07.scala:7)
      [info] 
      [info] 
      [info] Total for specification P07Spec
      [info] Finished in 22 ms
      [info] 1 example, 1 failure, 0 error
      [info]  
      [info] ScalaTest
      [info] Run completed in 665 milliseconds.
      [info] Total number of tests run: 0
      [info] Suites: completed 0, aborted 0
      [info] Tests: succeeded 0, failed 0, canceled 0, ignored 0, pending 0
      [info] No tests were executed.
      [error] Failed: Total 1, Failed 1, Errors 0, Passed 0
      [error] Failed tests:
      [error]         pl.japila.scalania.collection.P07Spec
      [error] (exercises/test:testOnly) sbt.TestsFailedException: Tests unsuccessful
      [error] Total time: 1 s, completed Jan 28, 2015 10:44:15 PM
      1. Waiting for source changes... (press enter to interrupt)
    

Make the test pass (make it green). In the above snippet pl.japila.scalania.collection.P07Spec fails because of an implementation is missing. That's exactly your assignment - to write the implementation.

In this particular case you're supposed to write the implementation of pl.japila.scalania.collection.P07 object in exercises project.

  • Once the test becomes green (the success shows up as a result of running it), you're almost done. Note the number of expectations is 100 that means that there were 100 tests executed against the exercise.

      1. Waiting for source changes... (press enter to interrupt)
      [info] Formatting 1 Scala source {file:/Users/jacek/dev/oss/scalania/}exercises(compile) ...
      [info] [scapegoat] setting output dir to [/Users/jacek/dev/oss/scalania/exercises/target/scala-2.11/scapegoat-report]
      [info] [scapegoat] disabled inspections: X
      [info] [scapegoat] enabled inspections: ArraysToString
      [info] [scapegoat] ignored file patterns: X
      [info] Compiling 1 Scala source to /Users/jacek/dev/oss/scalania/exercises/target/scala-2.11/classes...
      [info] [scapegoat] 107 activated inspections
      [info] [scapegoat] List(X) ignored file patterns
      [info] P07Spec
      [info] 
      [info] sumOfPrecedingElements should
      [info] + Sum all preceding elements in a collection.
      [info] 
      [info] Total for specification P07Spec
      [info] Finished in 13 ms
      [info] 1 example, 0 failure, 0 error
      [info]  
      [info] ScalaTest
      [info] Run completed in 606 milliseconds.
      [info] Total number of tests run: 0
      [info] Suites: completed 0, aborted 0
      [info] Tests: succeeded 0, failed 0, canceled 0, ignored 0, pending 0
      [info] No tests were executed.
      [info] Passed: Total 1, Failed 0, Errors 0, Passed 1
      [success] Total time: 2 s, completed Jan 28, 2015 10:46:06 PM
      2. Waiting for source changes... (press enter to interrupt)
    

Press Enter to interrupt.

Spoiler: There are a few solutions of the exercises that you could execute with answers/testOnly *collection.P06*. Just replace ~exercises with answers to kick it off.

    [scalania]> answers/testOnly *collection.P06*
    [info] [scapegoat] setting output dir to [/Users/jacek/dev/oss/scalania/answers/target/scala-2.11/scapegoat-report]
    [info] [scapegoat] disabled inspections: X
    [info] [scapegoat] enabled inspections: ArraysToString
    [info] [scapegoat] ignored file patterns: X
    [info] [scapegoat] setting output dir to [/Users/jacek/dev/oss/scalania/exercises/target/scala-2.11/scapegoat-report]
    [info] [scapegoat] disabled inspections: X
    [info] [scapegoat] enabled inspections: ArraysToString
    [info] [scapegoat] ignored file patterns: X
    [info] P06Spec
    [info]
    [info] isNumeric should
    [info] + Check whether all elements in a sequence are numeric.
    [info]
    [info] Total for specification P06Spec
    [info] Finished in 16 ms
    [info] 1 example, 0 failure, 0 error
    [info]
    [info] ScalaTest
    [info] Run completed in 754 milliseconds.
    [info] Total number of tests run: 0
    [info] Suites: completed 0, aborted 0
    [info] Tests: succeeded 0, failed 0, canceled 0, ignored 0, pending 0
    [info] No tests were executed.
    [info] Passed: Total 1, Failed 0, Errors 0, Passed 1
    [success] Total time: 1 s, completed Jan 26, 2015 9:11:10 PM
  • In order to finish the exercises, run exercises/scalastyle to ensure high quality of your solutions that is manifested with Found 0 errors and Found 0 warnings in the output.

      [scalania]> exercises/scalastyle
      [info] scalastyle using config /Users/jacek/dev/oss/scalania/project/scalastyle_config.xml
      [info] Processed 44 file(s)
      [info] Found 0 errors
      [info] Found 0 warnings
      [info] Found 0 infos
      [info] Finished in 1 ms
      [success] created output: /Users/jacek/dev/oss/scalania/exercises/target
      [success] Total time: 0 s, completed Jan 28, 2015 10:48:22 PM
    

How to open the project in IntelliJ IDEA 14.0.3

IntelliJ IDEA supports Scala/sbt projects with the Scala plugin. Install the plugin and then File > Import Project.... Select SBT, click Next and have fun!

How to contribute

A quite productive approach to master Scala is to further extend the project with new tests that show what the Scala language can offer.

git clone the scalania project and send pull requests on GitHub.

Please use topic branches when sending pull requests rather than committing directly to master in order to minimize unnecessary merge commit clutter.

  • Create a topic branch and switch to it immediately. Say, you want to work on the 100th problem in the Euler Project and the branch gets named euler_100.

      $ git checkout -b euler_100
      Switched to a new branch 'euler_100'
    
  • Do the work and git commit it.

      $ git commit -am 'New tests for Euler 100'
    
  • Push the euler_100 branch to your remote fork myfork.

      $ git push myfork euler_100
    
  • Send pull request using GitHub. It should automatically suggest you doing so when your branch has showed up.

  • (optional) Once the pull request's accepted, delete the branch from the remote repository and from the local repository.

      $ git push myfork :euler_100
      $ git branch -d euler_100
    

Tools used

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.