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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f81ce6d464232f632884a2d3c1e04c180551644bf5ce9202a4a5d4a2e20d5c40
4
- data.tar.gz: bdc67f51753f3b63944b88ad3f739ba4710bf0981190fd9d7b8ce69eea6493aa
3
+ metadata.gz: ad123a63da5538fbf3c598f39f6af371760f01dcd90320f7d4c43cfa081c2a04
4
+ data.tar.gz: b851793f9e4716209fc5a49183d4bb49257e71648515a0dfb4c185581adbd604
5
5
  SHA512:
6
- metadata.gz: db0ac5f45c53b1a4d7d58e9acfd5bd106402039f1d28d81c998d3279f4b1177980817b284362cd272853735f02eb492a8d131cbcade21dacf707132269b84c75
7
- data.tar.gz: 24ff7bfeefa7db10f9a028cbda7695f171a5d7d6095be2a23637a9d3e7e727323512962414d5236d6961d4864aa4aad3521770f33120f2df07740671878a9e70
6
+ metadata.gz: 1f528ed1fecbc4776e7a5315d844207bb819e9cda4a4b43ff508ccbaf56e4b1e844f53824f50857a57051b8d5b5c8f7b3aeea0528767cb2dd809e1b55c2077cf
7
+ data.tar.gz: 38f600a8f7016f6f8aed25b5745122efd8b1e7e3f10a77d47a56cee3b54b2885ac7f563f8e1bba1d3ee17ef00fda870b98764ff858e256b47835dfc55e034dbb
data/README.md CHANGED
@@ -1,29 +1,6 @@
1
1
  # K Builder
2
2
 
3
- > K Builder provides various fluent builders for initializing applications with different language requirements
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
- #### Basic example
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
- Description for a basic example to be featured in the main README.MD file
48
+ Check out usage.md for more details
65
49
 
66
50
  ```ruby
67
- class SomeRuby; end
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
- > K Builder provides various fluent builders for initializing applications with different language requirements
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
- > K Builder provides various fluent builders for initializing applications with different language requirements
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
- ### Sample Classes
9
+ ### Configure And Build
10
10
 
11
- #### Simple example
12
-
13
- Description for a simple example that shows up in the USAGE.MD
11
+ Print the configuration
14
12
 
15
13
  ```ruby
16
- class SomeRuby
17
- def initialize; end
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
+ ![](usage/_usage_folder_before.png)
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
+ ![](usage/_usage_folder_after.png)
85
+
86
+ #### main.rb
87
+
88
+ ![main.rb](usage/_out1.png)
89
+
90
+ #### person.rb
91
+
92
+ ![](usage/_out2.png)
93
+
94
+ #### address.rb
95
+
96
+ ![person.rb](usage/_out3.png)
97
+
98
+ #### configuration.log.txt
99
+
100
+ ![configuration.log.txt](usage/_out4.png)
101
+
102
+ #### css/index.css
103
+
104
+ ![css/index.css](usage/_out5.png)
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 to_hash
7
- hash = {}
8
- instance_variables.each { |var| hash[var.to_s.delete('@')] = instance_variable_get(var) }
9
- hash
10
- end
11
-
12
- def kv(name, value)
13
- puts "#{name.rjust(30)} : #{value}"
14
- end
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 method_missing(name, *args, &_block)
38
- # puts "method_missing: #{name}"
39
- # puts "args.length : #{args.length}"
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
- if args.length.zero?
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
- # Handles Setter method
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 get_value(name)
93
- instance_variable_get("@#{name}")
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module KBuilder
4
- VERSION = '0.0.19'
4
+ VERSION = '0.0.27'
5
5
  end
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.19
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-13 00:00:00.000000000 Z
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
- homepage: http://appydave.com/gems/k-builder
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/gems/k-builder
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: