contextizer 0.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.
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Contextizer
4
+ module Renderers
5
+ class Markdown < Base
6
+ def self.call(context:)
7
+ new(context: context).render
8
+ end
9
+
10
+ def initialize(context:)
11
+ @context = context
12
+ end
13
+
14
+ def render
15
+ [
16
+ render_header,
17
+ render_file_tree,
18
+ render_files
19
+ ].join("\n---\n")
20
+ end
21
+
22
+ private
23
+
24
+ def render_header
25
+ project_info = @context.metadata[:project] || {}
26
+ git_info = @context.metadata[:git] || {}
27
+ gem_info = (@context.metadata[:gems] || {}).map { |n, v| "- **#{n}:** #{v}" }.join("\n")
28
+
29
+ packages = @context.metadata[:packages] || {}
30
+ pkg_info = (packages[:dependencies] || {}).map { |n, v| "- **#{n}:** #{v}" }.join("\n")
31
+
32
+ <<~HEADER
33
+ # Contextizer Report
34
+
35
+ ## Meta Context
36
+ - **Project:** #{@context.project_name}
37
+ - **Type:** #{project_info[:type]}
38
+ - **Version:** #{project_info[:version]}
39
+ - **Extracted At:** #{@context.timestamp}
40
+
41
+ ### Command
42
+ ```bash
43
+ #{@context.command}
44
+ ```
45
+
46
+ ### Git Info
47
+ - **Branch:** `#{git_info[:branch]}`
48
+ - **Commit:** `#{git_info[:commit]}`
49
+
50
+ ### Key Ruby Dependencies
51
+ #{gem_info.empty? ? "Not found." : gem_info}
52
+
53
+ ### Key JS Dependencies
54
+ #{pkg_info.empty? ? "Not found." : pkg_info}
55
+ HEADER
56
+ end
57
+
58
+ def render_file_tree
59
+ paths = @context.files.map { |f| f[:path] }
60
+ tree_hash = build_path_hash(paths)
61
+ tree_string = format_tree_node(tree_hash).join("\n")
62
+
63
+ <<~TREE
64
+ ### File Structure
65
+ <details>
66
+ <summary>Click to view file tree</summary>
67
+
68
+ ```text
69
+ #{@context.project_name}/
70
+ #{tree_string}
71
+ ```
72
+
73
+ </details>
74
+ TREE
75
+ end
76
+
77
+ def build_path_hash(paths)
78
+ paths.each_with_object({}) do |path, hash|
79
+ path.split("/").reduce(hash) do |level, part|
80
+ level[part] ||= {}
81
+ end
82
+ end
83
+ end
84
+
85
+ def format_tree_node(node, prefix = "")
86
+ output = []
87
+ children = node.keys.sort
88
+ children.each_with_index do |key, index|
89
+ is_last = (index == children.length - 1)
90
+ connector = is_last ? "└── " : "├── "
91
+ output << "#{prefix}#{connector}#{key}"
92
+
93
+ if node[key].any?
94
+ new_prefix = prefix + (is_last ? " " : "│ ")
95
+ output.concat(format_tree_node(node[key], new_prefix))
96
+ end
97
+ end
98
+ output
99
+ end
100
+
101
+ def render_files
102
+ @context.files.map do |file|
103
+ lang = File.extname(file[:path]).delete(".")
104
+ lang = "ruby" if lang == "rb"
105
+ lang = "ruby" if lang == "gemspec"
106
+ lang = "javascript" if lang == "js"
107
+
108
+ <<~FILE_BLOCK
109
+ #### File: `#{file[:path]}`
110
+ ```#{lang}
111
+ #{file[:content]}
112
+ ```
113
+ FILE_BLOCK
114
+ end.join("\n---\n")
115
+ end
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Contextizer
4
+ VERSION = "0.1.1"
5
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fileutils"
4
+
5
+ module Contextizer
6
+ class Writer
7
+ def self.call(content:, destination:)
8
+ path = Pathname.new(destination)
9
+ puts "[Contextizer] Writer: Saving report to #{path}..."
10
+
11
+ FileUtils.mkdir_p(path.dirname)
12
+ File.write(path, content)
13
+
14
+ puts "[Contextizer] Writer: Report saved successfully."
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "zeitwerk"
4
+ loader = Zeitwerk::Loader.for_gem
5
+ loader.inflector.inflect(
6
+ "cli" => "CLI",
7
+ "javascript" => "JavaScript",
8
+ )
9
+ loader.setup
10
+
11
+ require_relative "contextizer/version"
12
+
13
+ module Contextizer
14
+ class Error < StandardError; end
15
+ # ...
16
+ end
17
+
18
+ loader.eager_load
metadata ADDED
@@ -0,0 +1,121 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: contextizer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Alexander
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2025-09-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: thor
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.3'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: zeitwerk
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.6'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.6'
55
+ description: Contextizer is a tool to extract and package project context.
56
+ email:
57
+ - alexander.s.fokin@gmail.com
58
+ executables:
59
+ - contextizer
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - ".rubocop.yml"
64
+ - CHANGELOG.md
65
+ - CODE_OF_CONDUCT.md
66
+ - LICENSE.txt
67
+ - README.md
68
+ - Rakefile
69
+ - config/default.yml
70
+ - contextizer_2025-09-01_2223.md
71
+ - exe/contextizer
72
+ - lib/contextizer.rb
73
+ - lib/contextizer/analyzer.rb
74
+ - lib/contextizer/analyzers/base.rb
75
+ - lib/contextizer/analyzers/java_script_analyzer.rb
76
+ - lib/contextizer/analyzers/python_analyzer.rb
77
+ - lib/contextizer/analyzers/ruby_analyzer.rb
78
+ - lib/contextizer/cli.rb
79
+ - lib/contextizer/collector.rb
80
+ - lib/contextizer/configuration.rb
81
+ - lib/contextizer/context.rb
82
+ - lib/contextizer/providers/base/file_system.rb
83
+ - lib/contextizer/providers/base/git.rb
84
+ - lib/contextizer/providers/base/project_name.rb
85
+ - lib/contextizer/providers/base_provider.rb
86
+ - lib/contextizer/providers/javascript/packages.rb
87
+ - lib/contextizer/providers/ruby/gems.rb
88
+ - lib/contextizer/providers/ruby/project_info.rb
89
+ - lib/contextizer/remote_repo_handler.rb
90
+ - lib/contextizer/renderers/base.rb
91
+ - lib/contextizer/renderers/markdown.rb
92
+ - lib/contextizer/version.rb
93
+ - lib/contextizer/writer.rb
94
+ homepage: https://github.com/alexander-s-f/contextizer
95
+ licenses:
96
+ - MIT
97
+ metadata:
98
+ allowed_push_host: https://rubygems.org
99
+ homepage_uri: https://github.com/alexander-s-f/contextizer
100
+ source_code_uri: https://github.com/alexander-s-f/contextizer
101
+ changelog_uri: https://github.com/alexander-s-f/contextizer/blob/main/CHANGELOG.md
102
+ post_install_message:
103
+ rdoc_options: []
104
+ require_paths:
105
+ - lib
106
+ required_ruby_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: 3.1.0
111
+ required_rubygems_version: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ requirements: []
117
+ rubygems_version: 3.5.22
118
+ signing_key:
119
+ specification_version: 4
120
+ summary: A tool to extract and package project context.
121
+ test_files: []