genius-builder 0.1.0

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 (4) hide show
  1. checksums.yaml +7 -0
  2. data/bin/genius +1 -0
  3. data/lib/genius.rh +140 -0
  4. metadata +59 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 5ce95e868a8c02fe55e35c2750cd75789d4fba48c4c4c523f6f63bad81d34ff9
4
+ data.tar.gz: 6b2248733ce5085133832037dd7b88504188f64971d85b239c4c116f5cec9331
5
+ SHA512:
6
+ metadata.gz: 8459891a20549144918577faf8971cd573ca10b40eb78cb17ce4fc0335f0468653a862656f36481950e0ec054d94975b3372476a877239729a7ece1145419bc2
7
+ data.tar.gz: 28486432edd067e18cd7937a7f92571598791d9a82f966be935aaf93be824eebded9d068e5e94f28bc8a971f3e8192fa6263e4a9c2638555e627896ad516e8e2
@@ -0,0 +1 @@
1
+ ../lib/genius.rh
@@ -0,0 +1,140 @@
1
+ #!/usr/bin/env rash
2
+
3
+ module Genius
4
+ @@build_tools = {}
5
+ @@build_groups = {}
6
+
7
+ def self.build_tools
8
+ @@build_tools.dup
9
+ end
10
+
11
+ def self.build_groups
12
+ @@build_groups.dup
13
+ end
14
+
15
+ # Build tool methods
16
+ def self.register_build_tool(name, *files, &command)
17
+ @@build_tools[name.to_s] = BuildTool.new(name, *files, &command)
18
+ end
19
+
20
+ def self.define_build_tool_files(name, *files)
21
+ @@build_tools[name.to_s].files = files.flatten.map(&:to_s)
22
+ end
23
+
24
+ def self.add_build_tool_file(name, file)
25
+ @@build_tools[name.to_s].files << file.to_s
26
+ end
27
+
28
+ def self.define_build_tool_command(name, &command)
29
+ @@build_tools[name.to_s].commands = [command]
30
+ end
31
+
32
+ def self.add_build_tool_command(name, &command)
33
+ @@build_tools[name.to_s].commands << command
34
+ end
35
+
36
+ # Build group methods
37
+ def self.register_group(name, *extensions, &command)
38
+ @@build_groups[name.to_s] = BuildGroup.new(name, *extensions, &command)
39
+ end
40
+
41
+ def self.define_group_extensions(name, *exts)
42
+ @@build_groups[name.to_s].extensions = exts.flatten.map {|e| e.to_s.delete_prefiox(".")}
43
+ end
44
+
45
+ def self.add_group_extension(name, ext)
46
+ # requires 2.5
47
+ @@build_groups[name.to_s].extensions << ext.to_s.delete_prefix(".")
48
+ end
49
+
50
+ def self.define_group_command(name, &command)
51
+ @@build_groups[name.to_s].commands = [command]
52
+ end
53
+
54
+ def self.add_group_command(name, &command)
55
+ @@build_groups[name.to_s].commands << command
56
+ end
57
+
58
+
59
+ private
60
+
61
+ class BuildTool
62
+ attr_accessor :name, :files, :commands
63
+ def initialize(name, *files, &command)
64
+ @name = name
65
+ @files = files.flatten.map(&:to_s)
66
+ @commands = [command]
67
+ end
68
+
69
+ def build(files)
70
+ @commands.each do |command|
71
+ command.call(files)
72
+ end
73
+ end
74
+ end
75
+
76
+ class BuildGroup
77
+ attr_accessor :name, :extensions, :commands
78
+ def initialize(name, *extensions, &command)
79
+ @name = name
80
+ @extensions = extensions.flatten.map(&:to_s)
81
+ @commands = [command]
82
+ end
83
+
84
+ def build(files)
85
+ @commands.each do |command|
86
+ command.call(files)
87
+ end
88
+ end
89
+ end
90
+ end
91
+
92
+ $GENIUS_HOME = File.expand_path("~/.genius")
93
+
94
+ # Sanity check for if genius's dependencies exist.
95
+ if !Dir.exist?($GENIUS_HOME)
96
+ with_stdout_as_stderr do
97
+ puts ".genius - No such directory"
98
+ puts "\nTo use genius builder, put config files in the ~/.genius directory."
99
+ puts "Documentation for creating a genius config file can be found at <insert URL here>"
100
+ end
101
+ exit 1
102
+ end
103
+
104
+ # Load all config files in .genius, assuming all non-directory files are config files.
105
+ Dir[$GENIUS_HOME + "/*"].each do |config|
106
+ next if File.directory?(config)
107
+ exit unless load config
108
+ end
109
+
110
+ # Sort files by extension. Only files that have a name and extension are considered.
111
+ # i.e. Files that have no extension or are only extensions (including extensionless
112
+ # dotfiles) will not be considered. The final extension is used if multiple are
113
+ # present.
114
+ file_set = Hash.new {|h,k| h[k] = []}
115
+ Dir["**/*"].each do |file|
116
+ split_name = file.split(".")
117
+ if split_name.size > 1
118
+ file_set[split_name[-1]] << file
119
+ end
120
+ end
121
+
122
+ # Check for build tool patterns, terminating after build completion if one is matched
123
+ Genius.build_tools.each do |tool|
124
+ if tool.files.any? {|f| File.exist?(f) && !File.directory?(f)}
125
+ puts "Matched build tool pattern: #{tool.name}"
126
+ tool.build(file_set) # Does not contain all files, so may not be useful.
127
+ exit
128
+ end
129
+ end
130
+
131
+ # Get counts of files matching each build group.
132
+ group_counts = Genius.build_groups.map do |name, group|
133
+ file_count = group.extensions.inject(0) {|acc, ext| acc += file_set[ext].size}
134
+ [group, file_count]
135
+ end
136
+
137
+ # Build based on commands specified by most populous build group,
138
+ # passing only the files with extensions specified by that group.
139
+ group = group_counts.max_by{|k,v| v}[0]
140
+ Genius.build_groups[group.name].build(file_set.filter{|k,v| group.extensions.include?(k)})
metadata ADDED
@@ -0,0 +1,59 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: genius-builder
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Kellen Watt
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-11-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rash-command-shell
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.4.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 0.4.0
27
+ description: An everyday build tool that does the heavy lifting for you.
28
+ email:
29
+ executables:
30
+ - genius
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - bin/genius
35
+ - lib/genius.rh
36
+ homepage: https://github.com/KellenWatt/genius
37
+ licenses:
38
+ - MIT
39
+ metadata: {}
40
+ post_install_message:
41
+ rdoc_options: []
42
+ require_paths:
43
+ - lib
44
+ required_ruby_version: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '2.5'
49
+ required_rubygems_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ requirements: []
55
+ rubygems_version: 3.0.8
56
+ signing_key:
57
+ specification_version: 4
58
+ summary: An intelligent compiler selection tool
59
+ test_files: []