coltrane 4.0.3 → 4.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.DS_Store +0 -0
  3. data/.ruby-version +1 -1
  4. data/.travis.yml +1 -1
  5. data/CHANGELOG.md +3 -0
  6. data/Gemfile +1 -1
  7. data/Gemfile.lock +85 -83
  8. data/bin/bundle +23 -14
  9. data/bin/console +24 -12
  10. data/bin/gambiarra +29 -0
  11. data/bin/setup +27 -6
  12. data/bin/thor +1 -1
  13. data/coltrane.gemspec +2 -2
  14. data/exe/coltrane +2 -73
  15. data/lib/coltrane/.DS_Store +0 -0
  16. data/lib/coltrane/commands/find_scale_by_chords.rb +1 -1
  17. data/lib/coltrane/renderers/text_renderer/representation_guitar_chord_drawer.rb +2 -2
  18. data/lib/coltrane/renderers/text_renderer/representation_piano_note_set_drawer.rb +1 -1
  19. data/lib/coltrane/theory/interval.rb +1 -1
  20. data/lib/coltrane/ui.rb +4 -5
  21. data/lib/coltrane/ui/.DS_Store +0 -0
  22. data/lib/coltrane/ui/base_view.rb +9 -0
  23. data/lib/coltrane/ui/views/.DS_Store +0 -0
  24. data/lib/coltrane/ui/views/chords.rb +1 -1
  25. data/lib/coltrane/ui/views/custom_progression.rb +1 -1
  26. data/lib/coltrane/ui/views/find_chord_by_notes.rb +1 -1
  27. data/lib/coltrane/ui/views/find_chords_in_scale.rb +3 -1
  28. data/lib/coltrane/ui/views/find_common_chords_in_scales.rb +1 -1
  29. data/lib/coltrane/ui/views/find_progressions_from_chords.rb +1 -1
  30. data/lib/coltrane/ui/views/find_scale.rb +1 -1
  31. data/lib/coltrane/ui/views/find_scale_by_chords.rb +1 -1
  32. data/lib/coltrane/ui/views/find_scale_by_notes.rb +1 -1
  33. data/lib/coltrane/ui/views/index.rb +1 -1
  34. data/lib/coltrane/ui/views/notes.rb +1 -1
  35. data/lib/coltrane/ui/views/progressions.rb +1 -1
  36. data/lib/coltrane/ui/views/scales.rb +1 -1
  37. data/lib/coltrane/ui/views/show_chord.rb +1 -1
  38. data/lib/coltrane/ui/views/show_progression.rb +1 -1
  39. data/lib/coltrane/ui/views/show_scale.rb +1 -1
  40. data/lib/coltrane/version.rb +1 -1
  41. metadata +17 -18
  42. data/lib/coltrane/ui/router.rb +0 -87
  43. data/lib/coltrane/ui/views.rb +0 -4
  44. data/lib/coltrane/ui/views/view.rb +0 -47
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d2dce8fab34c2d90d0317a80349b7fd3bec643bd0f32c491a351a0251251349b
4
- data.tar.gz: de1772b25200811627df8937663417db2c9a9ad5f8106e05ba0c6a41f6ccc96d
3
+ metadata.gz: 0c3c8660bcafcc989ef1797670510d821ab023664d7275095a6ee0fde7e93d6f
4
+ data.tar.gz: 4ff8579977fb1bd8f6a4702504d036e5dbff517936f730ba79d2c620aa2e642c
5
5
  SHA512:
6
- metadata.gz: 6d0ed0415983d75c7fce264111e014e2c2bb3d2f0ae949c7579743668ea09678e93df6e85c450f66c4543fd13f60c89dd6711bc023cfb08c00a83300228713c5
7
- data.tar.gz: 45fe81700b815b8762c39ad4d365ccafebfc8d7afa4d5e225f6344f70de713ce23d9d601273ee08a38f59bdb696815d2dd27cfd7920eae9f15f36f6fb3feb9eb
6
+ metadata.gz: cb931e46e6c45a238dc736e4b9de93fc9f56b0267163eca869add5fc091ff9a199eb94c31638b613444ff33c28e8c251709f2cfb820acc77129fdde76395167e
7
+ data.tar.gz: 7cf87180e20807855537afad00d1657fd414b00fdf64ef75210b0eb759e07c15d6f261fb776dbcc2760e6a420d6540ff36cf53e4fbb7e89751ed744131de897e
data/.DS_Store CHANGED
Binary file
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.5.1
1
+ 3.0.0
data/.travis.yml CHANGED
@@ -7,7 +7,7 @@ git:
7
7
  depth: 1
8
8
 
9
9
  rvm:
10
- - 2.5.0
10
+ - 3.0.0
11
11
 
12
12
  before_script:
13
13
  - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
data/CHANGELOG.md CHANGED
@@ -5,6 +5,9 @@
5
5
  - Fix chords so that they generate a barre and a non-barre version and prevent
6
6
  barre chords from picking notes before the barre.
7
7
 
8
+ ## [4.0.6]
9
+ - Change the CLI into a more intuitive one
10
+
8
11
  ## [4.0.0]
9
12
  - Includes totally revamped, easy to use command line interface.
10
13
 
data/Gemfile CHANGED
@@ -15,4 +15,4 @@ group :test do
15
15
  gem 'rubocop', require: false
16
16
  end
17
17
 
18
- gemspec
18
+ gemspec
data/Gemfile.lock CHANGED
@@ -1,125 +1,127 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- coltrane (4.0.3)
4
+ coltrane (4.1.1)
5
5
  activesupport (> 5.2)
6
- cli-ui (~> 1.1)
7
6
  color (~> 1.8)
8
7
  dry-monads (~> 0.4)
8
+ gambiarra (~> 0)
9
9
  paint (~> 2.0)
10
10
 
11
11
  GEM
12
12
  remote: https://rubygems.org/
13
13
  specs:
14
- activesupport (5.2.1)
14
+ activesupport (6.1.1)
15
15
  concurrent-ruby (~> 1.0, >= 1.0.2)
16
- i18n (>= 0.7, < 2)
17
- minitest (~> 5.1)
18
- tzinfo (~> 1.1)
19
- ast (2.4.0)
20
- byebug (10.0.2)
21
- cli-ui (1.1.4)
22
- coderay (1.1.2)
16
+ i18n (>= 1.6, < 2)
17
+ minitest (>= 5.1)
18
+ tzinfo (~> 2.0)
19
+ zeitwerk (~> 2.3)
20
+ ast (2.4.2)
21
+ byebug (11.1.3)
22
+ cli-ui (1.4.0)
23
+ coderay (1.1.3)
23
24
  color (1.8)
24
- concurrent-ruby (1.0.5)
25
- diff-lcs (1.3)
26
- docile (1.3.0)
27
- dry-core (0.4.7)
25
+ concurrent-ruby (1.1.8)
26
+ diff-lcs (1.4.4)
27
+ docile (1.3.5)
28
+ dry-core (0.5.0)
28
29
  concurrent-ruby (~> 1.0)
29
- dry-equalizer (0.2.1)
30
+ dry-equalizer (0.3.0)
30
31
  dry-monads (0.4.0)
31
32
  dry-core (~> 0.3, >= 0.3.3)
32
33
  dry-equalizer
33
- equatable (0.5.0)
34
+ gambiarra (0.0.5)
35
+ activesupport (> 5.2)
36
+ cli-ui (~> 1.1)
37
+ thor (~> 1.1.0)
34
38
  hike (1.2.3)
35
- hitimes (1.2.6)
36
- i18n (1.1.1)
39
+ i18n (1.8.8)
37
40
  concurrent-ruby (~> 1.0)
38
- json (2.1.0)
39
- method_source (0.9.0)
40
- minitest (5.11.3)
41
- necromancer (0.4.0)
42
- opal (0.10.5)
41
+ method_source (1.0.0)
42
+ minitest (5.14.3)
43
+ opal (0.10.6)
43
44
  hike (~> 1.2)
44
45
  sourcemap (~> 0.1.0)
45
46
  sprockets (~> 3.1)
46
47
  tilt (>= 1.4)
47
- opal-rspec (0.6.1)
48
+ opal-rspec (0.6.2)
48
49
  opal (>= 0.10.0, < 0.12)
49
- paint (2.0.1)
50
- parallel (1.12.1)
51
- parser (2.5.0.5)
52
- ast (~> 2.4.0)
53
- pastel (0.7.2)
54
- equatable (~> 0.5.0)
55
- tty-color (~> 0.4.0)
56
- powerpack (0.1.1)
57
- pry (0.11.3)
58
- coderay (~> 1.1.0)
59
- method_source (~> 0.9.0)
60
- pry-byebug (3.6.0)
61
- byebug (~> 10.0)
62
- pry (~> 0.10)
63
- rack (2.0.4)
50
+ paint (2.2.1)
51
+ parallel (1.20.1)
52
+ parser (3.0.0.0)
53
+ ast (~> 2.4.1)
54
+ pastel (0.8.0)
55
+ tty-color (~> 0.5)
56
+ pry (0.13.1)
57
+ coderay (~> 1.1)
58
+ method_source (~> 1.0)
59
+ pry-byebug (3.9.0)
60
+ byebug (~> 11.0)
61
+ pry (~> 0.13.0)
62
+ rack (2.2.3)
64
63
  rainbow (3.0.0)
65
64
  rake (10.5.0)
66
- rspec (3.7.0)
67
- rspec-core (~> 3.7.0)
68
- rspec-expectations (~> 3.7.0)
69
- rspec-mocks (~> 3.7.0)
70
- rspec-core (3.7.1)
71
- rspec-support (~> 3.7.0)
72
- rspec-expectations (3.7.0)
65
+ regexp_parser (2.0.3)
66
+ rexml (3.2.4)
67
+ rspec (3.10.0)
68
+ rspec-core (~> 3.10.0)
69
+ rspec-expectations (~> 3.10.0)
70
+ rspec-mocks (~> 3.10.0)
71
+ rspec-core (3.10.1)
72
+ rspec-support (~> 3.10.0)
73
+ rspec-expectations (3.10.1)
73
74
  diff-lcs (>= 1.2.0, < 2.0)
74
- rspec-support (~> 3.7.0)
75
- rspec-mocks (3.7.0)
75
+ rspec-support (~> 3.10.0)
76
+ rspec-mocks (3.10.2)
76
77
  diff-lcs (>= 1.2.0, < 2.0)
77
- rspec-support (~> 3.7.0)
78
- rspec-support (3.7.1)
79
- rubocop (0.54.0)
78
+ rspec-support (~> 3.10.0)
79
+ rspec-support (3.10.2)
80
+ rubocop (1.9.1)
80
81
  parallel (~> 1.10)
81
- parser (>= 2.5)
82
- powerpack (~> 0.1)
82
+ parser (>= 3.0.0.0)
83
83
  rainbow (>= 2.2.2, < 4.0)
84
+ regexp_parser (>= 1.8, < 3.0)
85
+ rexml
86
+ rubocop-ast (>= 1.2.0, < 2.0)
84
87
  ruby-progressbar (~> 1.7)
85
- unicode-display_width (~> 1.0, >= 1.0.1)
86
- ruby-progressbar (1.9.0)
87
- simplecov (0.16.1)
88
+ unicode-display_width (>= 1.4.0, < 3.0)
89
+ rubocop-ast (1.4.1)
90
+ parser (>= 2.7.1.5)
91
+ ruby-progressbar (1.11.0)
92
+ simplecov (0.21.2)
88
93
  docile (~> 1.1)
89
- json (>= 1.8, < 3)
90
- simplecov-html (~> 0.10.0)
91
- simplecov-html (0.10.2)
94
+ simplecov-html (~> 0.11)
95
+ simplecov_json_formatter (~> 0.1)
96
+ simplecov-html (0.12.3)
97
+ simplecov_json_formatter (0.1.2)
92
98
  sourcemap (0.1.1)
93
- sprockets (3.7.1)
99
+ sprockets (3.7.2)
94
100
  concurrent-ruby (~> 1.0)
95
101
  rack (> 1, < 3)
96
- thread_safe (0.3.6)
97
- tilt (2.0.8)
98
- timers (4.1.2)
99
- hitimes
100
- tty-color (0.4.2)
101
- tty-cursor (0.5.0)
102
- tty-prompt (0.16.0)
103
- necromancer (~> 0.4.0)
104
- pastel (~> 0.7.0)
105
- timers (~> 4.0)
106
- tty-cursor (~> 0.5.0)
107
- tty-reader (~> 0.2.0)
108
- tty-reader (0.2.0)
109
- tty-cursor (~> 0.5.0)
110
- tty-screen (~> 0.6.4)
111
- wisper (~> 2.0.0)
112
- tty-screen (0.6.4)
113
- tzinfo (1.2.5)
114
- thread_safe (~> 0.1)
115
- unicode-display_width (1.3.0)
116
- wisper (2.0.0)
102
+ thor (1.1.0)
103
+ tilt (2.0.10)
104
+ tty-color (0.6.0)
105
+ tty-cursor (0.7.1)
106
+ tty-prompt (0.23.0)
107
+ pastel (~> 0.8)
108
+ tty-reader (~> 0.8)
109
+ tty-reader (0.9.0)
110
+ tty-cursor (~> 0.7)
111
+ tty-screen (~> 0.8)
112
+ wisper (~> 2.0)
113
+ tty-screen (0.8.1)
114
+ tzinfo (2.0.4)
115
+ concurrent-ruby (~> 1.0)
116
+ unicode-display_width (2.0.0)
117
+ wisper (2.0.1)
118
+ zeitwerk (2.4.2)
117
119
 
118
120
  PLATFORMS
119
121
  ruby
120
122
 
121
123
  DEPENDENCIES
122
- bundler (~> 1.14)
124
+ bundler (~> 2.2.5)
123
125
  coltrane!
124
126
  opal-rspec
125
127
  pry
@@ -131,4 +133,4 @@ DEPENDENCIES
131
133
  tty-prompt
132
134
 
133
135
  BUNDLED WITH
134
- 1.16.4
136
+ 2.2.5
data/bin/bundle CHANGED
@@ -11,7 +11,7 @@
11
11
  require "rubygems"
12
12
 
13
13
  m = Module.new do
14
- module_function
14
+ module_function
15
15
 
16
16
  def invoked_as_script?
17
17
  File.expand_path($0) == File.expand_path(__FILE__)
@@ -31,7 +31,7 @@ m = Module.new do
31
31
  bundler_version = a
32
32
  end
33
33
  next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/
34
- bundler_version = $1 || ">= 0.a"
34
+ bundler_version = $1
35
35
  update_index = i
36
36
  end
37
37
  bundler_version
@@ -61,32 +61,41 @@ m = Module.new do
61
61
  end
62
62
 
63
63
  def bundler_version
64
- @bundler_version ||= begin
64
+ @bundler_version ||=
65
65
  env_var_version || cli_arg_version ||
66
- lockfile_version || "#{Gem::Requirement.default}.a"
67
- end
66
+ lockfile_version
67
+ end
68
+
69
+ def bundler_requirement
70
+ return "#{Gem::Requirement.default}.a" unless bundler_version
71
+
72
+ bundler_gem_version = Gem::Version.new(bundler_version)
73
+
74
+ requirement = bundler_gem_version.approximate_recommendation
75
+
76
+ return requirement unless Gem::Version.new(Gem::VERSION) < Gem::Version.new("2.7.0")
77
+
78
+ requirement += ".a" if bundler_gem_version.prerelease?
79
+
80
+ requirement
68
81
  end
69
82
 
70
83
  def load_bundler!
71
84
  ENV["BUNDLE_GEMFILE"] ||= gemfile
72
85
 
73
- # must dup string for RG < 1.8 compatibility
74
- activate_bundler(bundler_version.dup)
86
+ activate_bundler
75
87
  end
76
88
 
77
- def activate_bundler(bundler_version)
78
- if Gem::Version.correct?(bundler_version) && Gem::Version.new(bundler_version).release < Gem::Version.new("2.0")
79
- bundler_version = "< 2"
80
- end
89
+ def activate_bundler
81
90
  gem_error = activation_error_handling do
82
- gem "bundler", bundler_version
91
+ gem "bundler", bundler_requirement
83
92
  end
84
93
  return if gem_error.nil?
85
94
  require_error = activation_error_handling do
86
95
  require "bundler/version"
87
96
  end
88
- return if require_error.nil? && Gem::Requirement.new(bundler_version).satisfied_by?(Gem::Version.new(Bundler::VERSION))
89
- warn "Activating bundler (#{bundler_version}) failed:\n#{gem_error.message}\n\nTo install the version of bundler this project requires, run `gem install bundler -v '#{bundler_version}'`"
97
+ return if require_error.nil? && Gem::Requirement.new(bundler_requirement).satisfied_by?(Gem::Version.new(Bundler::VERSION))
98
+ warn "Activating bundler (#{bundler_requirement}) failed:\n#{gem_error.message}\n\nTo install the version of bundler this project requires, run `gem install bundler -v '#{bundler_requirement}'`"
90
99
  exit 42
91
100
  end
92
101
 
data/bin/console CHANGED
@@ -1,17 +1,29 @@
1
1
  #!/usr/bin/env ruby
2
- $LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
2
+ # frozen_string_literal: true
3
3
 
4
- require "bundler/setup"
5
- require "coltrane"
6
- require "coltrane/commands"
7
- require "coltrane/representation"
8
- require "coltrane/renderers"
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'console' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
9
14
 
10
- require "pry"
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
11
16
 
12
- include Coltrane
13
- include Coltrane::Theory
14
- include Coltrane::Representation
15
- include Coltrane::Renderers
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
16
28
 
17
- Pry.start
29
+ load Gem.bin_path("wisper", "console")
data/bin/gambiarra ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'gambiarra' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("gambiarra", "gambiarra")
data/bin/setup CHANGED
@@ -1,8 +1,29 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
- IFS=$'\n\t'
4
- set -vx
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
5
3
 
6
- bundle install
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'setup' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
7
10
 
8
- # Do any other automated setup that you need to do here
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("wisper", "setup")
data/bin/thor CHANGED
@@ -15,7 +15,7 @@ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
15
15
  bundle_binstub = File.expand_path("../bundle", __FILE__)
16
16
 
17
17
  if File.file?(bundle_binstub)
18
- if File.read(bundle_binstub, 150) =~ /This file was generated by Bundler/
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
19
  load(bundle_binstub)
20
20
  else
21
21
  abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
data/coltrane.gemspec CHANGED
@@ -33,10 +33,10 @@ Gem::Specification.new do |spec|
33
33
  spec.require_paths = ["lib"]
34
34
 
35
35
  spec.add_runtime_dependency 'dry-monads', '~> 0.4'
36
+ spec.add_runtime_dependency 'gambiarra', '~> 0'
36
37
  spec.add_runtime_dependency 'paint', '~> 2.0'
37
38
  spec.add_runtime_dependency 'color', '~> 1.8'
38
- spec.add_runtime_dependency 'cli-ui', '~> 1.1'
39
39
  spec.add_runtime_dependency 'activesupport', '> 5.2'
40
- spec.add_development_dependency "bundler", '~> 1.14'
40
+ spec.add_development_dependency "bundler", '~> 2.2.5'
41
41
  spec.add_development_dependency "rake", '~> 10.0'
42
42
  end
data/exe/coltrane CHANGED
@@ -6,10 +6,8 @@ require 'coltrane/ui'
6
6
 
7
7
  module Coltrane
8
8
  module UI
9
- class App
10
- attr_reader :router
11
-
12
- def self.start(initial_route)
9
+ class App < Gambiarra::App
10
+ def setup
13
11
  if ENV['COLORTERM'] == 'truecolor'
14
12
  Paint.mode = 0xFFFFFF
15
13
  else
@@ -18,75 +16,6 @@ module Coltrane
18
16
  "Try something like iTerm2 (for macOS), VTE or Konsole (for linux) or Hyper" \
19
17
  " (for Windows) and you'll see the true magic!"
20
18
  end
21
-
22
- path, params = initial_route.split(' ').each_with_object([nil, {}]) do |segment, memo|
23
- if segment =~ /:/
24
- key, value = segment.split(':')
25
- memo[1].merge!([[key.to_sym, value.gsub('-', ' ')]].to_h)
26
- else
27
- memo[0] = [memo[0], segment].compact.join(' ')
28
- end
29
- end
30
-
31
- response = {path: (path || ''), **params}
32
- loop { response = app.flow(**response) }
33
- end
34
-
35
- def self.app
36
- @app ||= new
37
- end
38
-
39
- def initialize
40
- @router = Router.new
41
- end
42
-
43
- def ask_questions(questions)
44
- questions.map { |name, question| [name, ask_question(question)] }.to_h
45
- end
46
-
47
- def ask_question(question)
48
- CLI::UI::Prompt.ask(question[:statement], options: question[:options])
49
- end
50
-
51
- def navigation(params)
52
- return {} if params.empty?
53
- CLI::UI::Prompt.ask('What to do now?') do |h|
54
- params.each do |key, _value|
55
- h.option("Different #{key}") { params[key] = nil }
56
- end
57
- h.option("Go back") { params[:path] = '' }
58
- end
59
- params
60
- end
61
-
62
- def output(response)
63
- return unless response[:content]
64
- puts [
65
- nil,
66
- "-> coltrane #{router.url}",
67
- nil,
68
- response[:content],
69
- nil
70
- ]
71
- end
72
-
73
- def flow(response)
74
- raise 'Response is empty' unless response
75
- output(response)
76
- response.delete(:content)
77
- questions = response&.delete(:questions) || {}
78
- response.merge!(navigation(response)) unless response.has_key?(:path) || questions.any?
79
- response.merge!(ask_questions(questions)) if questions.any?
80
- exit if response[:path] == 'exit'
81
- router.get(**response.compact)
82
- rescue => e
83
- response.delete(:path)
84
- puts e
85
- retry
86
- end
87
-
88
- def exit
89
- Kernel.exit(0)
90
19
  end
91
20
  end
92
21
  end
Binary file
@@ -1,7 +1,7 @@
1
1
  module Coltrane
2
2
  module Commands
3
3
  class FindScaleByChords < Command
4
- def run(chords)
4
+ def run(*chords)
5
5
  Theory::Scale.having_chords(*chords)
6
6
  end
7
7
  end
@@ -77,7 +77,7 @@ module Coltrane
77
77
  memo +
78
78
  if chord.guitar_notes.select do |n|
79
79
  n.string == s && n.fret == 0 end.any?
80
- highlight ' '
80
+ highlight ' '
81
81
  elsif chord.guitar_notes.select { |n| n.string == s && n.fret.nil? }.any?
82
82
  alt 'x '
83
83
  else
@@ -87,7 +87,7 @@ module Coltrane
87
87
  end
88
88
 
89
89
  def render_note(found)
90
- found ? highlight('') : base_color('│')
90
+ found ? highlight('') : base_color('│')
91
91
  end
92
92
  end
93
93
  end
@@ -40,7 +40,7 @@ module Coltrane
40
40
  when :intervals then (note_set.root - note).name
41
41
  when :marks then '◼ '
42
42
  when :degrees then note_set.notes.degree(note).to_s.rjust(2, '0')
43
- when :notes then note.pretty_name.to_s.ljust(2, "\u266E")
43
+ when :notes then note.pretty_name.to_s.ljust(2, " ")
44
44
  end
45
45
  end
46
46
  end
@@ -133,7 +133,7 @@ module Coltrane
133
133
  end
134
134
 
135
135
  def clone(override_args = {})
136
- self.class.new({
136
+ self.class.new(**{
137
137
  semitones: semitones,
138
138
  letter_distance: letter_distance,
139
139
  compound: compound?
data/lib/coltrane/ui.rb CHANGED
@@ -1,9 +1,8 @@
1
- require 'active_support/inflector'
2
1
  require 'paint'
3
2
  require 'color'
4
- require 'cli/ui' # shopify cli
5
3
 
6
- require 'coltrane'
4
+ require 'gambiarra'
7
5
  require 'coltrane/commands'
8
- require 'coltrane/ui/views'
9
- require 'coltrane/ui/router'
6
+
7
+ require File.expand_path('../ui/base_view', __FILE__)
8
+ views = Dir[File.expand_path('../ui/views/*', __FILE__)].map { |view| require(view) }
Binary file
@@ -0,0 +1,9 @@
1
+ module Coltrane
2
+ module UI
3
+ class BaseView < Gambiarra::View
4
+ def self.render(view)
5
+ Commands::Render.run(view.render)
6
+ end
7
+ end
8
+ end
9
+ end
Binary file
@@ -1,7 +1,7 @@
1
1
  module Coltrane
2
2
  module UI
3
3
  module Views
4
- class Chords < View
4
+ class Chords < BaseView
5
5
  questions({
6
6
  path: {
7
7
  statement: 'What do you need',
@@ -1,7 +1,7 @@
1
1
  module Coltrane
2
2
  module UI
3
3
  module Views
4
- class CustomProgression < View
4
+ class CustomProgression < BaseView
5
5
  questions({
6
6
  progression_notation: {
7
7
  statement: 'What is the progression? (Ex: I-vi-IV-V)'
@@ -1,7 +1,7 @@
1
1
  module Coltrane
2
2
  module UI
3
3
  module Views
4
- class FindChordByNotes < View
4
+ class FindChordByNotes < BaseView
5
5
  questions({
6
6
  notes: { statement: 'Which Notes?' }
7
7
  })
@@ -18,7 +18,9 @@ module Coltrane
18
18
  chord_representation: {
19
19
  statement: 'How do you wanna see this',
20
20
  options: Commands::AvailableChordRepresentations.run
21
- }
21
+ },
22
+
23
+ representation: nil
22
24
  })
23
25
  def render
24
26
  scale = Commands::GetClassicScale.run(*params.values_at(:scale, :tone))
@@ -1,7 +1,7 @@
1
1
  module Coltrane
2
2
  module UI
3
3
  module Views
4
- class FindCommonChordsInScales < View
4
+ class FindCommonChordsInScales < BaseView
5
5
  questions({
6
6
  first_scale: {
7
7
  statement: 'Choose the first scale',
@@ -1,7 +1,7 @@
1
1
  module Coltrane
2
2
  module UI
3
3
  module Views
4
- class FindProgressionsFromChords < View
4
+ class FindProgressionsFromChords < BaseView
5
5
  questions chords: { statement: 'Type the chords? (Ex: CM EM GM)' }
6
6
 
7
7
  def render
@@ -1,7 +1,7 @@
1
1
  module Coltrane
2
2
  module UI
3
3
  module Views
4
- class FindScale < View
4
+ class FindScale < BaseView
5
5
  questions({
6
6
  path: {
7
7
  statement: 'How do you wanna search',
@@ -1,7 +1,7 @@
1
1
  module Coltrane
2
2
  module UI
3
3
  module Views
4
- class FindScaleByChords < View
4
+ class FindScaleByChords < BaseView
5
5
  questions({
6
6
  chords: { statement: 'Which Chords?' }
7
7
  })
@@ -1,7 +1,7 @@
1
1
  module Coltrane
2
2
  module UI
3
3
  module Views
4
- class FindScaleByNotes < View
4
+ class FindScaleByNotes < BaseView
5
5
  questions({
6
6
  notes: { statement: 'Which Notes?' }
7
7
  })
@@ -1,7 +1,7 @@
1
1
  module Coltrane
2
2
  module UI
3
3
  module Views
4
- class Index < View
4
+ class Index < BaseView
5
5
  questions({
6
6
  path: {
7
7
  statement: "Welcome to Coltrane #{Coltrane::VERSION}",
@@ -1,7 +1,7 @@
1
1
  module Coltrane
2
2
  module UI
3
3
  module Views
4
- class Notes < View
4
+ class Notes < BaseView
5
5
  questions({
6
6
  notes: { statement: 'Which notes?' } ,
7
7
  representation: {
@@ -1,7 +1,7 @@
1
1
  module Coltrane
2
2
  module UI
3
3
  module Views
4
- class Progressions < View
4
+ class Progressions < BaseView
5
5
  questions({
6
6
  path: {
7
7
  statement: 'What do you need?',
@@ -1,7 +1,7 @@
1
1
  module Coltrane
2
2
  module UI
3
3
  module Views
4
- class Scales < View
4
+ class Scales < BaseView
5
5
  questions({
6
6
  path: {
7
7
  statement: 'What do you need?',
@@ -1,7 +1,7 @@
1
1
  module Coltrane
2
2
  module UI
3
3
  module Views
4
- class ShowChord < View
4
+ class ShowChord < BaseView
5
5
  questions({
6
6
  chord: { statement: 'Which chord?' },
7
7
  chord_representation: {
@@ -1,7 +1,7 @@
1
1
  module Coltrane
2
2
  module UI
3
3
  module Views
4
- class ShowProgression < View
4
+ class ShowProgression < BaseView
5
5
  questions({
6
6
  progression: {
7
7
  statement: 'What is the progression?',
@@ -1,7 +1,7 @@
1
1
  module Coltrane
2
2
  module UI
3
3
  module Views
4
- class ShowScale < View
4
+ class ShowScale < BaseView
5
5
  questions({
6
6
  scale: {
7
7
  statement: 'Which Scale?',
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Coltrane
4
- VERSION = '4.0.3'
4
+ VERSION = '4.1.1'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: coltrane
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.3
4
+ version: 4.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pedro Maciel
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-10-16 00:00:00.000000000 Z
11
+ date: 2021-02-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-monads
@@ -25,47 +25,47 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.4'
27
27
  - !ruby/object:Gem::Dependency
28
- name: paint
28
+ name: gambiarra
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '2.0'
33
+ version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '2.0'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: color
42
+ name: paint
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.8'
47
+ version: '2.0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1.8'
54
+ version: '2.0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: cli-ui
56
+ name: color
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '1.1'
61
+ version: '1.8'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '1.1'
68
+ version: '1.8'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: activesupport
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '1.14'
89
+ version: 2.2.5
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '1.14'
96
+ version: 2.2.5
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: rake
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -142,6 +142,7 @@ files:
142
142
  - bin/console
143
143
  - bin/erubis
144
144
  - bin/flay
145
+ - bin/gambiarra
145
146
  - bin/gitlab
146
147
  - bin/guard
147
148
  - bin/htmldiff
@@ -258,8 +259,8 @@ files:
258
259
  - lib/coltrane/theory/voicing.rb
259
260
  - lib/coltrane/ui.rb
260
261
  - lib/coltrane/ui/.DS_Store
261
- - lib/coltrane/ui/router.rb
262
- - lib/coltrane/ui/views.rb
262
+ - lib/coltrane/ui/base_view.rb
263
+ - lib/coltrane/ui/views/.DS_Store
263
264
  - lib/coltrane/ui/views/chords.rb
264
265
  - lib/coltrane/ui/views/custom_progression.rb
265
266
  - lib/coltrane/ui/views/find_chord_by_notes.rb
@@ -276,7 +277,6 @@ files:
276
277
  - lib/coltrane/ui/views/show_chord.rb
277
278
  - lib/coltrane/ui/views/show_progression.rb
278
279
  - lib/coltrane/ui/views/show_scale.rb
279
- - lib/coltrane/ui/views/view.rb
280
280
  - lib/coltrane/version.rb
281
281
  - lib/core_ext.rb
282
282
  homepage: http://github.com/pedrozath/coltrane
@@ -299,8 +299,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
299
299
  - !ruby/object:Gem::Version
300
300
  version: '0'
301
301
  requirements: []
302
- rubyforge_project:
303
- rubygems_version: 2.7.7
302
+ rubygems_version: 3.0.8
304
303
  signing_key:
305
304
  specification_version: 4
306
305
  summary: It deals with all sorts of calculations around music theory and allows for
@@ -1,87 +0,0 @@
1
- module Coltrane
2
- module UI
3
- class Router
4
-
5
- class Route
6
- attr_reader :path, :view, :last
7
- attr_accessor :params
8
-
9
- def initialize(path, to:, with: {})
10
- @path = path
11
- @view = to
12
- @params = with
13
- end
14
-
15
- def render(**other_params)
16
- view.render(**params, **other_params)
17
- end
18
- end
19
-
20
- class History
21
- attr_reader :routes
22
-
23
- def initialize
24
- @routes = []
25
- end
26
-
27
- def add(route)
28
- @routes << route
29
- end
30
-
31
- def previous
32
- routes[-2]&.path || ''
33
- end
34
-
35
- def current_route
36
- routes[-1]
37
- end
38
-
39
- def back
40
- routes.pop.render
41
- end
42
-
43
- def refresh(params={})
44
- current_route.render(params)
45
- end
46
- end
47
-
48
- attr_reader :path, :params, :routes, :history, :url
49
-
50
- def initialize
51
- @routes = []
52
- @history = History.new
53
-
54
- draw_route '', to: Coltrane::UI::Views::Index
55
- Views.constants.each do |view|
56
- draw_route view.to_s.underscore.humanize.downcase, to: "Coltrane::UI::Views::#{view}".constantize
57
- end
58
- end
59
-
60
- def get(**params)
61
- path = params.delete(:path)
62
- @url = build_url(path || history.current_route.path, **params)
63
- route = @routes.detect { |route| route.path == path }
64
- return history.refresh(params) unless route
65
- history.add(route)
66
- route.render(**params)
67
- end
68
-
69
- def build_url(path, params)
70
- [
71
- path,
72
- (params || {}).map do |k,v|
73
- [k,v.gsub(' ', '-')].join(':')
74
- end
75
- ].compact.join(' ')
76
- end
77
-
78
- def previous_path
79
- history.previous
80
- end
81
-
82
- def draw_route(*args, **keyword_args, &block)
83
- @routes << Route.new(*args, **keyword_args, &block)
84
- end
85
- end
86
- end
87
- end
@@ -1,4 +0,0 @@
1
- require 'coltrane/ui/views/view'
2
- Dir[File.expand_path('../views/*', __FILE__)].map do |f|
3
- require(f)
4
- end
@@ -1,47 +0,0 @@
1
- module Coltrane
2
- module UI
3
- module Views
4
- class View
5
- attr_reader :params, :path
6
-
7
- class << self
8
- def inherited(subclass)
9
- @questions ||= {}
10
- subclass.instance_variable_set(:@questions, @questions.deep_dup)
11
- end
12
-
13
- def questions(question_data)
14
- @questions.merge!(question_data)
15
- end
16
-
17
- def set_path(value)
18
- @params[:path] = value
19
- end
20
-
21
- def render(**params)
22
- remaining_questions = @questions.slice(*(@questions.keys - params.keys))
23
- return { questions: remaining_questions, **params } if remaining_questions.any?
24
- view = new(**params)
25
- { content: Commands::Render.run(view.render), **params }
26
- end
27
- end
28
-
29
- def initialize(**params)
30
- @params = params
31
- end
32
-
33
- def output(object)
34
- self.class.output(object)
35
- end
36
-
37
- def go_to(path, **params)
38
- # App.router.set_next(path, **params) and return
39
- end
40
-
41
- def ensure_param(param_name, &block)
42
- @params[param_name] = block.call if @params[param_name].nil?
43
- end
44
- end
45
- end
46
- end
47
- end