italian-ruby 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: e77bc57386211592f254fc0a17f9b2ce05c31453d5115bb23aacb3fa56759192
4
+ data.tar.gz: 03b44542875df8c82407332db861544a5766fd12551e0dc1dbcb8ad8f9697b7e
5
+ SHA512:
6
+ metadata.gz: d0b5e0f98b9333652a89af5cb893f1e9e8aab144882053bfc27eb85f000870d0f3a4dea38be185d191f1cbb0c2f11e2af942f0ea92858fb7368b5806a51fb69d
7
+ data.tar.gz: 717a0ebc33dc4ab89e3df7c1cb739ce1238121a5e705db031cef09e59b39c6725692a0ebd393e0c7bb992bc85fb3274afd5ac49ffeafbe3dc2295f526773c87d
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.7.0
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in italian-ruby.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,42 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ italian-ruby (0.1.0)
5
+ ruby2ruby (~> 2.4)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ diff-lcs (1.3)
11
+ rake (13.0.1)
12
+ rspec (3.9.0)
13
+ rspec-core (~> 3.9.0)
14
+ rspec-expectations (~> 3.9.0)
15
+ rspec-mocks (~> 3.9.0)
16
+ rspec-core (3.9.1)
17
+ rspec-support (~> 3.9.1)
18
+ rspec-expectations (3.9.0)
19
+ diff-lcs (>= 1.2.0, < 2.0)
20
+ rspec-support (~> 3.9.0)
21
+ rspec-mocks (3.9.1)
22
+ diff-lcs (>= 1.2.0, < 2.0)
23
+ rspec-support (~> 3.9.0)
24
+ rspec-support (3.9.2)
25
+ ruby2ruby (2.4.4)
26
+ ruby_parser (~> 3.1)
27
+ sexp_processor (~> 4.6)
28
+ ruby_parser (3.14.2)
29
+ sexp_processor (~> 4.9)
30
+ sexp_processor (4.14.1)
31
+
32
+ PLATFORMS
33
+ ruby
34
+
35
+ DEPENDENCIES
36
+ bundler (~> 2.1)
37
+ italian-ruby!
38
+ rake (~> 13.0)
39
+ rspec (~> 3.9)
40
+
41
+ BUNDLED WITH
42
+ 2.1.2
data/README.md ADDED
@@ -0,0 +1,107 @@
1
+ # Italian::Ruby
2
+
3
+ Benvenuti nella gemma `italian/ruby`.
4
+ Scrivo questo tutorial in italiano, perché, diciamocelo, chi sarebbe interessato a questa gemma se non fosse italiano? La gemma è semplice. Ti permette di scrivere Ruby, ma usando la nostra cara lingua madre.
5
+
6
+ Son da sempre convinto che una delle difficoltà della programmazione sia pensare e leggere il codice sorgente scritto in una lingua che non ti è nativa. Infatti, per quanto vogliamo raccontarcela e per quanti film in inglese scegliamo di guardare, finché viviamo in Italia, penseremo e parleremo in italiano.
7
+ Questo vuol dire che, quando programmiamo software, dobbiamo pensare l'algoritmo, tradurlo in inglese, tradurlo in Ruby e poi scriverlo a tastiera. Allo stesso modo, quando leggiamo software, dobbiamo tradurre dall'inglese, tradurre dal Ruby e poi ricostruire l'algoritmo in testa.
8
+
9
+ E se eliminassimo un passaggio? Beh diciamo che più che eliminarlo, lo facciamo fare ad una macchina. D'altra parte le macchine fan questo: attività ripetitive, banali, e stupide. Sì perché le macchine sono e resteranno sempre stupide. E non fatemi iniziare a parlare di "intelligenza" artificiale.. !
10
+ Ecco il motivo della nascita di Italian Ruby.
11
+
12
+ ## Installazione
13
+
14
+ Al solito.
15
+
16
+ ```ruby
17
+ gem 'italian-ruby'
18
+ ```
19
+
20
+ Oppure.
21
+
22
+ ```bash
23
+ gem install italian-ruby
24
+ ```
25
+
26
+ Per poterla usare bisogna caricarla.
27
+
28
+ ```ruby
29
+ require "italian/ruby"
30
+ ```
31
+
32
+ ## Utilizzo
33
+
34
+ Il codice sorgente in Italian Ruby è scritto in file con estensione `.ir`. Ho fatto anche una grammatica per l'evidenziazione della sintassi, funziona per VS Code, penso anche per altri editor, la trovate nel file `vscode/italianruby.tmGrammar.json` in questo repository.
35
+
36
+ A questo punto ci sono due strade. Prima strada, usare l'eseguibile `italian-ruby`:
37
+
38
+ ```ruby
39
+ # persona.ir
40
+ classe Persona
41
+ def inizializzatore(nome)
42
+ @nome = nome
43
+ fine
44
+
45
+ def come_ti_chiami?
46
+ stampa "Ciao, mi chiamo #{@nome}."
47
+ fine
48
+ fine
49
+
50
+ toni = Persona.nuova("Toni")
51
+ toni.come_ti_chiami?
52
+ ```
53
+
54
+ Eseguendolo così:
55
+
56
+ ```bash
57
+ italian-ruby persona.ir
58
+ # Ciao, mi chiamo Toni.
59
+ ```
60
+
61
+ Oppure si può richiedere all'interno di codice sorgente Ruby standard, in modo che venga caricato esattamente come fa il `require` di Ruby standard. Esempio:
62
+
63
+ ```ruby
64
+ # libreria_interessantissima.rb
65
+ modulo LibreriaInteressantissima
66
+ def se_stesso.metodo_interessantissimo
67
+ stampa "Che roba!"
68
+ fine
69
+ fine
70
+
71
+ # tuo_file_ruby.rb
72
+ require "italian/ruby"
73
+ richiedi_relativo "libreria_interessantissima"
74
+
75
+ LibreriaInteressantissima.metodo_interessantissimo
76
+ # Che roba!
77
+ ```
78
+
79
+ È possibile anche utilizzare il `richiedi`, che funziona come il `require` di Ruby, nel remoto caso in cui _qualcuno_ faccia una gemma in Italian Ruby, la pubblichi su rubygems.org e _qualcun'altro_ la scarichi e la installi. Se mai succedesse, funzionerebbe così:
80
+
81
+ ```ruby
82
+ # tuo_file_ruby.rb
83
+ require "italian/ruby"
84
+ richiedi "gemma_impossibile"
85
+
86
+ GemmaImpossibile.esiste?
87
+ # false
88
+ ```
89
+
90
+ ## Come funziona?
91
+
92
+ > Vuoi sapere la verità su una cosa? Allora devi sapere **come funziona**.
93
+ >
94
+ > \- un tizio saggio, qualche anno fa.
95
+
96
+ Volete sapere la verità su Italian Ruby? Ecco come funziona. Ho preso ispirazione da questa gemma che si chiama [Bato](https://github.com/jjuliano/bato). Praticamente è la stessa cosa di Italian Ruby solo che in filippino. Bato vuole dire "Roccia" in filippino. Bato funziona usando la gemma [RubyParser](https://github.com/seattlerb/ruby_parser) che parsa codice Ruby e lo converte in espressioni sexp, e la gemma [Ruby2Ruby](https://github.com/seattlerb/ruby2ruby) che converte espressioni sexp in codice Ruby.
97
+ In mezzo a queste due, ci infiliamo la nostra gemma, che, patchando il ruby parser, legge codice in italiano e lo converte in espressioni sexp. Il trucco sta nel file `lib/italian/ruby/ruby_parser_patches.rb` dove vengono definite nuove keywords al posto di quelle originali (es. `classe` al posti di `class`).
98
+
99
+ Bato però ha solo un binario che permette di eseguire codice filippino. Italian Ruby, invece, permette di inglobare codice italiano all'interno di progetti Ruby già esistenti. Avete un gigantesco codebase con megabyte di codice, ma volete riscrivere un solo piccolo pezzettino in italiano? Con Italian Ruby si può.
100
+
101
+ Per concludere, ci sono degli avvertimenti.
102
+ 1. il namespace verrà sporcato. Ho fatto del mio meglio per essere più chirurgico possibile, ma se fate `require "italian/ruby"` sappiate che verranno su un sacco di classi e di alias nuovi (es. `Oggetto.nuovo` ecc.).
103
+ 2. il `richiedi` e `richiedi_relativo` funzionano traducendo un file sorgente in italiano nella stessa cartella in cui si trova, caricandolo in memoria con il `require` di Ruby, e poi cancellandolo. Non so se questo possa creare problemi. Immagino di no. Ma vi ho avvertito!
104
+
105
+ ## Contribuire
106
+
107
+ Bug e issue qui -> https://github.com/[USERNAME]/italian-ruby.
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/italian-rspec ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "rspec"
5
+ require "italian/ruby"
6
+
7
+ def translate_spec(file)
8
+ spec_file = "#{File.dirname file}/#{File.basename(file, ".ir")}.rb"
9
+ File.write spec_file, Italian::Ruby::Traduttore.traduci(file)
10
+ end
11
+
12
+ def destroy_spec(file)
13
+ spec_file = "#{File.dirname file}/#{File.basename(file, ".ir")}.rb"
14
+ File.delete spec_file if File.exist? spec_file
15
+ end
16
+
17
+ if ARGV[0].nil?
18
+ spec_files = Dir["spec/**/*_spec.ir"]
19
+ if spec_files.empty?
20
+ "Nessun file *_spec.ir trovato."
21
+ return
22
+ end
23
+ else
24
+ spec_files = ARGV
25
+ end
26
+
27
+ spec_files.each { |file| translate_spec file }
28
+ RSpec::Core::Runner.run([ "spec" ], STDIN, STDOUT)
29
+ spec_files.each { |file| destroy_spec file }
data/bin/italian-ruby ADDED
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "italian/ruby"
5
+
6
+ if ARGV[0].nil?
7
+ puts <<~EOS
8
+ Esegue un file scritto in Italian Ruby. Sintassi:
9
+ italian-ruby file.ir
10
+ EOS
11
+ else
12
+ ARGV.each do |file|
13
+ next unless file
14
+
15
+ codice_ruby = Italian::Ruby::Traduttore.traduci file
16
+ eval codice_ruby
17
+ end
18
+ end
@@ -0,0 +1,36 @@
1
+ require_relative 'lib/italian/ruby/version'
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "italian-ruby"
5
+ spec.version = Italian::Ruby::VERSION
6
+ spec.authors = ["Francesco Ballardin"]
7
+ spec.email = ["francesco.ballardin@gmail.com"]
8
+ spec.licenses = ["MIT"]
9
+
10
+ spec.summary = %q{Program in Ruby writing in Italian.}
11
+ spec.description = %q{Program in Ruby writing in Italian. Yay!}
12
+ spec.homepage = "https://github.com/Pluvie/italian-ruby"
13
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
14
+
15
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
16
+
17
+ spec.metadata["homepage_uri"] = spec.homepage
18
+ spec.metadata["source_code_uri"] = "https://github.com/Pluvie/italian-ruby"
19
+ spec.metadata["changelog_uri"] = "https://github.com/Pluvie/italian-ruby/CHANGELOG.md"
20
+
21
+ # Specify which files should be added to the gem when it is released.
22
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
24
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
+ end
26
+ spec.bindir = "bin"
27
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
28
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
29
+ spec.require_paths = ["lib"]
30
+
31
+ spec.add_dependency 'ruby2ruby', '~> 2.4'
32
+
33
+ spec.add_development_dependency 'bundler', '~> 2.1'
34
+ spec.add_development_dependency 'rake', '~> 13.0'
35
+ spec.add_development_dependency 'rspec', '~> 3.9'
36
+ end
@@ -0,0 +1,23 @@
1
+ ##
2
+ # Core Ext - Array
3
+ #
4
+ # Alias di metodi della classe Array.
5
+
6
+ class Array
7
+ alias :per_ogni :each
8
+ alias :per_ognuno :each
9
+ alias :per_ognuna :each
10
+ alias :mappa :map
11
+ alias :vuoto? :empty?
12
+ alias :vuota? :empty?
13
+ alias :primo :first
14
+ alias :prima :first
15
+ alias :ultimo :last
16
+ alias :ultima :last
17
+
18
+ def esiste?
19
+ !nil? && !empty?
20
+ end
21
+ end
22
+
23
+ Lista = Array
@@ -0,0 +1,50 @@
1
+ ##
2
+ # Core Ext - Hanami::Interactor
3
+
4
+ module Hanami
5
+ module Interactor
6
+ alias :fallisci! :error!
7
+ alias :errore! :error!
8
+ alias :errore :error
9
+
10
+ module LegacyInterface
11
+ def chiama
12
+ _call { super }
13
+ end
14
+ end
15
+ module Interface
16
+ def chiama(*args)
17
+ @__result = ::Hanami::Interactor::Result.new
18
+ _call(*args) { super }
19
+ end
20
+ end
21
+
22
+ class Result
23
+ alias :riuscito? :successful?
24
+ alias :errore :error
25
+
26
+ def fallito?
27
+ !successful?
28
+ end
29
+ end
30
+
31
+ Risultato = Result
32
+ end
33
+
34
+ Interattore = Interactor
35
+
36
+ module ClassMethods
37
+ alias :esponi :expose
38
+
39
+ def method_added(method_name)
40
+ super
41
+ return unless method_name == :chiama
42
+
43
+ if instance_method(:chiama).arity.zero?
44
+ prepend Hanami::Interactor::LegacyInterface
45
+ else
46
+ prepend Hanami::Interactor::Interface
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,14 @@
1
+ ##
2
+ # Core Ext - Hanami Mongoid
3
+
4
+ module Hanami
5
+ module Mongoid
6
+ class Repository
7
+
8
+ def tutti(*args, &block)
9
+ all *args, &block
10
+ end
11
+
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,25 @@
1
+ ##
2
+ # Core Ext - Hash
3
+ #
4
+ # Alias di metodi della classe Hash.
5
+
6
+ class Hash
7
+ alias :per_ogni :each
8
+ alias :per_ognuno :each
9
+ alias :per_ognuna :each
10
+ alias :chiavi :keys
11
+ alias :valori :values
12
+ alias :mappa :map
13
+ alias :vuoto? :empty?
14
+ alias :vuota? :empty?
15
+ alias :ottieni :fetch
16
+ alias :scava :dig
17
+ alias :trasforma_chiavi :transform_keys
18
+ alias :trasforma_valori :transform_values
19
+
20
+ def esiste?
21
+ !nil? && !empty?
22
+ end
23
+ end
24
+
25
+ Mappa = Hash
@@ -0,0 +1,56 @@
1
+ ##
2
+ # CoreExt - Kernel
3
+ #
4
+ # Aggiunge i metodi :richiedi e :richiedi_relativo, che permettono di caricare
5
+ # un file sorgente scritto in Italian Ruby e usarlo allo stesso modo di come
6
+ # funzionano :require e :require_relative di Ruby standard.
7
+ #
8
+ # È possibile utilizzare :richiedi e :richiedi_relativo sia in file sorgenti
9
+ # scritti in Italian Ruby che in file sorgenti scritti in Ruby standard.
10
+
11
+ module Kernel
12
+
13
+ def richiedi(name)
14
+ file_to_require = $:.map { |dir| Dir["#{dir}/**/#{name}.ir"] }.flatten.compact.first
15
+ raise LoadError.new("cannot load such file -- #{name}") if file_to_require.nil?
16
+
17
+ traduci_carica_e_distruggi file_to_require
18
+ end
19
+
20
+ def richiedi_relativo(name)
21
+ caller_location_dir = File.dirname caller_locations.first.absolute_path
22
+ file_to_require = File.expand_path "#{caller_location_dir}/#{name}.ir"
23
+ raise LoadError.new("cannot load such file -- #{name}") unless File.exist? file_to_require
24
+
25
+ traduci_carica_e_distruggi file_to_require
26
+ end
27
+
28
+ def richiedi_assoluto(file)
29
+ raise LoadError.new("cannot load suc file -- #{file}") unless File.exist? file
30
+ traduci_carica_e_distruggi file
31
+ end
32
+
33
+ def richiedi_tutti(dir)
34
+ caller_location_dir = File.dirname caller_locations.first.absolute_path
35
+ raise LoadError.new("cannot load such directory -- #{dir}") unless Dir.exist? caller_location_dir
36
+
37
+ Dir["#{caller_location_dir}/**/*.ir"].each do |file|
38
+ richiedi_assoluto file
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def traduci_carica_e_distruggi(file_to_require)
45
+ parsed_code = Italian::Ruby::Traduttore.traduci file_to_require
46
+ file_to_require_dir = File.dirname(file_to_require)
47
+ file_to_require_basename = File.basename(file_to_require, ".ir")
48
+ tmp_parsed_file = "#{file_to_require_dir}/#{file_to_require_basename}.rb"
49
+
50
+ File.write tmp_parsed_file, parsed_code
51
+ require_output = require tmp_parsed_file
52
+ File.delete tmp_parsed_file if File.exist? tmp_parsed_file
53
+ require_output
54
+ end
55
+
56
+ end
@@ -0,0 +1,39 @@
1
+ ##
2
+ # Core Ext - Main
3
+ #
4
+ # Alias di metodi del namespace principale.
5
+
6
+ alias :stampa :puts
7
+ alias :cicla :loop
8
+ alias :definisci_metodo_singolo :define_singleton_method
9
+
10
+ def includi(*args)
11
+ include *args
12
+ end
13
+ def preponi(*args)
14
+ prepend *args
15
+ end
16
+ def estendi(*args)
17
+ extend *args
18
+ end
19
+
20
+ def privati(*args)
21
+ private
22
+ end
23
+ def protetti(*args)
24
+ protected
25
+ end
26
+ def pubblici(*args)
27
+ public
28
+ end
29
+
30
+ def alza(*args)
31
+ raise *args
32
+ end
33
+ def fallisci(*args)
34
+ fail *args
35
+ end
36
+
37
+ def non_in?(*args)
38
+ !in? *args
39
+ end
@@ -0,0 +1,19 @@
1
+ ##
2
+ # Core Ext - Mongoid Criteria
3
+
4
+ module Mongoid
5
+ class Criteria
6
+ def tutti(*args, &block)
7
+ all *args, &block
8
+ end
9
+
10
+ def dove(*args, &block)
11
+ where *args, &block
12
+ end
13
+
14
+ def dati
15
+ entries
16
+ end
17
+ alias :voci :dati
18
+ end
19
+ end
@@ -0,0 +1,31 @@
1
+ ##
2
+ # Core Ext - Oggetti
3
+ #
4
+ # Alias di metodi della classe Object.
5
+
6
+ class Object
7
+ class << self
8
+ alias_method :nuovo, :new
9
+ alias_method :nuova, :new
10
+ end
11
+
12
+ alias :nullo? :nil?
13
+ alias :nulla? :nil?
14
+ alias :risponde_a? :respond_to?
15
+
16
+ def esiste?
17
+ !nil?
18
+ end
19
+
20
+ private
21
+
22
+ def inizializzatore(*args, &block)
23
+ end
24
+
25
+ def initialize(*args, &block)
26
+ inizializzatore *args, &block
27
+ end
28
+
29
+ end
30
+
31
+ Oggetto = Object
@@ -0,0 +1,27 @@
1
+ ##
2
+ # Core Ext - Rspec Core
3
+
4
+ module RSpec
5
+ def self.descrivi(*args, &block)
6
+ describe *args, &block
7
+ end
8
+
9
+ module Core
10
+ module Hooks
11
+ alias_method :prima, :before
12
+ alias_method :dopo, :after
13
+ end
14
+ end
15
+ end
16
+
17
+ RSpec.configure do |config|
18
+ RSpec::Matchers.alias_matcher :sia, :be
19
+ RSpec::Matchers.alias_matcher :equivalga_a, :eq
20
+
21
+ config.alias_example_to :esso
22
+ config.alias_example_to :essa
23
+
24
+ config.before :each do
25
+ alias :verifica :expect
26
+ end
27
+ end
@@ -0,0 +1,18 @@
1
+ ##
2
+ # Core Ext - Rspec Expectations
3
+
4
+ module RSpec
5
+ module Expectations
6
+ class ExpectationTarget
7
+ module InstanceMethods
8
+ def che(*args, &block)
9
+ to *args, &block
10
+ end
11
+
12
+ def che_non(*args, &block)
13
+ not_to *args, &block
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,8 @@
1
+ ##
2
+ # Core Ext - Stringhe
3
+ #
4
+ # Alias di metodi della classe String.
5
+
6
+ class String
7
+ alias :congela :freeze
8
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ original_verbosity = $VERBOSE
4
+ $VERBOSE = nil
5
+
6
+ require_relative "core_ext/kernel"
7
+ require_relative "core_ext/main"
8
+ require_relative "core_ext/object"
9
+ require_relative "core_ext/array"
10
+ require_relative "core_ext/hash"
11
+ require_relative "core_ext/string"
12
+
13
+ $VERBOSE = original_verbosity
@@ -0,0 +1,5 @@
1
+ modulo RichiediTest
2
+ def se_stesso.funziona?
3
+ stampa "si, funziona!"
4
+ fine
5
+ fine