README.md in nicefn-0.1.0 vs README.md in nicefn-0.1.1

- old
+ new

@@ -1,101 +1,160 @@ -## Ruby Nicefn -Elixir and javascript have the capability of making good looking one liners, but -what about Ruby? We can definitely make an awful looking one by adding a ';'. If -you want to start defining some better looking one-liners then add the 'nicefn' -gem to your project. Since the implementation files are small and this project -has no required deps. You should also feel free to copy and paste the -implementation directly into your project in an effort to avoid extra gems. +[![Gem Version](https://badge.fury.io/rb/nicefn.svg)](https://rubygems.org/gems/nicefn) +[![Gem Downloads](https://ruby-gem-downloads-badge.herokuapp.com/nicefn?color=brightgreen&type=total)](https://rubygems.org/gems/nicefn) +[![Build Status](https://travis-ci.org/afaur/ruby-nicefn.svg?branch=master)](https://travis-ci.org/afaur/ruby-nicefn) +[![Maintainability](https://api.codeclimate.com/v1/badges/6e10f0a9ac5b168e8821/maintainability)](https://codeclimate.com/github/afaur/ruby-nicefn/maintainability) +[![Test Coverage](https://api.codeclimate.com/v1/badges/6e10f0a9ac5b168e8821/test_coverage)](https://codeclimate.com/github/afaur/ruby-nicefn/test_coverage) -## Project Structure -Running `make` will default to running the tests inside `tst` folder against the -examples inside the `exa` folder. +### Overview +Here's a way to write functions (with visibility modification) in a single line of ruby. +```rb + ... + fp(:priv) { |greet| puts greet } + ... +``` +This will automatically declare a function with private visibility. Which will +make it like you had actually wrote: +```rb + ... + private -## How To Use -Add 'extend NiceFn::Inst' to the top of classes. You can also use 'include -NiceFn::Sing' in a `module` to make it a singleton class with `nicefn` methods. + def priv(greet) + puts greet + end + ... +``` +### Example (Main Scope) +If you want to write short one-liners in the main scope you need not add this gem +to your project. It is much quicker and simpler to do: +```rb +alias fn define_singleton_method + +fn(:test) { puts “hello” } + +test # <= prints "hello" to stdout +``` + ### Example (Regular Classes) Provided below is an example class with `public`, `private`, and `protected` methods: ```rb class Inst attr_writer :person + def self.set_klass_property(value) + @@klass_property = value + end + + def self.print_klass_property() + puts @@klass_property + end + def test_priv(greet) - priv "#{greet}" + priv greet end def test_share(greet, inst) inst.share greet end -private + private + def priv(greet) puts "#{greet} #{@person}" end -protected + protected + def share(greet) puts "#{greet} #{@person}" end end ``` -If we use `nicefn` on this class we can eliminate 10 lines of code inside of the +If we use `nicefn` on this class we can eliminate more than 12 lines of code (if +we add spaces around private and protected like rubocop suggests) inside of the class definition. This is because `private` and `protected` are handled by different functions (like `defp` in `elixir`). -### After Adding InstFn +### After Adding Nicefn::Inst ```rb require 'nicefn' class Inst - extend NiceFn::Inst + extend Nicefn::Inst attr_writer :person - fn(:test_priv) {|greet| priv "#{greet}"} - fn(:test_share) {|greet, inst| inst.share greet} + cm(:set_klass_property) { |value| @@klass_property = value } + cm(:print_klass_property) { puts @@klass_property } - fp(:priv) {|greet| puts "#{greet} #{@person}"} + fn(:test_priv) { |greet| priv greet } + fn(:test_share) { |greet, inst| inst.share greet } - fs(:share) {|greet| puts "#{greet} #{@person}"} + fp(:priv) { |greet| puts "#{greet} #{@person}" } + + fs(:share) { |greet| puts "#{greet} #{@person}" } end ``` Calling `fn` with a function `name` and a block will give you a public method. -If you call 'fp' you will get a private method, and 'fs' will set a protected -(shared) method. +(**Since version 0.1.1**) Class methods are created using the `cm` function. +If you call `fp` you will get a `private` method, and `fs` will set a +`protected` (shared) method. ### Example (Singleton Classes) -Provided below is an example of a singleton class that is made a singleton class -by using extend self. +Provided below is an example of a `module` that is made a `singleton class` by using +`extend self`. ```rb module Sing extend self attr_writer :person def test_priv(greet) - priv "#{greet}" + priv greet end private def priv(greet) puts "#{greet} #{@person}" end end ``` -After we add 'include NiceFn::Sing' to the module we can eliminate the need to -extend self as 'Sing' will do it for us. +After we add `include Nicefn::Sing` to the module we can eliminate the need to +extend self as `Nicefn::Sing` will do it for us. -### After Adding SingFn +### After Adding Nicefn::Sing ```rb require 'nicefn' module Sing - include NiceFn::Sing + include Nicefn::Sing attr_writer :person - fn(:test_priv) {|greet| priv greet} - fp(:priv) {|greet| puts "#{greet} #{@person}"} + fn(:test_priv) { |greet| priv greet } + fp(:priv) { |greet| puts "#{greet} #{@person}" } end ``` Calling `fn` with a function `name` and a block will give you a public method. -If you call 'fp' you will get a private method. Since singletons classes can +If you call `fp` you will get a `private` method. Since singletons classes can only act as one instance 'fs' is not a provided option. + +## Install Gem +You can run `bundle add nicefn --version '~> 0.1.0'`, or manually add a line +indicating how you would like to fetch the `gem` to your `Gemfile`: +```rb +... +# Download latest nicefn from default source +gem 'nicefn' + +# Download nicefn from default source with version constraints +gem 'nicefn', '~> 0.1.0' + +# Download nicefn from git with a specific version +gem 'nicefn', git: 'https://github.com/afaur/ruby-nicefn', tag: 'v0.1.0' +... +``` + +## Project Structure +Running `make` will default to running the tests inside `tst` folder against the +examples inside the `exa` folder. + +## How To Use +Add `extend Nicefn::Inst` to the top of classes. You can also use `include +Nicefn::Sing` in a `module` to make it a singleton class with `nicefn` methods.