k_builder 0.0.19 → 0.0.27
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.
- checksums.yaml +4 -4
- data/README.md +33 -27
- data/STORIES.md +1 -1
- data/USAGE.md +92 -7
- data/k_builder.gemspec +1 -1
- data/lib/k_builder.rb +3 -2
- data/lib/k_builder/base_configuration.rb +19 -90
- data/lib/k_builder/data_helper.rb +64 -0
- data/lib/k_builder/version.rb +1 -1
- data/usage/_out1.png +0 -0
- data/usage/_out2.png +0 -0
- data/usage/_out3.png +0 -0
- data/usage/_out4.png +0 -0
- data/usage/_out5.png +0 -0
- data/usage/_usage_folder_after.png +0 -0
- data/usage/_usage_folder_before.png +0 -0
- metadata +12 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ad123a63da5538fbf3c598f39f6af371760f01dcd90320f7d4c43cfa081c2a04
|
4
|
+
data.tar.gz: b851793f9e4716209fc5a49183d4bb49257e71648515a0dfb4c185581adbd604
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1f528ed1fecbc4776e7a5315d844207bb819e9cda4a4b43ff508ccbaf56e4b1e844f53824f50857a57051b8d5b5c8f7b3aeea0528767cb2dd809e1b55c2077cf
|
7
|
+
data.tar.gz: 38f600a8f7016f6f8aed25b5745122efd8b1e7e3f10a77d47a56cee3b54b2885ac7f563f8e1bba1d3ee17ef00fda870b98764ff858e256b47835dfc55e034dbb
|
data/README.md
CHANGED
@@ -1,29 +1,6 @@
|
|
1
1
|
# K Builder
|
2
2
|
|
3
|
-
>
|
4
|
-
|
5
|
-
## ToDo
|
6
|
-
|
7
|
-
- BuildWatcher (as a builder)
|
8
|
-
- AppBuilder
|
9
|
-
- BaseBuilder
|
10
|
-
- WebBuilder
|
11
|
-
- PackageBuilder
|
12
|
-
- Webpack5Builder
|
13
|
-
- ReactBuilder
|
14
|
-
- SlideDeckBuilder
|
15
|
-
- JavscriptBuilder
|
16
|
-
- SolutionBuilder
|
17
|
-
- DotnetBuilder
|
18
|
-
- C#Console
|
19
|
-
- C#Mvc
|
20
|
-
- RubyBuilder
|
21
|
-
- RubyGem
|
22
|
-
- RailsApp
|
23
|
-
- PythonBuilder
|
24
|
-
- DddBuilder
|
25
|
-
- DddGenerator
|
26
|
-
|
3
|
+
> KBuilder provides various fluent builders and code generators for initializing applications with different language requirements
|
27
4
|
|
28
5
|
## Installation
|
29
6
|
|
@@ -59,12 +36,41 @@ See all [usage examples](./USAGE.md)
|
|
59
36
|
|
60
37
|
### Basic Example
|
61
38
|
|
62
|
-
####
|
39
|
+
#### Configure and Run
|
40
|
+
|
41
|
+
Setup configuration for KBuilder
|
42
|
+
|
43
|
+
Generate two files:
|
44
|
+
|
45
|
+
1. main.rb is based on class.rb from app_template
|
46
|
+
2. configuration.log.txt is based on an inline template
|
63
47
|
|
64
|
-
|
48
|
+
Check out usage.md for more details
|
65
49
|
|
66
50
|
```ruby
|
67
|
-
|
51
|
+
usecases_folder = File.join(Dir.getwd, 'spec', 'usecases')
|
52
|
+
|
53
|
+
KBuilder.configure do |config|
|
54
|
+
config.template_folder = File.join(usecases_folder, '.app_template')
|
55
|
+
config.global_template_folder = File.join(usecases_folder, '.global_template')
|
56
|
+
config.target_folder = File.join(usecases_folder, '.output')
|
57
|
+
end
|
58
|
+
|
59
|
+
template = <<~TEXT
|
60
|
+
Configured Template Folder : {{a}}
|
61
|
+
Configured Global Template Folder : {{b}}
|
62
|
+
Configured Output Folder : {{c}}
|
63
|
+
TEXT
|
64
|
+
|
65
|
+
builder = KBuilder::Builder.init
|
66
|
+
|
67
|
+
builder.add_file('main.rb', template_file: 'class.rb', name: 'main').add_file(
|
68
|
+
'configuration.log.txt',
|
69
|
+
template: template,
|
70
|
+
a: builder.template_folder,
|
71
|
+
b: builder.global_template_folder,
|
72
|
+
c: builder.target_folder
|
73
|
+
)
|
68
74
|
```
|
69
75
|
|
70
76
|
## Development
|
data/STORIES.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# K Builder
|
2
2
|
|
3
|
-
>
|
3
|
+
> KBuilder provides various fluent builders and code generators for initializing applications with different language requirements
|
4
4
|
|
5
5
|
As a Polyglot Developer, I want to be up and running in any development language with consistency, so I am productive and using best practices
|
6
6
|
|
data/USAGE.md
CHANGED
@@ -1,19 +1,104 @@
|
|
1
1
|
# K Builder
|
2
2
|
|
3
|
-
>
|
3
|
+
> KBuilder provides various fluent builders and code generators for initializing applications with different language requirements
|
4
4
|
|
5
5
|
As a Polyglot Developer, I want to be up and running in any development language with consistency, so I am productive and using best practices
|
6
6
|
|
7
7
|
## Usage
|
8
8
|
|
9
|
-
###
|
9
|
+
### Configure And Build
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
Description for a simple example that shows up in the USAGE.MD
|
11
|
+
Print the configuration
|
14
12
|
|
15
13
|
```ruby
|
16
|
-
|
17
|
-
|
14
|
+
usecases_folder = File.join(Dir.getwd, 'spec', 'usecases')
|
15
|
+
|
16
|
+
KBuilder.configure do |config|
|
17
|
+
config.template_folder = File.join(usecases_folder, '.app_template')
|
18
|
+
config.global_template_folder = File.join(usecases_folder, '.global_template')
|
19
|
+
config.target_folder = File.join(usecases_folder, '.output')
|
18
20
|
end
|
21
|
+
|
22
|
+
puts JSON.pretty_generate(KBuilder.configuration.to_hash)
|
23
|
+
```
|
24
|
+
|
25
|
+
```javascript
|
26
|
+
{
|
27
|
+
"target_folder": "/Users/name/dev/kgems/k_builder/spec/usecases/.output",
|
28
|
+
"template_folder": "/Users/name/dev/kgems/k_builder/spec/usecases/.app_template",
|
29
|
+
"global_template_folder": "/Users/name/dev/kgems/k_builder/spec/usecases/.global_template"
|
30
|
+
}
|
19
31
|
```
|
32
|
+
|
33
|
+
#### Folder Structure (starting)
|
34
|
+
|
35
|
+
Example folder structure for this usecase before running the builder
|
36
|
+
|
37
|
+
> Note: app-templates will take preference over global templates
|
38
|
+
|
39
|
+

|
40
|
+
|
41
|
+
#### Run builder
|
42
|
+
|
43
|
+
This example builder will add 4 files into the output folder.
|
44
|
+
|
45
|
+
1. `main.rb` is based on `class.rb` from `app_template`
|
46
|
+
2. `person.rb` & `address.rb` are based on `model.rb` from `global_template`
|
47
|
+
3. `configuration.log.txt` is based on an inline template
|
48
|
+
|
49
|
+
```ruby
|
50
|
+
template = <<~TEXT
|
51
|
+
Configured Template Folder : {{a}}
|
52
|
+
Configured Global Template Folder : {{b}}
|
53
|
+
Configured Output Folder : {{c}}
|
54
|
+
TEXT
|
55
|
+
|
56
|
+
builder = KBuilder::Builder.init
|
57
|
+
|
58
|
+
builder
|
59
|
+
.add_file('main.rb', template_file: 'class.rb', name: 'main')
|
60
|
+
.add_file('person.rb',
|
61
|
+
template_file: 'model.rb',
|
62
|
+
name: 'person',
|
63
|
+
fields: %i[first_name last_name])
|
64
|
+
.add_file('address.rb',
|
65
|
+
template_file: 'model.rb',
|
66
|
+
name: 'address',
|
67
|
+
fields: %i[street1 street2 post_code state])
|
68
|
+
.add_file('configuration.log.txt',
|
69
|
+
template: template,
|
70
|
+
a: builder.template_folder,
|
71
|
+
b: builder.global_template_folder,
|
72
|
+
c: builder.target_folder)
|
73
|
+
.add_file('css/index.css',
|
74
|
+
template: '{{#each colors}} .{{.}} { color: {{.}} } {{/each}}',
|
75
|
+
colors: ['red', 'blue', 'green'],
|
76
|
+
pretty: true)
|
77
|
+
|
78
|
+
```
|
79
|
+
|
80
|
+
#### Folder Structure (after)
|
81
|
+
|
82
|
+
Folder structure after running the builder
|
83
|
+
|
84
|
+

|
85
|
+
|
86
|
+
#### main.rb
|
87
|
+
|
88
|
+

|
89
|
+
|
90
|
+
#### person.rb
|
91
|
+
|
92
|
+

|
93
|
+
|
94
|
+
#### address.rb
|
95
|
+
|
96
|
+

|
97
|
+
|
98
|
+
#### configuration.log.txt
|
99
|
+
|
100
|
+

|
101
|
+
|
102
|
+
#### css/index.css
|
103
|
+
|
104
|
+

|
data/k_builder.gemspec
CHANGED
@@ -13,7 +13,7 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.description = <<-TEXT
|
14
14
|
K Builder provides various fluent builders for initializing applications with different language requirements
|
15
15
|
TEXT
|
16
|
-
spec.homepage = 'http://appydave.com/gems/k-builder'
|
16
|
+
spec.homepage = 'http://appydave.com' # /gems/k-builder'
|
17
17
|
spec.license = 'MIT'
|
18
18
|
|
19
19
|
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
data/lib/k_builder.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'k_builder/version'
|
4
|
-
require 'k_builder/base_configuration'
|
5
|
-
require 'k_builder/configuration'
|
6
4
|
require 'k_builder/base_builder'
|
5
|
+
require 'k_builder/base_configuration'
|
7
6
|
require 'k_builder/builder'
|
7
|
+
require 'k_builder/configuration'
|
8
|
+
require 'k_builder/data_helper'
|
8
9
|
|
9
10
|
require 'handlebars/helpers/template'
|
10
11
|
|
@@ -3,104 +3,33 @@
|
|
3
3
|
module KBuilder
|
4
4
|
# Base configuration object for all k_builder* GEM
|
5
5
|
class BaseConfiguration
|
6
|
-
def
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
# All of this code should be extracted into a module
|
17
|
-
#
|
18
|
-
# The module should then be extracted out into a GEM so that
|
19
|
-
# I can include it as needed. The GEM might be called
|
20
|
-
# (dynamic attributes) and would allow a regular class to act like an OpenStruct
|
21
|
-
# K-DSL uses data hash, while base configuration uses instance variables
|
22
|
-
|
23
|
-
def respond_to_missing?(name, *_args, &_block)
|
24
|
-
# puts 'respond_to_missing?'
|
25
|
-
# puts "respond_to_missing: #{name}"
|
26
|
-
n = name.to_s
|
27
|
-
n = n[0..-2] if n.end_with?('=')
|
28
|
-
|
29
|
-
if n.end_with?('?')
|
30
|
-
super
|
31
|
-
else
|
32
|
-
# This has not been fully tested
|
33
|
-
instance_variable_defined?("@#{n}") || super
|
6
|
+
def self.attach_to(klass_me, klass_target, accessor_name)
|
7
|
+
# Create a memoized getter to an instance of the attaching class (:klass_me)
|
8
|
+
#
|
9
|
+
# def third_party
|
10
|
+
# @third_party ||= KBuilder::ThirdPartyGem::Configuration.new
|
11
|
+
# end
|
12
|
+
klass_target.send(:define_method, accessor_name) do
|
13
|
+
return instance_variable_get("@#{accessor_name}") if instance_variable_defined?("@#{accessor_name}")
|
14
|
+
|
15
|
+
instance_variable_set("@#{accessor_name}", klass_me.new)
|
34
16
|
end
|
35
17
|
end
|
36
18
|
|
37
|
-
def
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
add_getter_or_param_method(name)
|
42
|
-
add_setter_method(name)
|
43
|
-
|
44
|
-
send(name, args[0]) if args.length == 1 # name.end_with?('=')
|
45
|
-
|
46
|
-
super unless self.class.method_defined?(name)
|
47
|
-
end
|
48
|
-
|
49
|
-
# Handles Getter method and method with single parameter
|
50
|
-
# object.my_name
|
51
|
-
# object.my_name('david')
|
52
|
-
def add_getter_or_param_method(name)
|
53
|
-
# L.progress(1, 'add_getter_or_param_method')
|
54
|
-
self.class.class_eval do
|
55
|
-
# L.progress(2, 'add_getter_or_param_method')
|
56
|
-
name = name.to_s.gsub(/=$/, '')
|
57
|
-
# L.progress(3, 'add_getter_or_param_method')
|
58
|
-
# L.kv 'name', name
|
59
|
-
define_method(name) do |*args|
|
60
|
-
# L.progress(4, 'add_getter_or_param_method')
|
61
|
-
# L.kv 'add_getter_or_param_method', name
|
62
|
-
raise KBuilder::Error, 'Multiple setting values is not supported' if args.length > 1
|
19
|
+
def to_hash
|
20
|
+
hash = {}
|
21
|
+
instance_variables.each do |var|
|
22
|
+
value = instance_variable_get(var)
|
63
23
|
|
64
|
-
|
65
|
-
get_value(name)
|
66
|
-
else
|
67
|
-
send("#{name}=", args[0])
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
24
|
+
value = value.to_hash if value.is_a?(KBuilder::BaseConfiguration)
|
72
25
|
|
73
|
-
|
74
|
-
# object.my_name = 'david'
|
75
|
-
def add_setter_method(name)
|
76
|
-
# L.progress(1, 'add_setter_method')
|
77
|
-
self.class.class_eval do
|
78
|
-
# L.progress(2, 'add_setter_method')
|
79
|
-
name = name.to_s.gsub(/=$/, '')
|
80
|
-
# L.progress(3, 'add_setter_method')
|
81
|
-
# L.kv 'add_setter_method', name
|
82
|
-
define_method("#{name}=") do |value|
|
83
|
-
# L.progress(4, 'add_setter_method')
|
84
|
-
# L.kv 'name', name
|
85
|
-
# L.kv 'value', value
|
86
|
-
instance_variable_set("@#{name}", value)
|
87
|
-
# my_data[name.to_s] = value
|
88
|
-
end
|
26
|
+
hash[var.to_s.delete('@')] = value
|
89
27
|
end
|
28
|
+
hash
|
90
29
|
end
|
91
30
|
|
92
|
-
def
|
93
|
-
|
31
|
+
def kv(name, value)
|
32
|
+
puts "#{name.rjust(30)} : #{value}"
|
94
33
|
end
|
95
34
|
end
|
96
|
-
|
97
|
-
# class L
|
98
|
-
# def self.progress(index, label)
|
99
|
-
# puts "#{index} - #{label}"
|
100
|
-
# end
|
101
|
-
|
102
|
-
# def self.kv(name, value)
|
103
|
-
# puts "#{name.rjust(30)} : #{value}"
|
104
|
-
# end
|
105
|
-
# end
|
106
35
|
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Attach data helper to the KBuilder module
|
4
|
+
module KBuilder
|
5
|
+
# Data helpers/utils for Kbuilder
|
6
|
+
class << self
|
7
|
+
attr_writer :data
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.data
|
11
|
+
@data ||= DataHelper.new
|
12
|
+
end
|
13
|
+
|
14
|
+
# Helper methods attached to the namespace for working with Data
|
15
|
+
#
|
16
|
+
# Usage: KBuilder.data.to_struct(data)
|
17
|
+
class DataHelper
|
18
|
+
# Convert a hash into a deep OpenStruct or array an array
|
19
|
+
# of objects into an array of OpenStruct
|
20
|
+
def to_struct(data)
|
21
|
+
case data
|
22
|
+
when Hash
|
23
|
+
OpenStruct.new(data.transform_values { |v| to_struct(v) })
|
24
|
+
|
25
|
+
when Array
|
26
|
+
data.map { |o| to_struct(o) }
|
27
|
+
|
28
|
+
else
|
29
|
+
# Some primitave type: String, True/False, Symbol or an ObjectStruct
|
30
|
+
data
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
35
|
+
def struct_to_hash(data)
|
36
|
+
# No test yet
|
37
|
+
if data.is_a?(Array)
|
38
|
+
return data.map { |v| v.is_a?(OpenStruct) ? struct_to_hash(v) : v }
|
39
|
+
end
|
40
|
+
|
41
|
+
data.each_pair.with_object({}) do |(key, value), hash|
|
42
|
+
case value
|
43
|
+
when OpenStruct, Struct, Hash
|
44
|
+
hash[key] = struct_to_hash(value)
|
45
|
+
when Array
|
46
|
+
# No test yet
|
47
|
+
values = value.map do |v|
|
48
|
+
v.is_a?(OpenStruct) || v.is_a?(Struct) || v.is_a?(Hash) ? struct_to_hash(v) : v
|
49
|
+
end
|
50
|
+
hash[key] = values
|
51
|
+
else
|
52
|
+
hash[key] = value
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
57
|
+
|
58
|
+
def clean_symbol(value)
|
59
|
+
return value if value.nil?
|
60
|
+
|
61
|
+
value.is_a?(Symbol) ? value.to_s : value
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/lib/k_builder/version.rb
CHANGED
data/usage/_out1.png
ADDED
Binary file
|
data/usage/_out2.png
ADDED
Binary file
|
data/usage/_out3.png
ADDED
Binary file
|
data/usage/_out4.png
ADDED
Binary file
|
data/usage/_out5.png
ADDED
Binary file
|
Binary file
|
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: k_builder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.27
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Cruwys
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-03-
|
11
|
+
date: 2021-03-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: handlebars-helpers
|
@@ -57,12 +57,20 @@ files:
|
|
57
57
|
- lib/k_builder/base_configuration.rb
|
58
58
|
- lib/k_builder/builder.rb
|
59
59
|
- lib/k_builder/configuration.rb
|
60
|
+
- lib/k_builder/data_helper.rb
|
60
61
|
- lib/k_builder/version.rb
|
61
|
-
|
62
|
+
- usage/_out1.png
|
63
|
+
- usage/_out2.png
|
64
|
+
- usage/_out3.png
|
65
|
+
- usage/_out4.png
|
66
|
+
- usage/_out5.png
|
67
|
+
- usage/_usage_folder_after.png
|
68
|
+
- usage/_usage_folder_before.png
|
69
|
+
homepage: http://appydave.com
|
62
70
|
licenses:
|
63
71
|
- MIT
|
64
72
|
metadata:
|
65
|
-
homepage_uri: http://appydave.com
|
73
|
+
homepage_uri: http://appydave.com
|
66
74
|
source_code_uri: https://github.com/klueless-io/k_builder
|
67
75
|
changelog_uri: https://github.com/klueless-io/k_builder/commits/master
|
68
76
|
post_install_message:
|