# Alfonso X [![Build Status](https://travis-ci.org/diegojromerolopez/alfonsox.svg?branch=master)](https://travis-ci.com/diegojromerolopez/alfonsox) [![Maintainability](https://api.codeclimate.com/v1/badges/053783a6bcd2404df5b1/maintainability)](https://codeclimate.com/github/diegojromerolopez/alfonsox/maintainability) [![Test Coverage](https://api.codeclimate.com/v1/badges/053783a6bcd2404df5b1/test_coverage)](https://codeclimate.com/github/diegojromerolopez/alfonsox/test_coverage)

A simple spellchecking tool to make easy the spellchecking of code files. ## Installation Add this line to your application's Gemfile: ```ruby gem 'alfonsox' ``` And then execute: ```bash $ bundle ``` Or install it yourself as: ```bash $ gem install alfonsox ``` ## Setup Make sure you have [hunspell](http://hunspell.github.io/) installed in your system. No installation of dictionaries is required as this package already contains LibreOffice dictionaries from [LibreOffice dictionaries repository](https://github.com/LibreOffice/dictionaries). ## Usage ### Terminal #### Define a configuration file Create a YML file with the following structure to set up configuration of the spellchecking process: ```yaml # Paths the files to ve spellchecked are Paths: - 'lib/**.rb' - 'test/**.rb' - '... other paths that will be spellcheck' # Dictionaries, choose one or all of these options #Note the name of these subsections can be customized, # i.e. instead of MyEnglishDictionaryFromLocalPath you can write # LocalDictionary, for example. Dictionaries: # Use a hunspell dictionary included in your project MyEnglishDictionaryFromLocalPath: type: 'hunspell' # Local hunspell dictionaries (.aff and .dic files) path: 'my-local-path/dictionaries' language: 'en_US' # Use a hunspell dictionary from this gem MyEnglishDictionaryFromGem: type: 'hunspell' language: 'en_US' # If you use Rubymine, it is very useful to # include your custom dictionary MyRubymineDictionary: type: 'rubymine' # Optional, by default is '.idea/dictionary.xml' path: '.idea/dictionary.xml' # Include in this section a list of custom words or words # that do not appear in other dictionaries WordListDictionary: type: 'word_list' word_list: - 'alfonso' - 'babik' - 'queryset' - 'txt' ``` e.g. ```yaml Paths: - 'app/*/**.rb' - 'lib/**.rb' - 'test/**.rb' Dictionaries: EnglishDictionaryFromGem: type: 'hunspell' language: 'en_US' RubymineDictionary: type: 'rubymine' ``` #### Rake task ##### Default configuration There is a [default configuration](/resources/configurations/default.yml) that will check US-English spelling and your RubyMine dictionary with your custom spellings. ```bash bundle exec rake alfonsox:spellcheck ``` ##### Custom configuration Copy the [default configuration](/resources/configurations/default.yml) to your project root directory and modify it ```bash bundle exec rake alfonsox:spellcheck[] ``` e.g.: ```bash bundle exec rake alfonsox:spellcheck[.alfonsox.yml] ``` The rake task will output the spell checking errors, e.g.: ```bash $ bundle exec rake alfonsox:spellcheck[./test/resources/config.yml] Starting spellcheck using configuration ./test/resources/config.yml /Users/diegoj/proyectos/alfonsox/test/alfonsox_test.rb:8 jane /Users/diegoj/proyectos/alfonsox/test/alfonsox_test.rb:8 austen /Users/diegoj/proyectos/alfonsox/test/alfonsox_test.rb:70 neighbourhood ``` ### Overcommit integration [Overcommit](https://github.com/sds/overcommit) is a project whose aim is to provide developers with tools to check code quality easily. [Define a new pre-commit hook in your repository](https://github.com/sds/overcommit#repo-specific-hooks): Add a file **.git-hooks/pre_commit/alfonsox.rb** with the following contents: ```ruby # frozen_string_literal: true module Overcommit::Hook::PreCommit # # Spell check of the code. # class AlfonsoX < Base def run # Create default file config if it does not exist # Run rake spellcheck task args = flags + applicable_files result = execute('bundle exec rake alfonsox:spellcheck[.alfonsox.yml]', args: args) spellchecking_errors = result.split('\n') # Check the if there are spelling errors return :pass if spellchecking_errors.length.zero? error_messages(spellchecking_errors) end private # Create the error messages def error_messages(spellchecking_errors) messages = [] spellchecking_errors.each do |spellchecking_error_i| error_location, word = spellchecking_error_i.split(' ') error_file_path, line = error_location.split(':') messages << Overcommit::Hook::Message.new( :error, error_file_path, line, "#{error_location}: #{word}" ) end messages end end end ``` Make sure you have a configuration in the root directory of your project with the name **.alfonsox.yml**: ```yml Paths: - '*/**.rb' Dictionaries: EnglishDictionaryFromGem: type: 'hunspell' language: 'en_US' RubymineDictionary: type: 'rubymine' WordListDictionary: type: 'word_list' word_list: - 'alfonso' ``` ### From code #### Load dictionaries ```ruby # Load Hunspell dictionary from your system # Make sure you have installed your dictionaries dictionary = AlfonsoX::SpellChecker::Dictionary::Hunspell.new('en_US') # Or, alternatively you can load Hunspell dictionary from a local path # Make sure the following files exist: # - YOUR_PATH/dictionaries/en_US/en_US.aff # - YOUR_PATH/dictionaries/en_US/en_US.dic dictionary = AlfonsoX::SpellChecker::Dictionary::Hunspell.new( 'en_US', "YOUR_PATH/dictionaries" ) ``` #### Spellcheck some files ```ruby dictionaries = [ AlfonsoX::SpellChecker::Dictionary::Hunspell.new('en_US'), AlfonsoX::SpellChecker::Dictionary::Hunspell.new('es_US') ] # Create spellchecker spellchecker = AlfonsoX::SpellChecker::Main.new( "directory/with/files/**/*.rb", dictionaries ) # Check the files incorrect_words = spellchecker.check # incorrect_words is a dict where # the keys area the path of each one of the files that have at least one wrong word # and the values are a list of incorrect words ``` ## Contributing Bug reports and pull requests are welcome on GitHub at [https://github.com/diegojromerolopez/alfonsox]([https://github.com/diegojromerolopez/alfonsox). This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct. To sum up, we only talk about this software and respect each other. ## License The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT). All dictionaries included in [resources/dictionaries/hunspell](resources/dictionaries/hunspell) are part of the LibreOffice hunspell dictionaries. Each one has its own license. Visit [LibreOffice dictionaries repository](https://github.com/LibreOffice/dictionaries) for more information. The en_US dictionary included in the tests has MIT and BSD license and has been copied from [Titus Wormer's dictionary repository](https://github.com/wooorm/dictionaries/tree/master/dictionaries/en-US). [King Alfonso X image is Public Domain](https://commons.wikimedia.org/wiki/File:Retrato_de_Alfonso_X.jpg). RubyMine is a trademark of JetBrains. This project is no way endorsed, supported by or related with JetBrains. ## Code of Conduct Everyone interacting in the Alfonso X project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/diegojromerolopez/alfonsox/blob/master/CODE_OF_CONDUCT.md). ## Why the name? [Alfonso X](https://en.wikipedia.org/wiki/Alfonso_X_of_Castile), called *The Wise*, was a king that reigned [Castile](https://en.wikipedia.org/wiki/Crown_of_Castile) (in Spain) during medieval times. He was a patron of the languages and pushed for the first orthography rules of Spanish.