appifier 0.1.2 → 0.2.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 (34) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -0
  3. data/VERSION +1 -1
  4. data/appifier.gemspec +6 -0
  5. data/exe/app +10 -0
  6. data/lib/appifier/actors/collector.rb +1 -1
  7. data/lib/appifier/actors/retriever.rb +21 -5
  8. data/lib/appifier/cli/configuration.rb +40 -2
  9. data/lib/appifier/cli/templates.rb +48 -4
  10. data/lib/appifier/cli.rb +23 -8
  11. data/lib/appifier/components/Appifile.rb +52 -10
  12. data/lib/appifier/components/template.rb +125 -0
  13. data/lib/appifier/setup.rb +26 -3
  14. data/lib/appifier.rb +6 -10
  15. data/samples/baddummy/Appifile +18 -0
  16. data/samples/baddummy/skeleton/%%APPNAME.downcase%%/.rspec +0 -0
  17. data/samples/baddummy/skeleton/%%APPNAME.downcase%%/Rakefile +0 -0
  18. data/samples/baddummy/skeleton/%%APPNAME.downcase%%/config.ru +0 -0
  19. data/samples/baddummy/skeleton/%%APPNAME.downcase%%/exe/%%APPNAME.downcase%% +0 -0
  20. data/samples/baddummy/skeleton/%%APPNAME.downcase%%/lib/%%APPNAME.downcase%%.rb +0 -0
  21. data/samples/baddummy/skeleton/%%APPNAME.downcase%%/spec/%%APPNAME.downcase%%_spec.rb +0 -0
  22. data/samples/baddummy.tgz +0 -0
  23. data/samples/dummy/Appifile +8 -1
  24. data/samples/dummy/README.md +4 -0
  25. data/samples/dummy.tgz +0 -0
  26. data/samples/dummy_warn/Appifile +19 -0
  27. data/samples/dummy_warn/skeleton/%%APPNAME.downcase%%/.rspec +0 -0
  28. data/samples/dummy_warn/skeleton/%%APPNAME.downcase%%/Rakefile +0 -0
  29. data/samples/dummy_warn/skeleton/%%APPNAME.downcase%%/config.ru +0 -0
  30. data/samples/dummy_warn/skeleton/%%APPNAME.downcase%%/exe/%%APPNAME.downcase%% +0 -0
  31. data/samples/dummy_warn/skeleton/%%APPNAME.downcase%%/lib/%%APPNAME.downcase%%.rb +0 -0
  32. data/samples/dummy_warn/skeleton/%%APPNAME.downcase%%/spec/%%APPNAME.downcase%%_spec.rb +0 -0
  33. metadata +109 -7
  34. data/lib/appifier/components/templates.rb +0 -34
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aeea227ea8e3eaa87c58fcbd7333297f73b7e2c82f7ba51da9b8bccb4f979f05
4
- data.tar.gz: 3121f0753db7fbc4b8d68f2acfaf141cf9ee9785f5abfc5edca2b5a645faa942
3
+ metadata.gz: 64a7a60db8dd229246c475055d13afb7bdfd5132ecc6ef459363e556d2e35fee
4
+ data.tar.gz: c0644082483f20413e04199e3be7a22d03b3555454014763d8fc08b09bf69049
5
5
  SHA512:
6
- metadata.gz: d7aceeba188e836380bd52eebdfb87839c6227f79282e2ae90fe12d1486d03c4dbb53147c61abb84d4aab172bca8e10b8d7aa419b214e0f0bb151bbd30e4a17c
7
- data.tar.gz: 90fa233237110cfc8c815e6d3002dbc831eaf08b9979d9f0d499f9d08228768c87e519f212fde8241ee9c944f158d90cadbe9924fc4031bd8a8eaa42a6165873
6
+ metadata.gz: 4a84ad6c49d32cc7a5ab26ceac69e9727ca324696274223ca86653255a0c10deb72043d5f01d1f1313fd8599857a7b5fdb2cc87507ab2c6209cda20c8ec5082e
7
+ data.tar.gz: 56ad5218965225bcb9ad2caa95e241f9cdbe0063dbfd2631599ef915562a66463a3815a293987e72766735cbfaccaa9bba44febce253b514df8294caa6f766cb
data/Gemfile CHANGED
@@ -3,3 +3,4 @@
3
3
  source 'https://rubygems.org'
4
4
 
5
5
  gemspec
6
+
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.2
1
+ 0.2.0
data/appifier.gemspec CHANGED
@@ -37,4 +37,10 @@ Gem::Specification.new do |spec|
37
37
  spec.add_dependency 'carioca', '~> 2.0.9'
38
38
  spec.add_dependency 'thor', '~> 1.2'
39
39
  spec.add_dependency 'tty-prompt', '~> 0.23.1'
40
+ spec.add_dependency "thot", "~> 1.0"
41
+ spec.add_dependency "git", "~> 1.12"
42
+ spec.add_dependency "schash","~> 0.1.2"
43
+ spec.add_dependency "tty-tree", "~> 0.4.0"
44
+ spec.add_dependency "tty-markdown", "~> 0.7.0"
45
+ spec.add_dependency "tty-link", "~> 0.1.1"
40
46
  end
data/exe/app ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'appifier'
5
+
6
+ require 'appifier/cli'
7
+
8
+ include Appifier::CLI
9
+
10
+ MainCommand.start(ARGV)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- require "tty-prompt"
2
+
3
3
 
4
4
  module Appifier
5
5
  module Actors
@@ -1,18 +1,27 @@
1
1
  # frozen_string_literal: false
2
-
2
+ require 'git'
3
+ require 'uri'
3
4
  module Appifier
4
5
  module Actors
5
6
  module Retrivers
6
7
  class Git
7
- def self.get(origin:, destination:);
8
- raise 'not yest implemented'
8
+ def self.get(origin:, destination:)
9
+ uri = URI.parse(origin)
10
+ path = uri.path
11
+ name = File.basename(path, ".git")
12
+ raise "Git URL format failed (only http bare git format)" if name.include?('.')
13
+ ::Git.clone(origin, nil, path: destination)
14
+ return name
9
15
  end
10
16
  end
11
17
 
12
18
  class Archive
13
19
  def self.get(origin:, destination:)
14
20
  raise "Archive : #{origin} not found" unless File::exist? origin
21
+ name = File.basename(origin, ".tgz")
22
+ raise "Template name format failed : must be .tgz file" if name.include?('.')
15
23
  untar_gz archive: origin, destination: destination
24
+ return name
16
25
  end
17
26
  end
18
27
  end
@@ -27,11 +36,18 @@ module Appifier
27
36
  @origin = origin
28
37
  @type = type
29
38
  @destination = destination
30
- output.info "retrieving template from #{origin}"
39
+ output.info "Retrieving template from #{origin}"
31
40
  end
32
41
 
33
42
  def get
34
- TYPE[@type].get origin: @origin, destination: @destination
43
+ template = TYPE[@type].get origin: @origin, destination: @destination
44
+ result = Appifier::Components::Template.validate!(template: template)
45
+ unless result[:error].empty?
46
+ output.ko "Template #{template} retrieving cancelled"
47
+ Appifier::Components::Template.rm(template) unless result[:error].empty?
48
+
49
+ end
50
+ return result
35
51
  end
36
52
  end
37
53
  end
@@ -4,13 +4,51 @@ module Appifier
4
4
  module CLI
5
5
  module Subcommands
6
6
  class Configuration < ::Thor
7
+
8
+ def initialize(*args)
9
+ super
10
+ @output = Carioca::Registry.get.get_service name: :output
11
+ @finisher = Carioca::Registry.get.get_service name: :finisher
12
+ end
13
+
7
14
  # Thor method : running of Appifier sanitycheck
8
15
  desc 'sanitycheck', 'Verify installation of Appifier for user'
9
- def sanitycheck; end
16
+ def sanitycheck
17
+ Appifier::Configuration::Checker.sanitycheck
18
+
19
+ end
20
+
21
+
22
+ # Thor method : running of Appifier setup for config rebuild [DANGER]
23
+ desc 'reset', 'Running Appifier setup for configuration rebuild [DANGER]'
24
+ long_desc <<-LONGDESC
25
+ Running Appifier setup for configuration rebuild [DANGER]\n
26
+ with --force => force collect, and destroy previous configuration [DANGER]
27
+ LONGDESC
28
+ option :force, type: :boolean, aliases: '-F'
29
+ def reset
30
+ begin
31
+ raise "[DANGER] please add -F if you sure : appifier configuration reset -F" unless options[:force]
32
+ @output.warn "Appifier reset configuration"
33
+ Appifier::Configuration.setup force: true
34
+ @finisher.terminate exit_case: :quiet_exit
35
+ rescue RuntimeError => e
36
+ @output.error e.message
37
+ @finisher.terminate exit_case: :error_exit
38
+ end
39
+
40
+ end
10
41
 
11
42
  # Thor method : Getting the current Appifier version
12
43
  desc 'version', 'Display current Appifier version'
13
- def version; end
44
+ def version;
45
+ @output.info "Querying version"
46
+ puts 'Appifier (c) Ultragreen Software'
47
+ puts "Camille PAQUET - Romain GEORGES "
48
+ puts TTY::Link.link_to("http://www.ultragreen.net", "http://www.ultragreen.net")
49
+ puts "Version #{Appifier::VERSION}"
50
+ @finisher.terminate exit_case: :quiet_exit
51
+ end
14
52
  end
15
53
  end
16
54
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
-
2
+ require 'tty-markdown'
3
3
  module Appifier
4
4
  module CLI
5
5
  module Subcommands
@@ -14,15 +14,59 @@ module Appifier
14
14
  # Thor method : list availables templates in user bundle
15
15
  desc 'ls', 'list templates availables in user bundle'
16
16
  def ls
17
- Appifier::Components::Templates::list
18
- @finisher.terminate exit_case: :error_exit
17
+ Appifier::Components::Template::list
18
+ @finisher.terminate exit_case: :quiet_exit
19
19
  end
20
20
 
21
21
  # Thor method : remove a template from user bundle
22
22
  desc 'rm', 'rm templates from user bundle'
23
23
  def rm(template)
24
24
  begin
25
- Appifier::Components::Templates::rm(template)
25
+ Appifier::Components::Template::rm(template)
26
+ @output.info "Template #{template} removed"
27
+ @finisher.terminate exit_case: :quiet_exit
28
+ rescue RuntimeError => e
29
+ @output.error e.message
30
+ @finisher.terminate exit_case: :error_exit
31
+ end
32
+ end
33
+
34
+ # Thor method : show information for a specific template in user bundle
35
+ desc 'show', 'show information for a specific template in user bundle'
36
+ def show(template)
37
+ begin
38
+ Appifier::Components::Template::show(template)
39
+ temp = Appifier::Components::Template::new(template: template)
40
+ if temp.readme?
41
+ puts " "
42
+ puts TTY::Markdown.parse_file(temp.readme_path)
43
+ end
44
+
45
+ @finisher.terminate exit_case: :quiet_exit
46
+ rescue RuntimeError => e
47
+ @output.error e.message
48
+ @finisher.terminate exit_case: :error_exit
49
+ end
50
+ end
51
+
52
+ # Thor method : display directory tree view for a specific template in user bundle
53
+ desc 'treeview', 'display directory tree view for a specific template in user bundle'
54
+ def treeview(template)
55
+ begin
56
+ Appifier::Components::Template::treeview(template)
57
+ @finisher.terminate exit_case: :quiet_exit
58
+ rescue RuntimeError => e
59
+ @output.error e.message
60
+ @finisher.terminate exit_case: :error_exit
61
+ end
62
+ end
63
+
64
+ # Thor method : lint a specific template in user bundle
65
+ desc 'lint', 'Lint a specific template in user bundle'
66
+ def lint(template)
67
+ begin
68
+ Appifier::Components::Template::lint(template)
69
+ @finisher.terminate exit_case: :quiet_exit
26
70
  rescue RuntimeError => e
27
71
  @output.error e.message
28
72
  @finisher.terminate exit_case: :error_exit
data/lib/appifier/cli.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: false
2
2
 
3
3
  require 'appifier'
4
- require 'thor'
5
4
 
6
5
  Dir["#{File.dirname(__FILE__)}/cli/*.rb"].sort.each { |file| require file }
7
6
 
@@ -29,10 +28,11 @@ module Appifier
29
28
  subcommand 'configuration', Subcommands::Configuration
30
29
 
31
30
  # Thor method : running of Appifier generate
32
- desc 'generate TEMPLATE [TARGET]', 'Generate application from bundled template'
31
+ desc 'generate TEMPLATE [TARGET]', 'Generate application from bundled template (IF TARGET ommited use the current path as ROOTPATH)'
33
32
  long_desc <<-LONGDESC
34
33
  Generate application from bundled template\n
35
- with --simulate, only simulate folders and files installed
34
+ (IF TARGET ommited use the current path as ROOTPATH)\n
35
+ with --simulate, only simulate folders and files installed\n
36
36
  with --force, force regeneration of application, remove old files [DANGER]
37
37
  LONGDESC
38
38
  option :simulate, type: :boolean, aliases: '-s'
@@ -45,8 +45,17 @@ module Appifier
45
45
  dataset = open_dataset(template: template)
46
46
  @output.info "Dataset file found for #{template}"
47
47
  else
48
- @output.ko "Dataset file not found for #{template}"
49
- @finisher.terminate exit_case: :error_exit
48
+ @output.warn "Dataset file not found for #{template}"
49
+ if TTY::Prompt.new.yes?("Do you want to collect dataset interactively ?")
50
+ @output.info "Beginning interactive Dataset input for #{template}"
51
+ collector = Appifier::Actors::Collector.new template: template
52
+ collector.collect
53
+ dataset = open_dataset(template: template)
54
+ else
55
+ puts "=> Exiting run 'appifier collect #{template}' for collecting data"
56
+ puts " (use -S for collecting from STDIN or -f <FILE>) "
57
+ @finisher.terminate exit_case: :quiet_exit
58
+ end
50
59
  end
51
60
 
52
61
  begin
@@ -70,7 +79,13 @@ module Appifier
70
79
  begin
71
80
  type = options[:type].to_sym
72
81
  retriever = Appifier::Actors::Retriever.new type: type, origin: origin
73
- retriever.get
82
+ results = retriever.get
83
+ @output.info "Detail of notifications : " unless results[:error].empty? and results[:warn].empty? and results[:cleaned].empty?
84
+ [:error, :warn].each do |level|
85
+ results[level].each { |value| @output.send level, "#{level.to_s} : #{value}" }
86
+ end
87
+ results[:cleaned].each { |value| @output.ok "cleaned : #{value}" }
88
+ @finisher.terminate exit_case: :error_exit unless results[:error].empty?
74
89
  @finisher.terminate exit_case: :quiet_exit
75
90
  rescue RuntimeError => e
76
91
  @output.error e.message
@@ -82,8 +97,8 @@ module Appifier
82
97
  desc 'collect TEMPLATE', 'Collect dataset for an application template in user templates bundle'
83
98
  long_desc <<-LONGDESC
84
99
  Collect dataset for an application template in user templates bundle\n
85
- with --force => force collect, and destroy previous Dataset [DANGER]
86
- with --file FILENAME get data from à YAML File
100
+ with --force => force collect, and destroy previous Dataset [DANGER]\n
101
+ with --file FILENAME get data from à YAML File\n
87
102
  with --stdin get data from STDIN
88
103
 
89
104
  LONGDESC
@@ -1,3 +1,5 @@
1
+ require 'schash'
2
+
1
3
  module Appifier
2
4
  module Components
3
5
  class Appifile
@@ -6,8 +8,11 @@ module Appifier
6
8
 
7
9
  def initialize(path:)
8
10
  @path = path
9
- @content = {}
10
- openfile
11
+ begin
12
+ @content = open_yaml filename: @path
13
+ rescue RuntimeError
14
+ raise "Appifile missing"
15
+ end
11
16
  end
12
17
 
13
18
  def dataset_rules
@@ -18,17 +23,54 @@ module Appifier
18
23
  @content[:actions]
19
24
  end
20
25
 
21
- private
22
- def openfile
23
- raise 'Appifile not foud' unless File::exist? @path
26
+ def self.validate!(path:)
27
+ appifile = {}
28
+ res = {status: :ok, warn: [], error: [], cleaned: []}
24
29
  begin
25
- @content = YAML.load_file(@path)
26
- rescue StandardError => e
27
- raise e.message
30
+ appifile = open_yaml filename: path
31
+ validator = Schash::Validator.new do
32
+ {
33
+ template: {
34
+ authors: optional(array_of(string)),
35
+ version: numeric,
36
+ contact: optional(string),
37
+ description: optional(string),
38
+ dataset: {
39
+
40
+ }
41
+ },
42
+ actions: {
43
+ deploy: {},
44
+ run: {},
45
+ build: {},
46
+ publish: {},
47
+ test: {},
48
+ },
49
+ }
50
+
51
+ end
52
+
53
+ dataset_rules_validator = Schash::Validator.new do
54
+ {
55
+ format: string,
56
+ description: string,
57
+ default: optional(string)
58
+ }
59
+ end
60
+
61
+
62
+ result = validator.validate(appifile)
63
+ result.each {|item| res[:error].push "Appifiler : //#{item.position.join('/')} #{item.message}"}
64
+ appifile[:template][:dataset].each do |rule, definition|
65
+ result = dataset_rules_validator.validate definition
66
+ result.each {|item| res[:error].push "Appifiler : //template/dataset/#{rule}/#{item.position.join('/')} #{item.message}"}
67
+ end
68
+ rescue RuntimeError
69
+ res[:error].push "Appifile missing"
28
70
  end
29
-
30
-
71
+ return res
31
72
  end
73
+
32
74
  end
33
75
  end
34
76
  end
@@ -0,0 +1,125 @@
1
+ # frozen_string_literal: true
2
+ require 'tty-tree'
3
+ module Appifier
4
+ module Components
5
+
6
+
7
+ class Template
8
+ extend Carioca::Injector
9
+ inject service: :output
10
+ attr_accessor :appifile
11
+ attr_reader :readme_path, :skeleton_path
12
+ IGNORE_LIST = [".git"]
13
+
14
+ def initialize(template: nil, path: nil)
15
+ raise "Missing template or path keyword" if template.nil? && path.nil?
16
+ @path = File.expand_path("#{Appifier::DEFAULT_TEMPLATES_PATH}/#{template}") if template
17
+ @path = path if path
18
+ @appifile_name = "#{@path}/Appifile"
19
+ @skeleton_path = "#{@path}/skeleton"
20
+ @readme_path = "#{@path}/README.md"
21
+ begin
22
+ @appifile = Appifier::Components::Appifile::new(path: @appifile_name)
23
+ rescue RuntimeError
24
+ raise "Template format error"
25
+ end
26
+ end
27
+
28
+ def readme?
29
+ File.exist? @readme_path
30
+ end
31
+
32
+ def self.validate!(template: nil, path: nil)
33
+ raise "Missing template or path keyword" if template.nil? && path.nil?
34
+ path = File.expand_path("#{Appifier::DEFAULT_TEMPLATES_PATH}/#{template}") if template
35
+ path = path if path
36
+ appifile_name = "#{path}/Appifile"
37
+
38
+ result = Appifier::Components::Appifile.validate!(path: appifile_name)
39
+ IGNORE_LIST.each do |item|
40
+ item_path = "#{path}/#{item}"
41
+ if File.exist? item_path
42
+ FileUtils::rm_rf item_path
43
+ result[:cleaned].push item
44
+ end
45
+ end unless result.include? :error
46
+ result[:error].push "Skeleton path missing" unless File.exist?("#{path}/skeleton")
47
+ result[:warn].push "README.md missing" unless File.exist?("#{path}/README.md")
48
+ result[:status] = :ok
49
+ result[:status] = :partial unless result[:warn].empty?
50
+ result[:status] = :ko unless result[:error].empty?
51
+ return result
52
+ end
53
+
54
+ def self.list
55
+ output.info "List of avaible templates for user : #{current_user} :"
56
+ template_path = File.expand_path(Appifier::DEFAULT_TEMPLATES_PATH)
57
+ Dir.glob("#{template_path}/*").map { |item| item.delete_prefix("#{template_path}/") }.each do |template|
58
+ output.item "#{template}"
59
+ end
60
+ end
61
+
62
+ def self.rm(template)
63
+ output.info "Removing template #{template} for user : #{current_user}"
64
+ template_path = File.expand_path(Appifier::DEFAULT_TEMPLATES_PATH)
65
+ begin
66
+ if File::exist? "#{template_path}/#{template}"
67
+ FileUtils.rm_rf "#{template_path}/#{template}"
68
+ output.ok "Template #{template} deleted of bundle for user #{current_user}"
69
+ else
70
+ raise "Template #{template} not found in bundle for user #{current_user}"
71
+ end
72
+ rescue Errno::ENOENT
73
+ raise "Template #{template} not found in bundle for user #{current_user}"
74
+ end
75
+ end
76
+
77
+ def self.show(template)
78
+ data = Appifier::Components::Template::new(template: template)
79
+ data_template = data.appifile.content[:template]
80
+ output.info "Template #{template} informations"
81
+ output.item "Name : #{data_template[:name]}"
82
+ output.item "Version : #{data_template[:version]}"
83
+ if data_template[:authors]
84
+ output.item "Authors : "
85
+ data_template[:authors].each do |author|
86
+ output.arrow author
87
+ end
88
+ end
89
+ output.item "Description : #{data_template[:description]}" if data_template[:description]
90
+ output.item "Contact : #{data_template[:contact]}" if data_template[:contact]
91
+ output.info "Dataset informations : "
92
+ data_template[:dataset].each do |rule, definition|
93
+ output.item "Rule : #{rule}"
94
+ output.arrow "Description : #{definition[:description]}"
95
+ output.arrow "Default : #{definition[:default]}" if definition[:default]
96
+ output.arrow "Format : #{definition[:format]}"
97
+ end
98
+
99
+ end
100
+
101
+ def self.treeview(template)
102
+ begin
103
+ data = Appifier::Components::Template::new(template: template)
104
+ output.info "Getting tree view for template #{template} : "
105
+ tree = TTY::Tree.new(data.skeleton_path)
106
+ puts tree.render
107
+ rescue RuntimeError
108
+ raise "Template not found"
109
+ end
110
+ end
111
+
112
+ def self.lint(template)
113
+ begin
114
+ res = Appifier::Components::Template.validate!(template: template)
115
+ output.info "List of warnings for template #{template}"
116
+ res[:warn].each do |warn|
117
+ output.warn warn
118
+ end
119
+ rescue RuntimeError
120
+ raise "Template not found"
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
@@ -1,20 +1,43 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Appifier
4
- class Configuration
4
+ module Configuration
5
5
  def self.setup(force: false)
6
6
  if File.exist?(File.expand_path(Appifier::DEFAULT_CONFIG_PATH)) && !force
7
7
  puts 'Appifier already configured'
8
8
  else
9
+ FileUtils.rm_rf File.expand_path(Appifier::DEFAULT_PATH)
9
10
  config_file = search_file_in_gem('appifier', 'config/settings.yml')
10
- path = File.expand_path(Appifier::DEFAULT_TEMPLATES_PATH)
11
11
  [Appifier::DEFAULT_TEMPLATES_PATH, Appifier::DEFAULT_LOGS_PATH, Appifier::DEFAULT_CONFIG_PATH, Appifier::DEFAULT_DATASETS_PATH].each do |path|
12
12
  FileUtils.mkdir_p File.expand_path(path)
13
13
  end
14
- File.open(File.expand_path("#{Appifier::DEFAULT_LOGS_PATH}/#{Appifier::DEFAULT_LOG_FILENAME}"), 'w') { |file| file.write("# Appifier : beginning of log file") }
14
+ File.open(File.expand_path("#{Appifier::DEFAULT_LOGS_PATH}/#{Appifier::DEFAULT_LOG_FILENAME}"), 'w') { |file| file.write("# Appifier : beginning of log file\n") }
15
15
  FileUtils.cp config_file, File.expand_path(Appifier::DEFAULT_CONFIG_PATH)
16
16
  puts '[OK] Building config folder and initialize settings'
17
17
  end
18
18
  end
19
+
20
+
21
+ class Checker
22
+
23
+ extend Carioca::Injector
24
+ inject service: :output
25
+ inject service: :finisher
26
+
27
+ def self.sanitycheck
28
+ output.info "Checking path for #{current_user} : "
29
+ status = { true => :ok, false => :error }
30
+ [DEFAULT_PATH,DEFAULT_TEMPLATES_PATH,DEFAULT_CONFIG_PATH,DEFAULT_LOGS_PATH,DEFAULT_DATASETS_PATH].each do |path|
31
+ output.send status[File::exist?(File::expand_path(path))], path
32
+ end
33
+ output.info "Checking file for #{current_user} : "
34
+
35
+ ["#{DEFAULT_CONFIG_PATH}/#{DEFAULT_SETTINGS_FILENAME}","#{DEFAULT_LOGS_PATH}/#{DEFAULT_LOG_FILENAME}"].each do |file|
36
+ output.send status[File::exist?(File::expand_path(file))], file
37
+ end
38
+ end
39
+ end
40
+
41
+
19
42
  end
20
43
  end
data/lib/appifier.rb CHANGED
@@ -5,6 +5,11 @@ require 'thot'
5
5
  require 'fileutils'
6
6
  require 'etc'
7
7
 
8
+
9
+ require 'thor'
10
+ require "tty-prompt"
11
+ require 'tty-link'
12
+
8
13
  include Thot
9
14
 
10
15
 
@@ -14,7 +19,7 @@ require 'appifier/helpers/init'
14
19
  module Appifier
15
20
  DEFAULT_PATH = '~/.appifier'
16
21
  DEFAULT_TEMPLATES_PATH = "#{DEFAULT_PATH}/templates"
17
- DEFAULT_CONFIG_PATH = "#{DEFAULT_PATH}/config/"
22
+ DEFAULT_CONFIG_PATH = "#{DEFAULT_PATH}/config"
18
23
  DEFAULT_LOGS_PATH = "#{DEFAULT_PATH}/logs"
19
24
  DEFAULT_DATASETS_PATH = "#{DEFAULT_PATH}/datasets"
20
25
  DEFAULT_LOG_FILENAME = "appifier.log"
@@ -49,13 +54,4 @@ Carioca::Registry.configure do |spec|
49
54
  end
50
55
 
51
56
  require_relative 'appifier/services/init'
52
-
53
- module Appifier
54
- class Application < Carioca::Container
55
- inject service: :configuration
56
- inject service: :i18n
57
- inject service: :terminator
58
- end
59
- end
60
-
61
57
  require_relative 'appifier/components/init'
@@ -0,0 +1,18 @@
1
+ ---
2
+ :template:
3
+ :name: dummy
4
+ :authors:
5
+ - Romain Georges
6
+ - Camille Paquet
7
+ :description: dummy template
8
+ :dataset:
9
+ :appname:
10
+ :description: The application name
11
+ :default: test_application
12
+ :format: \w+
13
+ :actions:
14
+ :deploy: {}
15
+ :run: {}
16
+ :build: {}
17
+ :publish: {}
18
+ :test: {}
Binary file
@@ -1,8 +1,14 @@
1
1
  ---
2
2
  :template:
3
+ :name: dummy
4
+ :version: 1.0
5
+ :authors:
6
+ - Romain Georges
7
+ - Camille Paquet
8
+ :description: a dummy template
3
9
  :dataset:
4
10
  :appname:
5
- :description: The application name
11
+ :description: application name
6
12
  :default: test_application
7
13
  :format: \w+
8
14
  :actions:
@@ -10,3 +16,4 @@
10
16
  :run: {}
11
17
  :build: {}
12
18
  :publish: {}
19
+ :test: {}
@@ -0,0 +1,4 @@
1
+ ## dummy template
2
+
3
+
4
+ this is a test
data/samples/dummy.tgz CHANGED
Binary file
@@ -0,0 +1,19 @@
1
+ ---
2
+ :template:
3
+ :name: dummy
4
+ :version: 1.0
5
+ :authors:
6
+ - Romain Georges
7
+ - Camille Paquet
8
+ :description: a dummy template
9
+ :dataset:
10
+ :appname:
11
+ :description: application name
12
+ :default: test_application
13
+ :format: \w+
14
+ :actions:
15
+ :deploy: {}
16
+ :run: {}
17
+ :build: {}
18
+ :publish: {}
19
+ :test: {}
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appifier
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Camille Paquet
8
8
  - Romain GEORGES
9
- autorequire:
9
+ autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2022-10-24 00:00:00.000000000 Z
12
+ date: 2022-10-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: code_statistics
@@ -165,10 +165,95 @@ dependencies:
165
165
  - - "~>"
166
166
  - !ruby/object:Gem::Version
167
167
  version: 0.23.1
168
+ - !ruby/object:Gem::Dependency
169
+ name: thot
170
+ requirement: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - "~>"
173
+ - !ruby/object:Gem::Version
174
+ version: '1.0'
175
+ type: :runtime
176
+ prerelease: false
177
+ version_requirements: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - "~>"
180
+ - !ruby/object:Gem::Version
181
+ version: '1.0'
182
+ - !ruby/object:Gem::Dependency
183
+ name: git
184
+ requirement: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - "~>"
187
+ - !ruby/object:Gem::Version
188
+ version: '1.12'
189
+ type: :runtime
190
+ prerelease: false
191
+ version_requirements: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - "~>"
194
+ - !ruby/object:Gem::Version
195
+ version: '1.12'
196
+ - !ruby/object:Gem::Dependency
197
+ name: schash
198
+ requirement: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - "~>"
201
+ - !ruby/object:Gem::Version
202
+ version: 0.1.2
203
+ type: :runtime
204
+ prerelease: false
205
+ version_requirements: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - "~>"
208
+ - !ruby/object:Gem::Version
209
+ version: 0.1.2
210
+ - !ruby/object:Gem::Dependency
211
+ name: tty-tree
212
+ requirement: !ruby/object:Gem::Requirement
213
+ requirements:
214
+ - - "~>"
215
+ - !ruby/object:Gem::Version
216
+ version: 0.4.0
217
+ type: :runtime
218
+ prerelease: false
219
+ version_requirements: !ruby/object:Gem::Requirement
220
+ requirements:
221
+ - - "~>"
222
+ - !ruby/object:Gem::Version
223
+ version: 0.4.0
224
+ - !ruby/object:Gem::Dependency
225
+ name: tty-markdown
226
+ requirement: !ruby/object:Gem::Requirement
227
+ requirements:
228
+ - - "~>"
229
+ - !ruby/object:Gem::Version
230
+ version: 0.7.0
231
+ type: :runtime
232
+ prerelease: false
233
+ version_requirements: !ruby/object:Gem::Requirement
234
+ requirements:
235
+ - - "~>"
236
+ - !ruby/object:Gem::Version
237
+ version: 0.7.0
238
+ - !ruby/object:Gem::Dependency
239
+ name: tty-link
240
+ requirement: !ruby/object:Gem::Requirement
241
+ requirements:
242
+ - - "~>"
243
+ - !ruby/object:Gem::Version
244
+ version: 0.1.1
245
+ type: :runtime
246
+ prerelease: false
247
+ version_requirements: !ruby/object:Gem::Requirement
248
+ requirements:
249
+ - - "~>"
250
+ - !ruby/object:Gem::Version
251
+ version: 0.1.1
168
252
  description: 'Appifier : Applications templating and management tools '
169
253
  email:
170
254
  - gems@ultragreen.net
171
255
  executables:
256
+ - app
172
257
  - appifier
173
258
  extensions: []
174
259
  extra_rdoc_files: []
@@ -185,6 +270,7 @@ files:
185
270
  - bin/setup
186
271
  - config/appifier.registry
187
272
  - config/settings.yml
273
+ - exe/app
188
274
  - exe/appifier
189
275
  - lib/appifier.rb
190
276
  - lib/appifier/actors/collector.rb
@@ -196,7 +282,7 @@ files:
196
282
  - lib/appifier/cli/templates.rb
197
283
  - lib/appifier/components/Appifile.rb
198
284
  - lib/appifier/components/init.rb
199
- - lib/appifier/components/templates.rb
285
+ - lib/appifier/components/template.rb
200
286
  - lib/appifier/helpers/archives.rb
201
287
  - lib/appifier/helpers/datasets.rb
202
288
  - lib/appifier/helpers/gem.rb
@@ -206,14 +292,30 @@ files:
206
292
  - lib/appifier/services/init.rb
207
293
  - lib/appifier/setup.rb
208
294
  - lib/appifier/version.rb
295
+ - samples/baddummy.tgz
296
+ - samples/baddummy/Appifile
297
+ - samples/baddummy/skeleton/%%APPNAME.downcase%%/.rspec
298
+ - samples/baddummy/skeleton/%%APPNAME.downcase%%/Rakefile
299
+ - samples/baddummy/skeleton/%%APPNAME.downcase%%/config.ru
300
+ - samples/baddummy/skeleton/%%APPNAME.downcase%%/exe/%%APPNAME.downcase%%
301
+ - samples/baddummy/skeleton/%%APPNAME.downcase%%/lib/%%APPNAME.downcase%%.rb
302
+ - samples/baddummy/skeleton/%%APPNAME.downcase%%/spec/%%APPNAME.downcase%%_spec.rb
209
303
  - samples/dummy.tgz
210
304
  - samples/dummy/Appifile
305
+ - samples/dummy/README.md
211
306
  - samples/dummy/skeleton/%%APPNAME.downcase%%/.rspec
212
307
  - samples/dummy/skeleton/%%APPNAME.downcase%%/Rakefile
213
308
  - samples/dummy/skeleton/%%APPNAME.downcase%%/config.ru
214
309
  - samples/dummy/skeleton/%%APPNAME.downcase%%/exe/%%APPNAME.downcase%%
215
310
  - samples/dummy/skeleton/%%APPNAME.downcase%%/lib/%%APPNAME.downcase%%.rb
216
311
  - samples/dummy/skeleton/%%APPNAME.downcase%%/spec/%%APPNAME.downcase%%_spec.rb
312
+ - samples/dummy_warn/Appifile
313
+ - samples/dummy_warn/skeleton/%%APPNAME.downcase%%/.rspec
314
+ - samples/dummy_warn/skeleton/%%APPNAME.downcase%%/Rakefile
315
+ - samples/dummy_warn/skeleton/%%APPNAME.downcase%%/config.ru
316
+ - samples/dummy_warn/skeleton/%%APPNAME.downcase%%/exe/%%APPNAME.downcase%%
317
+ - samples/dummy_warn/skeleton/%%APPNAME.downcase%%/lib/%%APPNAME.downcase%%.rb
318
+ - samples/dummy_warn/skeleton/%%APPNAME.downcase%%/spec/%%APPNAME.downcase%%_spec.rb
217
319
  homepage: https://github.com/Ultragreen/appifier
218
320
  licenses:
219
321
  - MIT
@@ -222,7 +324,7 @@ metadata:
222
324
  source_code_uri: https://github.com/Ultragreen/appifier
223
325
  changelog_uri: https://github.com/Ultragreen/appifier
224
326
  rubygems_mfa_required: 'false'
225
- post_install_message:
327
+ post_install_message:
226
328
  rdoc_options: []
227
329
  require_paths:
228
330
  - lib
@@ -237,8 +339,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
237
339
  - !ruby/object:Gem::Version
238
340
  version: '0'
239
341
  requirements: []
240
- rubygems_version: 3.1.2
241
- signing_key:
342
+ rubygems_version: 3.2.3
343
+ signing_key:
242
344
  specification_version: 4
243
345
  summary: 'Appifier : Applications templating and management tools'
244
346
  test_files: []
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Appifier
4
- module Components
5
- class Templates
6
-
7
- extend Carioca::Injector
8
- inject service: :output
9
-
10
- def self.list
11
- output.info "List of avaible templates for user : #{current_user} :"
12
- template_path = File.expand_path(Appifier::DEFAULT_TEMPLATES_PATH)
13
- Dir.glob("#{template_path}/*").map { |item| item.delete_prefix("#{template_path}/") }.each do |template|
14
- output.item "#{template}"
15
- end
16
- end
17
-
18
- def self.rm(template)
19
- output.info "Removing template #{template} for user : #{current_user} :"
20
- template_path = File.expand_path(Appifier::DEFAULT_TEMPLATES_PATH)
21
- begin
22
- if File::exist? "#{template_path}/#{template}"
23
- FileUtils.rm_rf "#{template_path}/#{template}"
24
- output.ok "Template #{template} deleted of bundle for user #{current_user}"
25
- else
26
- raise "Template #{template} not found in bundle for user #{current_user}"
27
- end
28
- rescue Errno::ENOENT
29
- raise "Template #{template} not found in bundle for user #{current_user}"
30
- end
31
- end
32
- end
33
- end
34
- end