cocoanova 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ef877707e1fa3f1767538fe0be75402b1a0bb5c6
4
+ data.tar.gz: f53b61f64882706078c163df7652e6c6480f210b
5
+ SHA512:
6
+ metadata.gz: d7c00f30602d090d4effc49eb0768b50d57c6751374cbf0f8e6e04e2e619aefa352fc9d7f0150fca0640083c3f12f95d8ccb72b7b565aad150fb9426d13851cc
7
+ data.tar.gz: a200bf920fbdb498e1ec35bb873f05cdcec965b86668e9c30017340d25d2988517062ce26e4d85ef950f78a2444b72fc36f8ac8b1a7739076069b67b56f15ca2
data/bin/nova ADDED
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'yaml'
4
+ require 'cocoanova'
5
+
6
+ config = { 'src_root'=> Dir.pwd }
7
+
8
+ # Load novarc
9
+ if File.exists? './.novarc'
10
+ config.merge! YAML.load_file './.novarc'
11
+ end
12
+
13
+ # Generate config
14
+ # Resolve src_root from relative
15
+ config['src_root'] = File.expand_path(config['src_root'], Dir.pwd)
16
+ # Set local_root if not exists
17
+ config['local_root'] ||= File.expand_path('./nova', config['src_root'])
18
+ # Resolve local_root from relative
19
+ config['local_root'] = File.expand_path(config['local_root'], Dir.pwd)
20
+
21
+ # Require plugins
22
+ Array.wrap(config['plugins']).each do |plugin|
23
+ require plugin
24
+ end
25
+
26
+ # Set project root to ./
27
+ Nova.src_root = config['src_root']
28
+ # Set local nova root to ./nova
29
+ Nova.local_root= config['local_root']
30
+
31
+ # Load Tasks
32
+ Nova::Task.require_all
33
+
34
+ # Execute task or print tasks
35
+ if ARGV.first.nil?
36
+ puts "CocoaNova Avaliable Tasks"
37
+ Nova::Task::Tasks.each_pair do |key, value|
38
+ puts "Task: #{key}"
39
+ Array.wrap(value).each do |task|
40
+ puts " -#{task}"
41
+ end
42
+ puts ""
43
+ end
44
+ else
45
+ puts "======== Task: #{ARGV.first} =========="
46
+ Nova::Task.invoke(ARGV.first)
47
+ end
data/lib/cocoanova.rb ADDED
@@ -0,0 +1,75 @@
1
+ require 'rubygems'
2
+ require 'active_support/all'
3
+
4
+ module Nova
5
+ Plugins = []
6
+
7
+ @@local_root= nil
8
+ @@src_root = nil
9
+ @@data = {}
10
+
11
+ autoload :VERSION, 'cocoanova/version'
12
+ autoload :Loader, 'cocoanova/loader'
13
+ autoload :Engine, 'cocoanova/engine'
14
+ autoload :Helper, 'cocoanova/helper'
15
+ autoload :Task, 'cocoanova/task'
16
+
17
+ # Register Plugin
18
+ def self.register_plugin(path)
19
+ Plugins << path
20
+ end
21
+
22
+ # Global data
23
+ def self.data
24
+ @@data
25
+ end
26
+
27
+ def self.data=(value)
28
+ @@data = value
29
+ end
30
+
31
+ # Get preset_path, i.e. lib/cocoanova
32
+ def self.preset_path
33
+ File.expand_path('../cocoanova', __FILE__)
34
+ end
35
+
36
+ # Get project root
37
+ def self.src_root
38
+ @@src_root
39
+ end
40
+
41
+ # Set project root
42
+ def self.src_root=(value)
43
+ @@src_root= value
44
+ end
45
+
46
+ # Get local nova root
47
+ def self.local_root
48
+ @@local_root
49
+ end
50
+
51
+ # Set local nova root
52
+ def self.local_root=(value)
53
+ @@local_root = value
54
+ end
55
+
56
+ # Require a folder in both preset path and local path
57
+ def self.require_folder(folder)
58
+ # Require folder from preset path, i.e. lib/cocoanova/
59
+ Dir["#{self.preset_path}/#{folder}/**/*.rb"].each do |file|
60
+ require file
61
+ end
62
+ # Load Plugins
63
+ Plugins.each do |path|
64
+ Dir["#{path}/#{folder}/**/*.rb"].each do |file|
65
+ require file
66
+ end
67
+ end
68
+ # Require folder from local nova path, i.e. ./nova/
69
+ if self.local_root
70
+ Dir["#{self.local_root}/#{folder}/**/*.rb"].each do |file|
71
+ require file
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,35 @@
1
+ module Nova
2
+ class Engine
3
+ Registry = {}
4
+
5
+ # Load all engines
6
+ def self.require_all
7
+ Nova.require_folder :engines
8
+ end
9
+
10
+ # Supported extensions, all symbol
11
+ def self.supported_extensions
12
+ Registry.keys
13
+ end
14
+
15
+ # Get subclass
16
+ def self.[](ext)
17
+ Registry[ext.to_sym]
18
+ end
19
+
20
+ # For subclass
21
+
22
+ # Register a subclass for file extension
23
+ def self.extension(*exts)
24
+ exts.flatten.each do |ext|
25
+ Registry[ext.to_sym] = self
26
+ puts "Engine Loaded: '#{self}' registered to extension '#{ext}'"
27
+ end
28
+ end
29
+
30
+ # Execute render
31
+ def render(template, data, filename)
32
+ raise "#{self}#render not implemented."
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,29 @@
1
+ require 'erb'
2
+ require 'ostruct'
3
+ require 'digest'
4
+
5
+ class Nova::Engine::ERB < Nova::Engine
6
+ extension :erb
7
+
8
+ def render(_template, _data, _filename)
9
+ clazz = ::ERB.new(_template).def_class
10
+ clazz.class_eval do
11
+ include Nova::Helper
12
+
13
+ def initialize(data, filename)
14
+ @data = data
15
+ @filename = filename
16
+ end
17
+
18
+ def filename
19
+ @filename
20
+ end
21
+
22
+ def data
23
+ @data
24
+ end
25
+ end
26
+ clazz.new(OpenStruct.new(_data), _filename).result
27
+ end
28
+
29
+ end
@@ -0,0 +1,7 @@
1
+ module Nova
2
+ module Helper
3
+ def self.require_all
4
+ Nova.require_folder :helpers
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,49 @@
1
+ module Nova
2
+ class Loader
3
+ # Regular file loaders
4
+ Registry = {}
5
+ # Phony loaders
6
+ Phony = {}
7
+
8
+ # Load all from default folder
9
+ def self.require_all
10
+ Nova.require_folder :loaders
11
+ end
12
+
13
+ # Supported extensions
14
+ def self.supported_extensions
15
+ Registry.keys
16
+ end
17
+
18
+ # Get implement
19
+ def self.[](ext)
20
+ Registry[ext.to_sym]
21
+ end
22
+
23
+ # For subclass calling
24
+
25
+ # Register Engines
26
+ def self.extension(*exts)
27
+ exts.flatten.each do |ext|
28
+ Registry[ext.to_sym] = self
29
+ puts "Loader Loaded: '#{self}' registered to extension '#{ext}'"
30
+ end
31
+ end
32
+
33
+ # Phony loader
34
+ def self.phony(*keys)
35
+ keys.flatten.each do |key|
36
+ Phony[key.to_sym] = self
37
+ puts "Phony Loader: '#{self}' registered to key '#{key}'"
38
+ end
39
+ end
40
+
41
+ # For subclassing
42
+
43
+ # Load data from a file or phony
44
+ def load(content)
45
+ raise "#{self}.load not implemented"
46
+ end
47
+
48
+ end
49
+ end
@@ -0,0 +1,9 @@
1
+ require 'json'
2
+
3
+ class Nova::Loader::JSON < Nova::Loader
4
+ extension :json
5
+
6
+ def load(content)
7
+ ::JSON.parse content
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class Nova::Loader::TXT < Nova::Loader
2
+ extension :txt
3
+
4
+ def load(content)
5
+ content.split("\n").delete_if do |val|
6
+ val == nil || val == ""
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'yaml'
2
+
3
+ class Nova::Loader::YAML < Nova::Loader
4
+ extension :yml, :yaml
5
+
6
+ def load(content)
7
+ ::YAML.load(content)
8
+ end
9
+ end
@@ -0,0 +1,43 @@
1
+ # Task System
2
+
3
+ module Nova
4
+ class Task
5
+ Tasks = {}
6
+
7
+ def self.require_all
8
+ Nova.require_folder :tasks
9
+ end
10
+
11
+ def self.[](key)
12
+ Tasks[key.to_sym] || []
13
+ end
14
+
15
+ def self.[]=(key, value)
16
+ Tasks[key.to_sym] ||= []
17
+ Tasks[key.to_sym] << value
18
+ end
19
+
20
+ def self.invoke(name, params = {})
21
+ total = self[name].count
22
+ raise "Task #{name} not found" if total == 0
23
+ self[name].each_with_index do |task, idx|
24
+ puts "===> #{idx + 1}/#{total} #{task}"
25
+ task.new.invoke(params)
26
+ end
27
+ end
28
+
29
+ # For Register
30
+
31
+ def self.task(*names)
32
+ names.flatten.each do |name|
33
+ Nova::Task[name] = self
34
+ end
35
+ end
36
+
37
+ # For subclassing
38
+
39
+ def invoke(params = {})
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,46 @@
1
+ class Nova::Task::Compile < Nova::Task
2
+ task :compile
3
+
4
+ def load_data
5
+ # Load regular data
6
+ Dir["#{Nova.local_root}/data/*"].each do |file|
7
+ key = File.basename(file).split('.').first.downcase.to_sym
8
+ extname = file.split('.').last.to_sym
9
+ if Nova::Loader.supported_extensions.include?(extname)
10
+ content = File.open(file).read
11
+ Nova.data[key] = Nova::Loader[extname].new.load(content)
12
+ else
13
+ raise "Data file extension '#{extname}' not supported"
14
+ end
15
+ end
16
+ # Load phony data
17
+ Nova::Loader::Phony.each_pair do |key, clazz|
18
+ Nova.data[key] = clazz.new.load(key)
19
+ end
20
+ end
21
+
22
+ def invoke(params = {})
23
+ raise "Nova.local_root not set" unless Nova.local_root
24
+ raise "Nova.src_root not set" unless Nova.src_root
25
+
26
+ Nova::Helper.require_all
27
+ Nova::Loader.require_all
28
+ Nova::Engine.require_all
29
+
30
+ self.load_data
31
+
32
+ # Find all *.erb and render from yml file
33
+ Dir["#{Nova.src_root}/**/*"].each do |file|
34
+ extname = file.split('.').last.to_sym
35
+ if Nova::Engine.supported_extensions.include? extname
36
+ template= File.open(file).read
37
+ target = File.join File.dirname(file), File.basename(file, ".*")
38
+ puts "File Rendering: #{target}"
39
+ result = Nova::Engine[extname].new.render(template, Nova.data, target)
40
+ File.open(target, 'w') { |tf| tf.write(result) }
41
+ end
42
+ end
43
+
44
+ puts "Done !"
45
+ end
46
+ end
@@ -0,0 +1,3 @@
1
+ module Nova
2
+ VERSION="1.0.0"
3
+ end
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cocoanova
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Yanke Guo
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-06-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 4.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 4.0.0
27
+ description: CocoaNova is a iOS project management toolkit, providing code generator
28
+ and assets checking.
29
+ email: me@yanke.io
30
+ executables:
31
+ - nova
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - lib/cocoanova/engine.rb
36
+ - lib/cocoanova/engines/erb.rb
37
+ - lib/cocoanova/helper.rb
38
+ - lib/cocoanova/loader.rb
39
+ - lib/cocoanova/loaders/json.rb
40
+ - lib/cocoanova/loaders/txt.rb
41
+ - lib/cocoanova/loaders/yaml.rb
42
+ - lib/cocoanova/task.rb
43
+ - lib/cocoanova/tasks/compile.rb
44
+ - lib/cocoanova/version.rb
45
+ - lib/cocoanova.rb
46
+ - bin/nova
47
+ homepage: http://rubygems.org/gems/cocoanova
48
+ licenses:
49
+ - MIT
50
+ metadata: {}
51
+ post_install_message:
52
+ rdoc_options: []
53
+ require_paths:
54
+ - lib
55
+ required_ruby_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - '>='
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - '>='
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ requirements: []
66
+ rubyforge_project:
67
+ rubygems_version: 2.0.14
68
+ signing_key:
69
+ specification_version: 4
70
+ summary: CocoaNova is a iOS project management toolkit
71
+ test_files: []