loading
Generated 2024-10-18T01:14:15+00:00

All Files ( 100.0% covered at 6.87 hits/line )

21 files in total.
330 relevant lines, 330 lines covered and 0 lines missed. ( 100.0% )
15 total branches, 15 branches covered and 0 branches missed. ( 100.0% )
File % covered Lines Relevant Lines Lines covered Lines missed Avg. Hits / Line Branch Coverage Branches Covered branches Missed branches
lib/sublime_text_kit.rb 100.00 % 17 9 9 0 1.33 100.00 % 0 0 0
lib/sublime_text_kit/../../sublime_text_kit.gemspec 100.00 % 42 27 27 0 1.00 100.00 % 0 0 0
lib/sublime_text_kit/cli/actions/metadata/create.rb 100.00 % 47 25 25 0 2.84 100.00 % 0 0 0
lib/sublime_text_kit/cli/actions/metadata/delete.rb 100.00 % 47 25 25 0 2.84 100.00 % 0 0 0
lib/sublime_text_kit/cli/actions/metadata/recreate.rb 100.00 % 47 25 25 0 2.84 100.00 % 0 0 0
lib/sublime_text_kit/cli/actions/session.rb 100.00 % 32 16 16 0 2.63 100.00 % 0 0 0
lib/sublime_text_kit/cli/actions/snippets.rb 100.00 % 37 19 19 0 3.58 100.00 % 3 3 0
lib/sublime_text_kit/cli/actions/update.rb 100.00 % 48 24 24 0 4.21 100.00 % 0 0 0
lib/sublime_text_kit/cli/shell.rb 100.00 % 48 27 27 0 6.33 100.00 % 0 0 0
lib/sublime_text_kit/configuration/contract.rb 100.00 % 18 11 11 0 1.00 100.00 % 0 0 0
lib/sublime_text_kit/configuration/model.rb 100.00 % 17 7 7 0 5.43 100.00 % 0 0 0
lib/sublime_text_kit/import.rb 100.00 % 7 3 3 0 1.00 100.00 % 0 0 0
lib/sublime_text_kit/metadata/handler.rb 100.00 % 39 18 18 0 21.78 100.00 % 4 4 0
lib/sublime_text_kit/metadata/pathway.rb 100.00 % 19 9 9 0 44.33 100.00 % 0 0 0
lib/sublime_text_kit/metadata/serializers/project.rb 100.00 % 24 9 9 0 11.00 100.00 % 0 0 0
lib/sublime_text_kit/metadata/serializers/workspace.rb 100.00 % 27 9 9 0 9.00 100.00 % 0 0 0
lib/sublime_text_kit/sessions/rebuilder.rb 100.00 % 38 18 18 0 2.39 100.00 % 4 4 0
lib/sublime_text_kit/snippets/collector.rb 100.00 % 30 14 14 0 6.29 100.00 % 0 0 0
lib/sublime_text_kit/snippets/model.rb 100.00 % 31 13 13 0 25.08 100.00 % 2 2 0
lib/sublime_text_kit/snippets/printer.rb 100.00 % 25 12 12 0 5.92 100.00 % 0 0 0
lib/sublime_text_kit/snippets/reader.rb 100.00 % 21 10 10 0 8.10 100.00 % 2 2 0

lib/sublime_text_kit.rb

100.0% lines covered

100.0% branches covered

9 relevant lines. 9 lines covered and 0 lines missed.
0 total branches, 0 branches covered and 0 branches missed.
    
  1. # frozen_string_literal: true
  2. 1 require "zeitwerk"
  3. 1 Zeitwerk::Loader.new.then do |loader|
  4. 1 loader.inflector.inflect "ascii_doc" => "ASCIIDoc", "cli" => "CLI"
  5. 1 loader.tag = File.basename __FILE__, ".rb"
  6. 1 loader.push_dir __dir__
  7. 1 loader.setup
  8. end
  9. # Main namespace.
  10. 1 module SublimeTextKit
  11. 1 def self.loader registry = Zeitwerk::Registry
  12. 4 @loader ||= registry.loaders.find { |loader| loader.tag == File.basename(__FILE__, ".rb") }
  13. end
  14. end

lib/sublime_text_kit/../../sublime_text_kit.gemspec

100.0% lines covered

100.0% branches covered

27 relevant lines. 27 lines covered and 0 lines missed.
0 total branches, 0 branches covered and 0 branches missed.
    
  1. # frozen_string_literal: true
  2. 1 Gem::Specification.new do |spec|
  3. 1 spec.name = "sublime_text_kit"
  4. 1 spec.version = "17.4.0"
  5. 1 spec.authors = ["Brooke Kuhlmann"]
  6. 1 spec.email = ["brooke@alchemists.io"]
  7. 1 spec.homepage = "https://alchemists.io/projects/sublime_text_kit"
  8. 1 spec.summary = "A command line interface for managing Sublime Text metadata."
  9. 1 spec.license = "Hippocratic-2.1"
  10. 1 spec.metadata = {
  11. "bug_tracker_uri" => "https://github.com/bkuhlmann/sublime_text_kit/issues",
  12. "changelog_uri" => "https://alchemists.io/projects/sublime_text_kit/versions",
  13. "homepage_uri" => "https://alchemists.io/projects/sublime_text_kit",
  14. "funding_uri" => "https://github.com/sponsors/bkuhlmann",
  15. "label" => "Sublime Text Kit",
  16. "rubygems_mfa_required" => "true",
  17. "source_code_uri" => "https://github.com/bkuhlmann/sublime_text_kit"
  18. }
  19. 1 spec.signing_key = Gem.default_key_path
  20. 1 spec.cert_chain = [Gem.default_cert_path]
  21. 1 spec.required_ruby_version = ">= 3.3", "<= 3.4"
  22. 1 spec.add_dependency "cogger", "~> 0.26"
  23. 1 spec.add_dependency "containable", "~> 0.2"
  24. 1 spec.add_dependency "dry-monads", "~> 1.6"
  25. 1 spec.add_dependency "dry-schema", "~> 1.13"
  26. 1 spec.add_dependency "etcher", "~> 2.1"
  27. 1 spec.add_dependency "infusible", "~> 3.11"
  28. 1 spec.add_dependency "refinements", "~> 12.9"
  29. 1 spec.add_dependency "runcom", "~> 11.5"
  30. 1 spec.add_dependency "sod", "~> 0.17"
  31. 1 spec.add_dependency "spek", "~> 3.0"
  32. 1 spec.add_dependency "zeitwerk", "~> 2.7"
  33. 1 spec.bindir = "exe"
  34. 1 spec.executables << "sublime_text_kit"
  35. 1 spec.extra_rdoc_files = Dir["README*", "LICENSE*"]
  36. 1 spec.files = Dir["*.gemspec", "lib/**/*"]
  37. end

lib/sublime_text_kit/cli/actions/metadata/create.rb

100.0% lines covered

100.0% branches covered

25 relevant lines. 25 lines covered and 0 lines missed.
0 total branches, 0 branches covered and 0 branches missed.
    
  1. # frozen_string_literal: true
  2. 1 require "refinements/pathname"
  3. 1 require "sod"
  4. 1 module SublimeTextKit
  5. 1 module CLI
  6. 1 module Actions
  7. 1 module Metadata
  8. # Creates project metadata.
  9. 1 class Create < Sod::Action
  10. 1 include Import[:settings, :logger]
  11. 1 using Refinements::Pathname
  12. 1 description "Create metadata."
  13. 1 on %w[-c --create]
  14. 1 def initialize(handler: SublimeTextKit::Metadata::Handler, **)
  15. 12 super(**)
  16. 12 @handler = handler
  17. end
  18. 1 def call(*)
  19. 3 logger.info "Creating metadata in #{metadata_dir}..."
  20. 3 process_projects
  21. 3 logger.info "Metadata created."
  22. end
  23. 1 private
  24. 1 attr_reader :handler
  25. 1 def process_projects
  26. 3 settings.project_dirs.each do |directory|
  27. 9 handler.with_project(directory, metadata_dir).create
  28. 9 handler.with_workspace(directory, metadata_dir).create
  29. end
  30. end
  31. 1 def metadata_dir = Pathname(settings.metadata_dir).expand_path
  32. end
  33. end
  34. end
  35. end
  36. end

lib/sublime_text_kit/cli/actions/metadata/delete.rb

100.0% lines covered

100.0% branches covered

25 relevant lines. 25 lines covered and 0 lines missed.
0 total branches, 0 branches covered and 0 branches missed.
    
  1. # frozen_string_literal: true
  2. 1 require "refinements/pathname"
  3. 1 require "sod"
  4. 1 module SublimeTextKit
  5. 1 module CLI
  6. 1 module Actions
  7. 1 module Metadata
  8. # Deletes project metadata.
  9. 1 class Delete < Sod::Action
  10. 1 include Import[:settings, :logger]
  11. 1 using Refinements::Pathname
  12. 1 description "Delete metadata."
  13. 1 on %w[-d --delete]
  14. 1 def initialize(handler: SublimeTextKit::Metadata::Handler, **)
  15. 12 super(**)
  16. 12 @handler = handler
  17. end
  18. 1 def call(*)
  19. 3 logger.info "Deleting metadata in #{metadata_dir}..."
  20. 3 process_projects
  21. 3 logger.info "Metadata deleted."
  22. end
  23. 1 private
  24. 1 attr_reader :handler
  25. 1 def process_projects
  26. 3 settings.project_dirs.each do |directory|
  27. 9 handler.with_project(directory, metadata_dir).delete
  28. 9 handler.with_workspace(directory, metadata_dir).delete
  29. end
  30. end
  31. 1 def metadata_dir = Pathname(settings.metadata_dir).expand_path
  32. end
  33. end
  34. end
  35. end
  36. end

lib/sublime_text_kit/cli/actions/metadata/recreate.rb

100.0% lines covered

100.0% branches covered

25 relevant lines. 25 lines covered and 0 lines missed.
0 total branches, 0 branches covered and 0 branches missed.
    
  1. # frozen_string_literal: true
  2. 1 require "refinements/pathname"
  3. 1 require "sod"
  4. 1 module SublimeTextKit
  5. 1 module CLI
  6. 1 module Actions
  7. 1 module Metadata
  8. # Recreates project metadata.
  9. 1 class Recreate < Sod::Action
  10. 1 include Import[:settings, :logger]
  11. 1 using Refinements::Pathname
  12. 1 description "Recreate metadata."
  13. 1 on %w[-r --recreate]
  14. 1 def initialize(handler: SublimeTextKit::Metadata::Handler, **)
  15. 12 super(**)
  16. 12 @handler = handler
  17. end
  18. 1 def call(*)
  19. 3 logger.info "Recreating metadata in #{metadata_dir}..."
  20. 3 process_projects
  21. 3 logger.info "Metadata recreated."
  22. end
  23. 1 private
  24. 1 attr_reader :handler
  25. 1 def process_projects
  26. 3 settings.project_dirs.each do |directory|
  27. 9 handler.with_project(directory, metadata_dir).recreate
  28. 9 handler.with_workspace(directory, metadata_dir).recreate
  29. end
  30. end
  31. 1 def metadata_dir = Pathname(settings.metadata_dir).expand_path
  32. end
  33. end
  34. end
  35. end
  36. end

lib/sublime_text_kit/cli/actions/session.rb

100.0% lines covered

100.0% branches covered

16 relevant lines. 16 lines covered and 0 lines missed.
0 total branches, 0 branches covered and 0 branches missed.
    
  1. # frozen_string_literal: true
  2. 1 require "sod"
  3. 1 module SublimeTextKit
  4. 1 module CLI
  5. 1 module Actions
  6. # Handles session action.
  7. 1 class Session < Sod::Action
  8. 1 include Import[:logger]
  9. 1 description "Rebuild session metadata."
  10. 1 on %w[-S --session]
  11. 1 def initialize(rebuilder: Sessions::Rebuilder.new, **)
  12. 12 super(**)
  13. 12 @rebuilder = rebuilder
  14. end
  15. 1 def call(*)
  16. 3 rebuilder.call
  17. 3 logger.info "Session rebuilt."
  18. end
  19. 1 private
  20. 1 attr_reader :rebuilder
  21. end
  22. end
  23. end
  24. end

lib/sublime_text_kit/cli/actions/snippets.rb

100.0% lines covered

100.0% branches covered

19 relevant lines. 19 lines covered and 0 lines missed.
3 total branches, 3 branches covered and 0 branches missed.
    
  1. # frozen_string_literal: true
  2. 1 require "sod"
  3. 1 module SublimeTextKit
  4. 1 module CLI
  5. 1 module Actions
  6. # Handles snippets action.
  7. 1 class Snippets < Sod::Action
  8. 1 include Import[:settings, :logger]
  9. 1 description "View snippets."
  10. 1 on %w[-s --snippets], argument: "[FORMAT]", allow: %w[markdown ascii_doc]
  11. 15 default { Container[:settings].snippets_format }
  12. 1 def initialize(printer: SublimeTextKit::Snippets::Printer.new, **)
  13. 14 super(**)
  14. 14 @printer = printer
  15. end
  16. 1 def call kind = default
  17. 6 when: 3 case kind
  18. 3 when: 2 when "ascii_doc" then printer.call "*"
  19. 2 else: 1 when "markdown" then printer.call "-"
  20. 2 else logger.error { "Invalid snippet format: #{kind}. Use ascii_doc or markdown." }
  21. end
  22. end
  23. 1 private
  24. 1 attr_reader :printer
  25. end
  26. end
  27. end
  28. end

lib/sublime_text_kit/cli/actions/update.rb

100.0% lines covered

100.0% branches covered

24 relevant lines. 24 lines covered and 0 lines missed.
0 total branches, 0 branches covered and 0 branches missed.
    
  1. # frozen_string_literal: true
  2. 1 require "sod"
  3. 1 module SublimeTextKit
  4. 1 module CLI
  5. 1 module Actions
  6. # Handles update action.
  7. 1 class Update < Sod::Action
  8. 1 include Import[:settings, :logger]
  9. 1 description "Update project and session metadata based on current settings."
  10. 1 on %w[-u --update]
  11. 1 def initialize(
  12. metadata: SublimeTextKit::Metadata::Handler,
  13. session: Sessions::Rebuilder.new,
  14. **
  15. )
  16. 13 super(**)
  17. 13 @metadata = metadata
  18. 13 @session = session
  19. end
  20. 1 def call(*)
  21. 4 logger.info "Updating metadata and session..."
  22. 4 create_metadata
  23. 4 session.call
  24. 8 logger.info { "Metadata and session updated." }
  25. end
  26. 1 private
  27. 1 attr_reader :metadata, :session
  28. 1 def create_metadata
  29. 4 settings.project_dirs.each do |directory|
  30. 12 metadata.with_project(directory, metadata_dir).create
  31. 12 metadata.with_workspace(directory, metadata_dir).create
  32. end
  33. end
  34. 1 def metadata_dir = Pathname(settings.metadata_dir).expand_path
  35. end
  36. end
  37. end
  38. end

lib/sublime_text_kit/cli/shell.rb

100.0% lines covered

100.0% branches covered

27 relevant lines. 27 lines covered and 0 lines missed.
0 total branches, 0 branches covered and 0 branches missed.
    
  1. # frozen_string_literal: true
  2. 1 require "sod"
  3. 1 module SublimeTextKit
  4. 1 module CLI
  5. # The main Command Line Interface (CLI) object.
  6. 1 class Shell
  7. 1 include Import[:defaults_path, :xdg_config, :specification]
  8. 1 def initialize(context: Sod::Context, dsl: Sod, **)
  9. 10 super(**)
  10. 10 @context = context
  11. 10 @dsl = dsl
  12. end
  13. 1 def call(...) = cli.call(...)
  14. 1 private
  15. 1 attr_reader :context, :dsl
  16. 1 def cli
  17. 10 context = build_context
  18. 10 dsl.new :sublime_text_kit, banner: specification.banner do
  19. 10 on(Sod::Prefabs::Commands::Config, context:)
  20. 10 on "metadata", "Manage project metadata." do
  21. 10 on Actions::Metadata::Create
  22. 10 on Actions::Metadata::Delete
  23. 10 on Actions::Metadata::Recreate
  24. end
  25. 10 on Actions::Session
  26. 10 on Actions::Snippets
  27. 10 on Actions::Update
  28. 10 on(Sod::Prefabs::Actions::Version, context:)
  29. 10 on Sod::Prefabs::Actions::Help, self
  30. end
  31. end
  32. 1 def build_context
  33. 10 context[defaults_path:, xdg_config:, version_label: specification.labeled_version]
  34. end
  35. end
  36. end
  37. end

lib/sublime_text_kit/configuration/contract.rb

100.0% lines covered

100.0% branches covered

11 relevant lines. 11 lines covered and 0 lines missed.
0 total branches, 0 branches covered and 0 branches missed.
    
  1. # frozen_string_literal: true
  2. 1 require "dry/schema"
  3. 1 require "etcher"
  4. 1 Dry::Schema.load_extensions :monads
  5. 1 module SublimeTextKit
  6. 1 module Configuration
  7. 1 Contract = Dry::Schema.Params do
  8. 1 optional(:project_roots).filled :array
  9. 1 optional(:metadata_dir).filled Etcher::Types::Pathname
  10. 1 required(:snippets_format).filled :string
  11. 1 required(:session_path).filled Etcher::Types::Pathname
  12. 1 required(:user_dir).filled Etcher::Types::Pathname
  13. end
  14. end
  15. end

lib/sublime_text_kit/configuration/model.rb

100.0% lines covered

100.0% branches covered

7 relevant lines. 7 lines covered and 0 lines missed.
0 total branches, 0 branches covered and 0 branches missed.
    
  1. # frozen_string_literal: true
  2. 1 require "refinements/pathname"
  3. 1 module SublimeTextKit
  4. 1 module Configuration
  5. # Models the settings.
  6. 1 Model = Struct.new :project_roots, :metadata_dir, :snippets_format, :session_path, :user_dir do
  7. 1 using Refinements::Pathname
  8. 1 def project_dirs
  9. 32 Array(project_roots).map { |path| Pathname(path).expand_path }
  10. .flat_map(&:directories)
  11. end
  12. end
  13. end
  14. end

lib/sublime_text_kit/import.rb

100.0% lines covered

100.0% branches covered

3 relevant lines. 3 lines covered and 0 lines missed.
0 total branches, 0 branches covered and 0 branches missed.
    
  1. # frozen_string_literal: true
  2. 1 require "infusible"
  3. 1 module SublimeTextKit
  4. 1 Import = Infusible[Container]
  5. end

lib/sublime_text_kit/metadata/handler.rb

100.0% lines covered

100.0% branches covered

18 relevant lines. 18 lines covered and 0 lines missed.
4 total branches, 4 branches covered and 0 branches missed.
    
  1. # frozen_string_literal: true
  2. 1 require "refinements/pathname"
  3. 1 module SublimeTextKit
  4. 1 module Metadata
  5. # Handles the creation, deletion, and recreation of metadata.
  6. 1 class Handler
  7. 1 using Refinements::Pathname
  8. 1 def self.with_project project_dir, metadata_dir
  9. 40 new "sublime-project",
  10. serializer: Serializers::Project.new(Pathway[project_dir:, metadata_dir:])
  11. end
  12. 1 def self.with_workspace project_dir, metadata_dir
  13. 40 new "sublime-workspace",
  14. serializer: Serializers::Workspace.new(Pathway[project_dir:, metadata_dir:])
  15. end
  16. 1 def initialize extension, serializer:
  17. 91 @extension = extension
  18. 91 @serializer = serializer
  19. end
  20. 72 then: 2 else: 69 def create = path.exist? ? path : path.write(JSON.dump(serializer.to_h))
  21. 46 then: 3 else: 42 def delete = path.exist? ? path.delete : path
  22. 1 def recreate = delete && create
  23. 1 private
  24. 1 attr_reader :extension, :serializer
  25. 1 def path = serializer.pathway.metadata_file(extension)
  26. end
  27. end
  28. end

lib/sublime_text_kit/metadata/pathway.rb

100.0% lines covered

100.0% branches covered

9 relevant lines. 9 lines covered and 0 lines missed.
0 total branches, 0 branches covered and 0 branches missed.
    
  1. # frozen_string_literal: true
  2. 1 module SublimeTextKit
  3. 1 module Metadata
  4. # Defines metadata pathways.
  5. 1 Pathway = Struct.new :project_dir, :metadata_dir, keyword_init: true do
  6. 1 using Refinements::Pathname
  7. 1 def initialize *arguments
  8. 98 super
  9. 294 each_pair { |key, value| self[key] = Pathname(value).expand_path }
  10. end
  11. 1 def project_name = project_dir.basename
  12. 1 def metadata_file(extension) = metadata_dir.join("#{project_name}.#{extension}")
  13. end
  14. end
  15. end

lib/sublime_text_kit/metadata/serializers/project.rb

100.0% lines covered

100.0% branches covered

9 relevant lines. 9 lines covered and 0 lines missed.
0 total branches, 0 branches covered and 0 branches missed.
    
  1. # frozen_string_literal: true
  2. 1 module SublimeTextKit
  3. 1 module Metadata
  4. 1 module Serializers
  5. # Serializes project metadata.
  6. 1 class Project
  7. 1 attr_reader :pathway
  8. 1 def initialize pathway
  9. 53 @pathway = pathway
  10. end
  11. 1 def to_h
  12. {
  13. 39 folders: [
  14. {path: pathway.project_dir.to_s}
  15. ]
  16. }
  17. end
  18. end
  19. end
  20. end
  21. end

lib/sublime_text_kit/metadata/serializers/workspace.rb

100.0% lines covered

100.0% branches covered

9 relevant lines. 9 lines covered and 0 lines missed.
0 total branches, 0 branches covered and 0 branches missed.
    
  1. # frozen_string_literal: true
  2. 1 module SublimeTextKit
  3. 1 module Metadata
  4. 1 module Serializers
  5. # Serializes workspace metadata.
  6. 1 class Workspace
  7. 1 attr_reader :pathway
  8. 1 def initialize pathway
  9. 42 @pathway = pathway
  10. end
  11. 1 def to_h
  12. {
  13. 32 expanded_folders: [pathway.project_dir.to_s],
  14. select_project: {
  15. selected_items: [
  16. [pathway.project_name.to_s, pathway.metadata_file("sublime-project").to_s]
  17. ]
  18. }
  19. }
  20. end
  21. end
  22. end
  23. end
  24. end

lib/sublime_text_kit/sessions/rebuilder.rb

100.0% lines covered

100.0% branches covered

18 relevant lines. 18 lines covered and 0 lines missed.
4 total branches, 4 branches covered and 0 branches missed.
    
  1. # frozen_string_literal: true
  2. 1 require "json"
  3. 1 require "refinements/pathname"
  4. 1 module SublimeTextKit
  5. 1 module Sessions
  6. # Manages the rebuilding of session information.
  7. 1 class Rebuilder
  8. 1 include Import[:settings]
  9. 1 using Refinements::Pathname
  10. 1 def call
  11. 6 session = read
  12. 6 else: 3 then: 3 return unless session.dig "workspaces", "recent_workspaces"
  13. 3 Pathname(metadata_dir).expand_path
  14. .files("*.sublime-workspace")
  15. .then do |workspaces|
  16. 3 session["workspaces"]["recent_workspaces"] = workspaces
  17. 3 write session
  18. end
  19. end
  20. 1 private
  21. 7 then: 4 else: 2 def read = source_path.exist? ? JSON(source_path.read) : {}
  22. 4 def write(json) = JSON.dump(json).then { |content| source_path.write content }
  23. 1 def metadata_dir = settings.metadata_dir
  24. 1 def source_path = settings.session_path
  25. end
  26. end
  27. end

lib/sublime_text_kit/snippets/collector.rb

100.0% lines covered

100.0% branches covered

14 relevant lines. 14 lines covered and 0 lines missed.
0 total branches, 0 branches covered and 0 branches missed.
    
  1. # frozen_string_literal: true
  2. 1 require "refinements/pathname"
  3. 1 module SublimeTextKit
  4. 1 module Snippets
  5. # Collects and loads all snippets into memory for further processing.
  6. 1 class Collector
  7. 1 include Import[:settings]
  8. 1 using Refinements::Pathname
  9. 1 def initialize(reader: Reader.new, **)
  10. 20 super(**)
  11. 20 @reader = reader
  12. end
  13. 1 def call
  14. 11 settings.user_dir
  15. .files("*.sublime-snippet")
  16. 27 .map { |path| reader.call path }
  17. .sort_by(&:description)
  18. end
  19. 1 private
  20. 1 attr_reader :reader
  21. end
  22. end
  23. end

lib/sublime_text_kit/snippets/model.rb

100.0% lines covered

100.0% branches covered

13 relevant lines. 13 lines covered and 0 lines missed.
2 total branches, 2 branches covered and 0 branches missed.
    
  1. # frozen_string_literal: true
  2. 1 module SublimeTextKit
  3. 1 module Snippets
  4. 1 KEY_MAP = {
  5. "content" => :content,
  6. "tabTrigger" => :trigger,
  7. "description" => :description,
  8. "scope" => :scope
  9. }.freeze
  10. # Defines a snippet record.
  11. 1 Model = Struct.new(*KEY_MAP.values, keyword_init: true) do
  12. 1 def self.for document, key_map: KEY_MAP
  13. 31 root = document.root
  14. 31 else: 30 then: 1 return new unless root
  15. 30 root.elements
  16. 116 .reduce({}) { |attributes, element| attributes.merge element.name => element.text }
  17. .transform_keys(key_map)
  18. 30 .then { |attributes| new(**attributes) }
  19. end
  20. 1 def initialize *arguments
  21. 41 super
  22. 41 freeze
  23. end
  24. end
  25. end
  26. end

lib/sublime_text_kit/snippets/printer.rb

100.0% lines covered

100.0% branches covered

12 relevant lines. 12 lines covered and 0 lines missed.
0 total branches, 0 branches covered and 0 branches missed.
    
  1. # frozen_string_literal: true
  2. 1 module SublimeTextKit
  3. 1 module Snippets
  4. # Prints snippets as a list.
  5. 1 class Printer
  6. 1 include Import[:io]
  7. 1 def initialize(collector: Collector.new, **)
  8. 17 super(**)
  9. 17 @collector = collector
  10. end
  11. 1 def call bullet
  12. 8 collector.call.each do |snippet|
  13. 21 io.puts "#{bullet} #{snippet.description} - `#{snippet.trigger}`"
  14. end
  15. end
  16. 1 private
  17. 1 attr_reader :collector
  18. end
  19. end
  20. end

lib/sublime_text_kit/snippets/reader.rb

100.0% lines covered

100.0% branches covered

10 relevant lines. 10 lines covered and 0 lines missed.
2 total branches, 2 branches covered and 0 branches missed.
    
  1. # frozen_string_literal: true
  2. 1 require "rexml/document"
  3. 1 module SublimeTextKit
  4. 1 module Snippets
  5. # Reads snippet and loads record into memory.
  6. 1 class Reader
  7. 1 def initialize model: Model, document: REXML::Document
  8. 22 @model = model
  9. 22 @document = document
  10. end
  11. 30 then: 28 else: 1 def call(path) = path.exist? ? model.for(document.new(path.read)) : model.new
  12. 1 private
  13. 1 attr_reader :model, :document
  14. end
  15. end
  16. end