app_archetype 1.2.3 → 1.2.8

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: 2a10af9366de2e0735df447d87d1cbe3660601702b038fffff206a7489687c70
4
- data.tar.gz: 4708824cee9cb49c3731038b1f13dc88b61ecb732a1de7fe45d1a483a0e66120
3
+ metadata.gz: 69596e80065838a6a6ee3e106cf923c0a5cde9c3ab021ad453cec86693b7a54e
4
+ data.tar.gz: 0c2efba5fa04672d651f85ee96c1758d5a1b2af04dc8229684f6a510208bcc46
5
5
  SHA512:
6
- metadata.gz: 0bd5e63c6bdcdf49aa85266c2b63d09d5994113d192349051740829b3ce47d3727f7ee9455459aca5dec39b240d3d734df0c247dc8a8dfd4d6e3c0149d8cca07
7
- data.tar.gz: a80ecdeaeb2e2ca8e2e91e6dbfbaaf78762cdd6eb8b3b3e94961696c3e3722f06170185b2404807a694db22e7be9e0737a44b886039b05a74077f307cf808612
6
+ metadata.gz: 6bdf46483034b8a0655597c181a2710a8d426f10b27aef0f9ae3d49598f3457e5f9231aab1c853dfbd17fefa2ceb2cb2a80e251a146a25abac3bb72e5ae789e0
7
+ data.tar.gz: 5925cafc17983ad94872e22a430a858b5f53feb1ebef9a4b1b00f1c6a337816b7331d0cc51f06c5d9bba74f57b1884378cc869cb283ceac46272970039ad10ca
data/Gemfile.lock CHANGED
@@ -1,12 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- app_archetype (1.2.3)
4
+ app_archetype (1.2.8)
5
5
  cli-format (~> 0.2)
6
6
  highline (~> 2.0)
7
7
  json (~> 2.3)
8
8
  json-schema (~> 2.8)
9
- jsonnet (~> 0.3.0)
9
+ jsonnet (~> 0.4.0)
10
10
  logger (~> 1.4.2)
11
11
  os (~> 1.1)
12
12
  ostruct (~> 0.3)
@@ -16,7 +16,7 @@ PATH
16
16
  GEM
17
17
  remote: https://rubygems.org/
18
18
  specs:
19
- activesupport (6.1.3.2)
19
+ activesupport (6.1.4)
20
20
  concurrent-ruby (~> 1.0, >= 1.0.2)
21
21
  i18n (>= 1.6, < 2)
22
22
  minitest (>= 5.1)
@@ -60,7 +60,7 @@ GEM
60
60
  json (2.5.1)
61
61
  json-schema (2.8.1)
62
62
  addressable (>= 2.4)
63
- jsonnet (0.3.0)
63
+ jsonnet (0.4.0)
64
64
  mini_portile2 (>= 2.2.0)
65
65
  kwalify (0.7.2)
66
66
  launchy (2.5.0)
@@ -70,7 +70,7 @@ GEM
70
70
  mini_portile2 (2.6.1)
71
71
  minitest (5.14.4)
72
72
  os (1.1.1)
73
- ostruct (0.3.3)
73
+ ostruct (0.4.0)
74
74
  parallel (1.19.2)
75
75
  parser (2.7.1.5)
76
76
  ast (~> 2.4.1)
data/README.md CHANGED
@@ -6,18 +6,20 @@ Code project template renderer
6
6
 
7
7
  ## Installation
8
8
 
9
- Add the following to your Gemfile
10
-
11
- ```ruby
12
- gem 'app_archetype'
13
- ```
14
-
15
- Or install the gem into your system:
9
+ This is best run as a CLI tool installed into your system:
16
10
 
17
11
  ```bash
18
12
  gem install app_archetype
19
13
  ```
20
14
 
15
+ For inclusion in another script or application, add this line to your application's Gemfile:
16
+
17
+ Add the following to your Gemfile
18
+
19
+ ## Getting Started
20
+
21
+ ### Setting up your environment for CLI use
22
+
21
23
  If installed as a system gem, you'll need to create a template directory and set it in your environment:
22
24
 
23
25
  ```bash
@@ -57,7 +59,7 @@ Templates are a collection of files in the template folder with a manifest. The
57
59
  | - | - manifest.json
58
60
  ```
59
61
 
60
- Each template must include a manifest which has instructions necessary to render the template at run time.
62
+ Each template must include a manifest which has instructions necessary to render the template at run time.
61
63
 
62
64
  To create a blank template run the new command with the relative (from your template directory) path to your new template. For example to create a ruby gem you might:
63
65
 
@@ -89,7 +91,10 @@ A manifest has a name, version and set of variables. A sample manifest looks lik
89
91
  }
90
92
  },
91
93
  "variables": {
92
- "foo": "bar",
94
+ "foo": {
95
+ "type": "string",
96
+ "default": "bar"
97
+ }
93
98
  }
94
99
  }
95
100
  ```
@@ -97,7 +102,30 @@ A manifest has a name, version and set of variables. A sample manifest looks lik
97
102
  - `name` should be a unique name that identifies a manifest for you
98
103
  - `version` should be the version of the template
99
104
  - `metadata.app_archetype` is information about the manifest for the app archetype gem. `metadata.app_archetype.version` is required, and must be less than the version of the currently installed gem.
100
- - `variables` is a schemaless object that you may use to provide variables at render time
105
+ - `variables` is an object of variable descriptions
106
+
107
+ #### Variable Descriptions
108
+
109
+ Variable descriptions looks like this:
110
+
111
+ ```json
112
+ {
113
+ "variables": {
114
+ "foo": {
115
+ "type": "string",
116
+ "description": "An example string",
117
+ "default": "bar"
118
+ },
119
+ }
120
+ }
121
+ ```
122
+
123
+ Below is a description of the supported attributes in a variable definition:
124
+
125
+ - `type` (required) specifies the type of the variable. This can be one of `string`, `boolean`, `integer` or `map`
126
+ - `description` (recommended) a short string that describes to the user what the variable is going to be usef for
127
+ - `default` (optional) allows you to specify a default that is selected as the value when the user enters nothing into the prompt
128
+ - `value` (optional) when set the user will not be prompted for a value when the template is being generated
101
129
 
102
130
  ##### Jsonnet support
103
131
 
@@ -133,6 +161,10 @@ You can list the templates in your template directory at any time by running the
133
161
  archetype list
134
162
  ```
135
163
 
164
+ ## Contributing
165
+
166
+ See CONTRIBUTING.md for more information
167
+
136
168
  ## Licence
137
169
 
138
170
  This gem is covered by the terms of the MIT licence. See LICENCE for more information
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.add_dependency 'cli-format', '~> 0.2'
20
20
  spec.add_dependency 'highline', '~> 2.0'
21
21
  spec.add_dependency 'json', '~> 2.3'
22
- spec.add_dependency 'jsonnet', '~> 0.3.0'
22
+ spec.add_dependency 'jsonnet', '~> 0.4.0'
23
23
  spec.add_dependency 'json-schema', '~> 2.8'
24
24
  spec.add_dependency 'logger', '~> 1.4.2'
25
25
  spec.add_dependency 'os', '~> 1.1'
data/lib/app_archetype.rb CHANGED
@@ -7,8 +7,41 @@ require 'app_archetype/template_manager'
7
7
  require 'app_archetype/renderer'
8
8
  require 'app_archetype/generators'
9
9
 
10
+ require 'app_archetype/cli/prompts'
11
+
10
12
  require 'app_archetype/version'
11
13
 
12
14
  # AppArchetype is the namespace for app_archetype
13
15
  module AppArchetype
16
+ def self.render(
17
+ name,
18
+ templates_dir,
19
+ destination_path: Dir.pwd,
20
+ overwrite: true,
21
+ variables: []
22
+ )
23
+ manifest_file = File.join(templates_dir, name, 'manifest.json')
24
+
25
+ manifest = AppArchetype::Template::Manifest.new_from_file(manifest_file)
26
+
27
+ template = manifest.template
28
+ template.load
29
+
30
+ variables.each { |var| manifest.variables.add(var) }
31
+
32
+ manifest.variables.all.each do |var|
33
+ value = AppArchetype::CLI::Prompts.variable_prompt_for(var)
34
+ var.set!(value)
35
+ end
36
+
37
+ plan = AppArchetype::Template::Plan.new(
38
+ template,
39
+ manifest.variables,
40
+ destination_path: destination_path,
41
+ overwrite: overwrite
42
+ )
43
+
44
+ plan.devise
45
+ plan.execute
46
+ end
14
47
  end
@@ -8,7 +8,7 @@ require 'app_archetype/cli/prompts'
8
8
 
9
9
  module AppArchetype
10
10
  # Command line interface helpers and actions
11
- class CLI < Thor
11
+ class CLI < ::Thor
12
12
  package_name 'Archetype'
13
13
 
14
14
  class <<self
@@ -1,7 +1,7 @@
1
1
  require 'cli-format'
2
2
 
3
3
  module AppArchetype
4
- class CLI < Thor
4
+ class CLI < ::Thor
5
5
  # CLI output presenters
6
6
  module Presenters
7
7
  ##
@@ -1,7 +1,7 @@
1
1
  require 'highline'
2
2
 
3
3
  module AppArchetype
4
- class CLI < Thor
4
+ class CLI < ::Thor
5
5
  # CLI output presenters
6
6
  module Prompts
7
7
  ##
@@ -16,7 +16,8 @@ module AppArchetype
16
16
  DEFAULT_VALUES = {
17
17
  'string' => '',
18
18
  'boolean' => false,
19
- 'integer' => 0
19
+ 'integer' => 0,
20
+ 'map' => {}
20
21
  }.freeze
21
22
 
22
23
  ##
@@ -55,13 +56,25 @@ module AppArchetype
55
56
  input != '0' && input.to_i != 0
56
57
  end
57
58
 
59
+ ##
60
+ # Map validation function. Ensures given input is a map
61
+ #
62
+ # @param [Object] input
63
+ #
64
+ # @return [Boolean]
65
+ #
66
+ MAP_VALIDATOR = lambda do |input|
67
+ input.is_a?(Hash)
68
+ end
69
+
58
70
  ##
59
71
  # Maps type to validation function
60
72
  #
61
73
  VALIDATORS = {
62
74
  'string' => STRING_VALIDATOR,
63
75
  'boolean' => BOOLEAN_VALIDATOR,
64
- 'integer' => INTEGER_VALIDATOR
76
+ 'integer' => INTEGER_VALIDATOR,
77
+ 'map' => MAP_VALIDATOR
65
78
  }.freeze
66
79
 
67
80
  ##
@@ -185,7 +198,7 @@ module AppArchetype
185
198
  ##
186
199
  # Returns true if the value input is valid.
187
200
  #
188
- # @param [String] input
201
+ # @param [Object] input
189
202
  #
190
203
  # @return [Boolean]
191
204
  #
@@ -34,6 +34,15 @@ module AppArchetype
34
34
  @data.detect { |var| var.name == name }
35
35
  end
36
36
 
37
+ ##
38
+ # Adds a variable to the set
39
+ #
40
+ # @param [AppArchetype::Template::Variable] var
41
+ #
42
+ def add(var)
43
+ @data << var
44
+ end
45
+
37
46
  ##
38
47
  # Creates a hash representation of variables.
39
48
  #
@@ -2,5 +2,5 @@ module AppArchetype
2
2
  ##
3
3
  # AppArchetype version
4
4
  #
5
- VERSION = '1.2.3'.freeze
5
+ VERSION = '1.2.8'.freeze
6
6
  end
@@ -58,6 +58,19 @@ RSpec.describe AppArchetype::Template::VariableManager do
58
58
  end
59
59
  end
60
60
 
61
+ describe '#add' do
62
+ let(:new_var) { double(AppArchetype::Template::Variable) }
63
+
64
+ before do
65
+ subject.add(new_var)
66
+ end
67
+
68
+ it 'adds variable to set' do
69
+ expect(subject.instance_variable_get(:@data).include?(new_var))
70
+ .to be true
71
+ end
72
+ end
73
+
61
74
  describe '#to_h' do
62
75
  let(:instance_helpers) { double }
63
76
  let(:random_result) { 'random-string-25-chars-long' }
@@ -72,6 +72,20 @@ RSpec.describe AppArchetype::Template::Variable do
72
72
  end
73
73
  end
74
74
 
75
+ describe '::MAP_VALIDATOR' do
76
+ it 'returns true when given hash' do
77
+ expect(
78
+ described_class::MAP_VALIDATOR.call({})
79
+ ).to be true
80
+ end
81
+
82
+ it 'returns false when given a non hash input' do
83
+ expect(
84
+ described_class::MAP_VALIDATOR.call('zyzz')
85
+ ).to be false
86
+ end
87
+ end
88
+
75
89
  describe '#set!' do
76
90
  context 'setting with a valid value' do
77
91
  before { subject.set!('a value') }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: app_archetype
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.3
4
+ version: 1.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Bigger
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-14 00:00:00.000000000 Z
11
+ date: 2021-07-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cli-format
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 0.3.0
61
+ version: 0.4.0
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 0.3.0
68
+ version: 0.4.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: json-schema
71
71
  requirement: !ruby/object:Gem::Requirement