pointrb 0.0.1 → 0.1.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.
- data/.gitignore +16 -0
- data/.rspec +1 -0
- data/.ruby-version +1 -0
- data/Gemfile +2 -1
- data/Gemfile.lock +40 -26
- data/README.md +1 -86
- data/Rakefile +5 -0
- data/TODO.md +35 -1
- data/bin/pointrb +35 -0
- data/cucumber.yml +3 -0
- data/features/create_layout.feature +96 -0
- data/features/create_new_project.feature +29 -0
- data/features/pointrb_setup.feature +22 -0
- data/features/step_definitions.rb +96 -0
- data/features/support/env.rb +26 -0
- data/features/support/helper.rb +62 -0
- data/features/test.feature +0 -0
- data/gemfiles/Gemfile.default +2 -1
- data/lib/bob_the_helper/command/command_result.rb +12 -0
- data/lib/bob_the_helper/command.rb +49 -0
- data/lib/bob_the_helper/environment.rb +27 -0
- data/lib/bob_the_helper/file_system/exceptions.rb +11 -0
- data/lib/bob_the_helper/file_system.rb +245 -0
- data/lib/bob_the_helper.rb +5 -0
- data/lib/pointrb/actions/check_if_pointrb_has_already_been_initialized.rb +15 -0
- data/lib/pointrb/actions/check_project_path.rb +15 -0
- data/lib/pointrb/actions/create_layout.rb +16 -0
- data/lib/pointrb/actions/create_project_wrapper.rb +15 -0
- data/lib/pointrb/actions/determine_layout_directory.rb +14 -0
- data/lib/pointrb/actions/error_handler_commandline.rb +39 -0
- data/lib/pointrb/actions/initialize_pointrb.rb +15 -0
- data/lib/pointrb/actions/retrieve_layout_files.rb +16 -0
- data/lib/pointrb/actions/retrieve_parsed_layout.rb +17 -0
- data/lib/pointrb/actions/set_project_name.rb +15 -0
- data/lib/pointrb/actions/show_pointrb_version.rb +14 -0
- data/lib/pointrb/api.rb +36 -0
- data/lib/pointrb/directory.rb +25 -0
- data/lib/pointrb/exceptions.rb +22 -0
- data/lib/pointrb/layout.rb +16 -0
- data/lib/pointrb/layout_constructor.rb +58 -0
- data/lib/pointrb/layout_file.rb +24 -0
- data/lib/pointrb/layout_manager.rb +32 -0
- data/lib/pointrb/layout_storage_manager.rb +40 -0
- data/lib/pointrb/layout_tree.rb +45 -0
- data/lib/pointrb/pointrb_file.rb +33 -0
- data/lib/pointrb/project.rb +11 -0
- data/lib/pointrb/version.rb +1 -1
- data/lib/pointrb.rb +32 -0
- data/pointrb.gemspec +3 -2
- data/script/terminal +1 -0
- data/spec/bob_the_helper/command/command_spec.rb +55 -0
- data/spec/bob_the_helper/environment/environment_spec.rb +15 -0
- data/spec/bob_the_helper/file_system/file_system_spec.rb +279 -0
- data/spec/directory/directory_spec.rb +30 -0
- data/spec/hooks.rb +5 -0
- data/spec/layout/layout_spec.rb +20 -0
- data/spec/layout_constructor/layout_constructor_spec.rb +122 -0
- data/spec/layout_file/layout_file_spec.rb +49 -0
- data/spec/layout_manager/layout_manager_spec.rb +47 -0
- data/spec/layout_storage_manager/layout_storage_manager_spec.rb +58 -0
- data/spec/layout_tree/layout_tree_spec.rb +70 -0
- data/spec/pointrb_file/pointrb_file_spec.rb +34 -0
- data/spec/project/project_spec.rb +19 -0
- data/spec/spec_helper.rb +9 -13
- data/spec/support/capture.rb +19 -0
- data/spec/support/env.rb +0 -0
- data/spec/support/helper.rb +8 -0
- data/spec/support/hooks.rb +5 -0
- metadata +104 -5
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module PointRb
|
3
|
+
|
4
|
+
class Directory
|
5
|
+
|
6
|
+
attr_accessor :path, :base_dir
|
7
|
+
|
8
|
+
def initialize(path,base_dir="")
|
9
|
+
@path = path
|
10
|
+
@base_dir = base_dir
|
11
|
+
end
|
12
|
+
|
13
|
+
def full_path
|
14
|
+
if @path =~ /^\//
|
15
|
+
@path
|
16
|
+
else
|
17
|
+
File.join(@base_dir, @path)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def create
|
22
|
+
FileUtils.mkdir_p full_path
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
module PointRb
|
3
|
+
module Exceptions
|
4
|
+
# Raised if file does not exist
|
5
|
+
class FileNotFound < Exception; end
|
6
|
+
|
7
|
+
# Raised if requested layout was not
|
8
|
+
# available
|
9
|
+
class LayoutNotFound < Exception; end
|
10
|
+
|
11
|
+
# Raised if one has a layout with an
|
12
|
+
# invalid syntax
|
13
|
+
class SyntaxErrorInLayout < Exception; end
|
14
|
+
|
15
|
+
# Raised if project path exists
|
16
|
+
class ProjectPathExists < Exception; end
|
17
|
+
|
18
|
+
# Raised if one tries to initialize a system
|
19
|
+
# which has already been initialized
|
20
|
+
class Exceptions::PointRbWasAlreadInitialized < Exception; end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module PointRb
|
3
|
+
class LayoutConstructor
|
4
|
+
|
5
|
+
def initialize(project)
|
6
|
+
@project = project
|
7
|
+
@layout = Layout.new
|
8
|
+
|
9
|
+
#this is the root directory and will be used by all other
|
10
|
+
#child nodes
|
11
|
+
root_node = Directory.new(@project.path)
|
12
|
+
@tree = LayoutTree.new(root_node)
|
13
|
+
end
|
14
|
+
|
15
|
+
def parse_dsl(content, path)
|
16
|
+
|
17
|
+
begin
|
18
|
+
instance_eval(content, path)
|
19
|
+
rescue Exception => e
|
20
|
+
file, line_number = filter_file_and_line_number(e.backtrace.first)
|
21
|
+
raise Exceptions::SyntaxErrorInLayout, "Syntax error in layout-file \"#{file}\" at line #{line_number}."
|
22
|
+
end
|
23
|
+
|
24
|
+
@layout.actions = @tree.serialize do |node|
|
25
|
+
#set base_dir based on parent directory
|
26
|
+
node.content.base_dir = node.parent.content.full_path if node.parent
|
27
|
+
#return the Directory-object
|
28
|
+
node.content
|
29
|
+
end
|
30
|
+
|
31
|
+
@layout
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def filter_file_and_line_number(backtrace)
|
37
|
+
backtrace.split(':')[0..1]
|
38
|
+
end
|
39
|
+
|
40
|
+
def layout(name, &block)
|
41
|
+
@layout.name = name.to_sym
|
42
|
+
|
43
|
+
block.call
|
44
|
+
end
|
45
|
+
|
46
|
+
def directory(path, &block)
|
47
|
+
@tree.add_node Directory.new(path)
|
48
|
+
block.call if block
|
49
|
+
@tree.up
|
50
|
+
end
|
51
|
+
|
52
|
+
def file(path, &block)
|
53
|
+
content = block.call.to_s
|
54
|
+
@tree.add_node PointRbFile.new(path, content)
|
55
|
+
@tree.up
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
module PointRb
|
3
|
+
# layouts
|
4
|
+
class LayoutFile
|
5
|
+
|
6
|
+
include Comparable
|
7
|
+
|
8
|
+
attr_reader :path
|
9
|
+
|
10
|
+
def initialize(path)
|
11
|
+
raise Exceptions::FileNotFound, "You tell me to use '#{path}' as path to the layout. But this file does not exist." unless File.exists? path
|
12
|
+
|
13
|
+
@path = path
|
14
|
+
end
|
15
|
+
|
16
|
+
def content
|
17
|
+
File.read(@path)
|
18
|
+
end
|
19
|
+
|
20
|
+
def <=>(other)
|
21
|
+
self.path <=> other.path
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module PointRb
|
3
|
+
class LayoutManager
|
4
|
+
|
5
|
+
def initialize(layout_files, project)
|
6
|
+
@layout_files = layout_files
|
7
|
+
@project = project
|
8
|
+
|
9
|
+
@layout_contructor = LayoutConstructor.new(project)
|
10
|
+
@layouts = @layout_files.collect { |f| construct_layout(f.content, f.path) }
|
11
|
+
end
|
12
|
+
|
13
|
+
def retrieve(name)
|
14
|
+
result_of_search = @layouts.find { |l| l.name == name }
|
15
|
+
|
16
|
+
raise Exceptions::LayoutNotFound, "Sorry I'm not able to find the requested layout file (#{name}). Please make sure it's avaiable at the layout directory." unless result_of_search
|
17
|
+
|
18
|
+
result_of_search
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def construct_layout(content, path)
|
24
|
+
@layout_contructor.parse_dsl(content, path)
|
25
|
+
end
|
26
|
+
|
27
|
+
#def retrieve_all
|
28
|
+
# @layouts
|
29
|
+
#end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module PointRb
|
3
|
+
class LayoutStorageManager
|
4
|
+
private
|
5
|
+
|
6
|
+
include BobTheHelper::FileSystem
|
7
|
+
|
8
|
+
public
|
9
|
+
|
10
|
+
def initialize(layout_directory, layout_file=LayoutFile)
|
11
|
+
@layout_directory = layout_directory
|
12
|
+
@layout_file_klass = layout_file
|
13
|
+
@layout_files = retrieve_layout_files('*.layout')
|
14
|
+
end
|
15
|
+
|
16
|
+
def retrieve(path)
|
17
|
+
@layout_files.find { |l| l.path == path}
|
18
|
+
end
|
19
|
+
|
20
|
+
def retrieve_all
|
21
|
+
@layout_files
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def retrieve_layout_files(filter)
|
27
|
+
pattern = File.join(working_directory, "#{filter}")
|
28
|
+
layout_files = Dir.glob(pattern)
|
29
|
+
layout_files.collect { |f| @layout_file_klass.new(f) }
|
30
|
+
end
|
31
|
+
|
32
|
+
def root_directory
|
33
|
+
@layout_directory
|
34
|
+
end
|
35
|
+
|
36
|
+
def working_directory
|
37
|
+
root_directory
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
module PointRb
|
3
|
+
class LayoutTree
|
4
|
+
|
5
|
+
attr_reader :tree, :active_node
|
6
|
+
|
7
|
+
def initialize(root_node)
|
8
|
+
@counter = -1
|
9
|
+
@tree = Tree::TreeNode.new(node_id, root_node)
|
10
|
+
@active_node = @tree
|
11
|
+
@prng = Random.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def add_node(node)
|
15
|
+
node = Tree::TreeNode.new(node_id, node)
|
16
|
+
@active_node << node
|
17
|
+
@active_node = node
|
18
|
+
end
|
19
|
+
|
20
|
+
def up
|
21
|
+
@active_node = @active_node.parent
|
22
|
+
end
|
23
|
+
|
24
|
+
def serialize(&block)
|
25
|
+
serialized_tree = []
|
26
|
+
|
27
|
+
#default action during serialize
|
28
|
+
block = lambda { |node| node.content } unless block
|
29
|
+
@tree.each do |node|
|
30
|
+
serialized_tree << block.call(node)
|
31
|
+
end
|
32
|
+
|
33
|
+
serialized_tree
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def node_id
|
39
|
+
@counter += 1
|
40
|
+
|
41
|
+
"node#{@counter}"
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
module PointRb
|
3
|
+
class PointRbFile
|
4
|
+
|
5
|
+
attr_accessor :path, :base_dir, :content
|
6
|
+
|
7
|
+
def initialize(path, content)
|
8
|
+
@path = path
|
9
|
+
@base_dir = ''
|
10
|
+
@content = canonize_string(content)
|
11
|
+
end
|
12
|
+
|
13
|
+
def full_path
|
14
|
+
if @path =~ /^\//
|
15
|
+
@path
|
16
|
+
else
|
17
|
+
File.join(@base_dir, @path)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def create
|
22
|
+
File.open(full_path, "wb") do |f|
|
23
|
+
f.write content
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def canonize_string(str)
|
30
|
+
str.strip_heredoc.gsub(/^\n/, '')
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/pointrb/version.rb
CHANGED
data/lib/pointrb.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'tree'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'active_support/core_ext/string/strip'
|
4
|
+
require 'middleware'
|
5
|
+
|
6
|
+
require 'bob_the_helper'
|
7
|
+
|
8
|
+
require 'pointrb/version'
|
9
|
+
require 'pointrb/exceptions'
|
10
|
+
require 'pointrb/project'
|
11
|
+
require 'pointrb/directory'
|
12
|
+
require 'pointrb/pointrb_file'
|
13
|
+
require 'pointrb/layout_tree'
|
14
|
+
require 'pointrb/layout'
|
15
|
+
require 'pointrb/layout_file'
|
16
|
+
require 'pointrb/layout_storage_manager'
|
17
|
+
require 'pointrb/layout_constructor'
|
18
|
+
require 'pointrb/layout_manager'
|
19
|
+
|
20
|
+
require 'pointrb/actions/error_handler_commandline'
|
21
|
+
require 'pointrb/actions/create_project_wrapper'
|
22
|
+
require 'pointrb/actions/check_project_path'
|
23
|
+
require 'pointrb/actions/determine_layout_directory'
|
24
|
+
require 'pointrb/actions/retrieve_layout_files'
|
25
|
+
require 'pointrb/actions/retrieve_parsed_layout'
|
26
|
+
require 'pointrb/actions/create_layout'
|
27
|
+
require 'pointrb/actions/check_if_pointrb_has_already_been_initialized'
|
28
|
+
require 'pointrb/actions/initialize_pointrb'
|
29
|
+
require 'pointrb/actions/show_pointrb_version'
|
30
|
+
require 'pointrb/api'
|
31
|
+
|
32
|
+
module PointRb; end
|
data/pointrb.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |gem|
|
|
8
8
|
gem.version = PointRb::VERSION
|
9
9
|
gem.authors = ["Max Meyer"]
|
10
10
|
gem.email = ["dev@fedux.org"]
|
11
|
-
gem.description = %q{Initialize project
|
11
|
+
gem.description = %q{Initialize project directory base on templates}
|
12
12
|
gem.summary = <<-EOF
|
13
13
|
PointRb is a project initializer which helps you to create a directory structure
|
14
14
|
for your project. It supports profiles so that you can use different layouts for
|
@@ -21,6 +21,7 @@ Gem::Specification.new do |gem|
|
|
21
21
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
22
22
|
gem.require_paths = ["lib"]
|
23
23
|
|
24
|
-
gem.add_runtime_dependency '
|
24
|
+
gem.add_runtime_dependency 'activesupport'
|
25
25
|
gem.add_runtime_dependency 'middleware'
|
26
|
+
gem.add_runtime_dependency 'rubytree'
|
26
27
|
end
|
data/script/terminal
CHANGED
@@ -9,4 +9,5 @@ tmux.new_session(session_name: 'pointrb')
|
|
9
9
|
tmux.new_window(:name => 'code', :command => "zsh -c 'vim -p lib/**/*.rb'")
|
10
10
|
tmux.new_window(:name => 'spec', :command => "zsh -c 'vim -p spec/**/*.rb'")
|
11
11
|
tmux.new_window(:name => 'features', :command => "zsh -c 'vim -p features/**/*.{rb,feature}'")
|
12
|
+
tmux.new_window(:name => 'doc', :command => "zsh -c 'vim -p *.md'")
|
12
13
|
tmux.start
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe BobTheHelper::Command do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
cleanup_working_directory
|
7
|
+
end
|
8
|
+
|
9
|
+
it "runs commands" do
|
10
|
+
stdout = 'hello world'
|
11
|
+
command = "echo #{stdout}"
|
12
|
+
search_path = [ '/usr/bin' ]
|
13
|
+
result = run_command(command, search_path: search_path)
|
14
|
+
|
15
|
+
expect(result.stdout).to eq(stdout + "\n")
|
16
|
+
end
|
17
|
+
|
18
|
+
it "runs commands with default <root>/bin" do
|
19
|
+
end
|
20
|
+
|
21
|
+
it "takes input and run commands" do
|
22
|
+
stdin = 'hello world'
|
23
|
+
command = 'cat'
|
24
|
+
search_path = [ '/usr/bin' ]
|
25
|
+
result = run_command(command, stdin: stdin, search_path: search_path)
|
26
|
+
|
27
|
+
expect(result.stdout).to eq(stdin)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "makes use of ENV" do
|
31
|
+
env = { 'THIS_IS_A_LONG_VARIABLE' => 'hello_world' }
|
32
|
+
env_output = "THIS_IS_A_LONG_VARIABLE=hello_world\n"
|
33
|
+
search_path = [ '/usr/bin' ]
|
34
|
+
command = 'env | grep THIS_IS'
|
35
|
+
|
36
|
+
result = run_command(command, env: env, search_path: search_path)
|
37
|
+
expect(result.stdout).to eq(env_output)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "checks if a directory/file exists" do
|
41
|
+
file = 'blub123.txt'
|
42
|
+
|
43
|
+
switch_to_working_directory do
|
44
|
+
File.open(file, "wb") do |f|
|
45
|
+
f.write ''
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
result = path_exists? file
|
50
|
+
expect(result).to eq(true)
|
51
|
+
|
52
|
+
result = path_exists? 'asfdasdfsadf.txt'
|
53
|
+
expect(result).to eq(false)
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe BobTheHelper::Environment do
|
4
|
+
|
5
|
+
it "let you modify the environment of a process" do
|
6
|
+
env = { 'THIS_IS_A_LONG_VARIABLE' => 'hello_world' }
|
7
|
+
|
8
|
+
env_modified = {}
|
9
|
+
isolated_environment env do
|
10
|
+
env_modified = ENV.to_hash
|
11
|
+
end
|
12
|
+
|
13
|
+
expect( env_modified['THIS_IS_A_LONG_VARIABLE'] ).to eq(env['THIS_IS_A_LONG_VARIABLE'] )
|
14
|
+
end
|
15
|
+
end
|