nrb 1.0.0 → 1.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.
- checksums.yaml +4 -4
- data/.codeclimate.yml +16 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +1100 -0
- data/.travis.yml +1 -1
- data/Guardfile +12 -0
- data/README.md +96 -6
- data/Rakefile +1 -1
- data/lib/nrb.rb +16 -5
- data/lib/nrb/cli.rb +5 -5
- data/lib/nrb/commands/all.rb +11 -0
- data/lib/nrb/commands/base/base.rb +30 -0
- data/lib/nrb/commands/base/inside.rb +19 -0
- data/lib/nrb/commands/base/resource.rb +23 -0
- data/lib/nrb/commands/concerns/resource_generator.rb +30 -0
- data/lib/nrb/commands/console.rb +8 -6
- data/lib/nrb/commands/destroy.rb +9 -32
- data/lib/nrb/commands/generate.rb +11 -33
- data/lib/nrb/commands/script.rb +47 -29
- data/lib/nrb/commands/starter.rb +2 -4
- data/lib/nrb/errors.rb +4 -0
- data/lib/nrb/templates/Gemfile.tt +1 -3
- data/lib/nrb/templates/config/boot.rb.tt +4 -4
- data/lib/nrb/templates/config/nrb.rb.tt +2 -2
- data/lib/nrb/templates/script.rb.tt +0 -2
- data/lib/nrb/version.rb +1 -1
- data/nrb.gemspec +9 -4
- metadata +107 -28
- data/lib/nrb/commands/inside_group.rb +0 -40
data/.travis.yml
CHANGED
data/Guardfile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
guard :minitest do
|
2
|
+
ignore(%r{^test/(fixtures|coverage)})
|
3
|
+
|
4
|
+
watch(%r(^test/(.*)\/?(.*)_test\.rb$))
|
5
|
+
watch(%r(^lib/(.*/)?([^/]+)\.rb$)) { |m| "test/#{m[1]}#{m[2]}_test.rb" }
|
6
|
+
watch(%r(^test/test_helper\.rb$)) { 'test' }
|
7
|
+
end
|
8
|
+
|
9
|
+
guard :rubocop do
|
10
|
+
watch(%r{.+\.rb$})
|
11
|
+
watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
|
12
|
+
end
|
data/README.md
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
-
# Ninja Ruby -
|
1
|
+
# Ninja Ruby - `nrb` [](https://badge.fury.io/rb/nrb)
|
2
2
|
|
3
|
-
|
3
|
+
[](https://travis-ci.org/shuriu/nrb) [](https://coveralls.io/github/shuriu/nrb?branch=master) [](https://codeclimate.com/github/shuriu/nrb) [](https://gemnasium.com/shuriu/nrb)
|
4
|
+
|
5
|
+
Ninja Ruby scripts with easy persistence for your experimenting needs.
|
4
6
|
|
5
7
|
# Idea
|
6
8
|
|
@@ -40,15 +42,103 @@ Or you could just use `$ nrb new <idea-name>` and not worry about anything!
|
|
40
42
|
|
41
43
|
## Usage
|
42
44
|
|
43
|
-
|
44
|
-
|
45
|
-
|
45
|
+
```sh
|
46
|
+
$ nrb help
|
47
|
+
Commands:
|
48
|
+
nrb [c]onsole # Jump into a Pry console with your project loaded. NOTE: Available inside a NinjaRuby project
|
49
|
+
nrb [d]estroy <resource> <name> # Destroy a generated resource. NOTE: Available inside a NinjaRuby project
|
50
|
+
nrb [g]enerate <resource> <name> # Generate a resource (models, services). NOTE: Available inside a NinjaRuby project
|
51
|
+
nrb [s]tart # Require the main file. NOTE: Available inside a NinjaRuby project
|
52
|
+
nrb help [COMMAND] # Describe available commands or one specific command
|
53
|
+
nrb new <name-or-path> [OPTIONS] # Creates a Ninja Ruby Script at the given path
|
54
|
+
```
|
55
|
+
|
56
|
+
Create an app and some resources:
|
57
|
+
|
58
|
+
```sh
|
59
|
+
$ nrb help new
|
60
|
+
Usage:
|
61
|
+
nrb new <name-or-path> [OPTIONS]
|
62
|
+
|
63
|
+
Options:
|
64
|
+
-r, [--init-repo], [--no-init-repo] # Initialize a repository at the target location
|
65
|
+
# Default: true
|
66
|
+
-b, [--bundle-install], [--no-bundle-install] # Run bundle install after generating the skeleton
|
67
|
+
# Default: true
|
68
|
+
Creates a Ninja Ruby Script at the given path
|
69
|
+
|
70
|
+
$ nrb new user_importer
|
71
|
+
create user_importer/.gitignore
|
72
|
+
create user_importer/README.md
|
73
|
+
create user_importer/Gemfile
|
74
|
+
create user_importer/Rakefile
|
75
|
+
create user_importer/config/nrb.rb
|
76
|
+
create user_importer/models/.keep
|
77
|
+
create user_importer/services/.keep
|
78
|
+
create user_importer/config/boot.rb
|
79
|
+
create user_importer/db/config.yml
|
80
|
+
create user_importer/user_importer.rb
|
81
|
+
$ cd user_importer
|
82
|
+
|
83
|
+
$ rake db:create
|
84
|
+
|
85
|
+
$ nrb g model user first_name last_name email
|
86
|
+
create models/user.rb
|
87
|
+
run rake db:new_migration name=create_users options='first_name last_name email' from "."
|
88
|
+
create db/migrate/20160309074029_create_users.rb
|
89
|
+
|
90
|
+
$ rake db:migrate
|
91
|
+
|
92
|
+
$ nrb console
|
93
|
+
|
94
|
+
[1] pry(main)> User.create(first_name: 'Gandalf', last_name: 'The Grey', email: 'gandalf@example.com')
|
95
|
+
D, [2016-03-09T09:44:12.434679 #21739] DEBUG -- : (0.1ms) begin transaction
|
96
|
+
D, [2016-03-09T09:44:12.440635 #21739] DEBUG -- : SQL (0.5ms) INSERT INTO "users" ("first_name", "last_name", "email") VALUES (?, ?, ?) [["first_name", "Gandalf"], ["last_name", "The Grey"], ["email", "gandalf@example.com"]]
|
97
|
+
D, [2016-03-09T09:44:12.444638 #21739] DEBUG -- : (3.6ms) commit transaction
|
98
|
+
=> #<User:0x005582ec4153d8 id: 1, first_name: "Gandalf", last_name: "The Grey", email: "gandalf@example.com">
|
99
|
+
|
100
|
+
[2] pry(main)> User.all
|
101
|
+
D, [2016-03-09T09:45:11.252371 #21739] DEBUG -- : User Load (0.2ms) SELECT "users".* FROM "users"
|
102
|
+
=> [#<User:0x005582ed31c3e0 id: 1, first_name: "Gandalf", last_name: "The Grey", email: "gandalf@example.com">]
|
103
|
+
|
104
|
+
```
|
105
|
+
|
106
|
+
## Configuration
|
107
|
+
|
108
|
+
To add custom configurations or change existing ones, you can modify `config/nrb.rb`:
|
109
|
+
|
110
|
+
```ruby
|
111
|
+
Nrb.configure do |config|
|
112
|
+
# Root of the script folder
|
113
|
+
config.root = File.expand_path('..', __dir__)
|
114
|
+
|
115
|
+
# Default resources to autoload
|
116
|
+
# config.resources = %w(models services)
|
117
|
+
end
|
118
|
+
```
|
119
|
+
|
120
|
+
To configure the default sqlite db, you can update `db/config.yml`:
|
121
|
+
|
122
|
+
```yaml
|
123
|
+
development:
|
124
|
+
adapter: sqlite3
|
125
|
+
pool: 5
|
126
|
+
timeout: 5000
|
127
|
+
database: db/new_script.sqlite3
|
128
|
+
```
|
129
|
+
|
130
|
+
## Roadmap
|
131
|
+
|
132
|
+
- [x] Tests
|
133
|
+
- [ ] Support for custom bundler groups
|
134
|
+
- [ ] Ability to change the persistence adapter
|
135
|
+
- [ ] Ability to skip persistence altogether
|
46
136
|
|
47
137
|
## Development
|
48
138
|
|
49
139
|
Run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
50
140
|
|
51
|
-
To install this gem onto your local machine, run `bundle exec rake install`.
|
141
|
+
To install this gem onto your local machine, run `bundle exec rake install`.
|
52
142
|
|
53
143
|
## Contributing
|
54
144
|
|
data/Rakefile
CHANGED
data/lib/nrb.rb
CHANGED
@@ -4,10 +4,16 @@ require 'binding_of_caller'
|
|
4
4
|
require 'pry-byebug'
|
5
5
|
require 'standalone_migrations'
|
6
6
|
require 'sqlite3'
|
7
|
+
require 'nrb/errors'
|
7
8
|
require 'nrb/version'
|
8
9
|
|
9
10
|
module Nrb
|
10
|
-
class Configuration < OpenStruct
|
11
|
+
class Configuration < OpenStruct
|
12
|
+
def initialize(*args)
|
13
|
+
super
|
14
|
+
self.resources = %w(models services)
|
15
|
+
end
|
16
|
+
end
|
11
17
|
|
12
18
|
class << self
|
13
19
|
def config
|
@@ -27,11 +33,16 @@ module Nrb
|
|
27
33
|
|
28
34
|
!!(File.read(gemfile) =~ /gem\s+['"]nrb['"]/)
|
29
35
|
end
|
30
|
-
end
|
31
|
-
end
|
32
36
|
|
33
|
-
|
34
|
-
|
37
|
+
def silently(verbose: false)
|
38
|
+
yield and return if verbose
|
39
|
+
|
40
|
+
original_stdout = $stdout.clone
|
41
|
+
$stdout.reopen '/dev/null'
|
42
|
+
yield
|
43
|
+
$stdout.reopen original_stdout
|
44
|
+
end
|
45
|
+
end
|
35
46
|
end
|
36
47
|
|
37
48
|
require 'nrb/cli'
|
data/lib/nrb/cli.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
require 'pry'
|
2
2
|
require 'binding_of_caller'
|
3
3
|
require 'thor'
|
4
|
-
require 'nrb/commands/
|
5
|
-
require 'nrb/commands/starter'
|
6
|
-
require 'nrb/commands/console'
|
7
|
-
require 'nrb/commands/generate'
|
8
|
-
require 'nrb/commands/destroy'
|
4
|
+
require 'nrb/commands/all'
|
9
5
|
|
10
6
|
module Nrb
|
11
7
|
class CLI < Thor
|
8
|
+
class_option :verbose, type: :boolean, default: true,
|
9
|
+
desc: 'Verbose mode.',
|
10
|
+
aliases: '-v'
|
11
|
+
|
12
12
|
register Nrb::Commands::Script, 'new', 'new <name-or-path> [OPTIONS]',
|
13
13
|
Nrb::Commands::Script.desc
|
14
14
|
tasks['new'].options = Nrb::Commands::Script.class_options
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'nrb/commands/concerns/resource_generator'
|
2
|
+
|
3
|
+
require 'nrb/commands/base/base'
|
4
|
+
require 'nrb/commands/base/inside'
|
5
|
+
require 'nrb/commands/base/resource'
|
6
|
+
|
7
|
+
require 'nrb/commands/script'
|
8
|
+
require 'nrb/commands/starter'
|
9
|
+
require 'nrb/commands/console'
|
10
|
+
require 'nrb/commands/generate'
|
11
|
+
require 'nrb/commands/destroy'
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Nrb
|
2
|
+
module Commands
|
3
|
+
class Base < Thor::Group
|
4
|
+
include Thor::Actions
|
5
|
+
|
6
|
+
class_option :verbose, type: :boolean, default: true,
|
7
|
+
desc: 'Verbose mode.',
|
8
|
+
aliases: '-v'
|
9
|
+
|
10
|
+
def self.source_root
|
11
|
+
File.expand_path('../..', __dir__)
|
12
|
+
end
|
13
|
+
|
14
|
+
def opts
|
15
|
+
options.to_h.symbolize_keys
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def require_main_file
|
21
|
+
assumed_file_name = "#{Nrb.root.split('/').last}.rb"
|
22
|
+
assumed_file_path = File.join(Nrb.root, assumed_file_name)
|
23
|
+
|
24
|
+
if File.exist?(assumed_file_path)
|
25
|
+
require File.join(Nrb.root, assumed_file_name)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Nrb
|
2
|
+
module Commands
|
3
|
+
class Inside < Commands::Base
|
4
|
+
def ensure_inside_root
|
5
|
+
return true if Nrb.inside?
|
6
|
+
fail_outside_root
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def fail_outside_root
|
12
|
+
command = self.class.to_s.split('::').last
|
13
|
+
|
14
|
+
fail Nrb::OutsideRootError,
|
15
|
+
"You need to be inside a NinjaRuby folder to run the #{command} command."
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Nrb
|
2
|
+
module Commands
|
3
|
+
class Resource < Commands::Inside
|
4
|
+
include ResourceGenerator
|
5
|
+
|
6
|
+
def self.valid_resources
|
7
|
+
arguments.find { |a| a.name == 'resource' }.enum
|
8
|
+
end
|
9
|
+
|
10
|
+
def ensure_valid_resource
|
11
|
+
return true if valid_resources.include? resource
|
12
|
+
fail_invalid_resource
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def fail_invalid_resource
|
18
|
+
fail Nrb::InvalidResourceError,
|
19
|
+
"<resource> must be one of: #{valid_resources.join(', ')}."
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'active_support/concern'
|
2
|
+
|
3
|
+
module Nrb
|
4
|
+
module Commands
|
5
|
+
module ResourceGenerator
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
argument :resource, type: :string, required: true,
|
10
|
+
desc: 'resource type',
|
11
|
+
banner: 'resource',
|
12
|
+
enum: Nrb.config.resources.map(&:singularize)
|
13
|
+
|
14
|
+
argument :name, type: :string, required: true,
|
15
|
+
desc: 'name of the resource',
|
16
|
+
banner: 'name'
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def target(final = nil)
|
22
|
+
File.join(File.expand_path(resource.pluralize), final.to_s)
|
23
|
+
end
|
24
|
+
|
25
|
+
def valid_resources
|
26
|
+
self.class.valid_resources
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/nrb/commands/console.rb
CHANGED
@@ -1,13 +1,15 @@
|
|
1
|
-
require 'nrb/commands/inside_group'
|
2
|
-
|
3
1
|
module Nrb
|
4
2
|
module Commands
|
5
|
-
class Console <
|
6
|
-
|
3
|
+
class Console < Commands::Inside
|
4
|
+
desc 'Jump into a Pry console with your project loaded.'
|
5
|
+
|
6
|
+
class_option :pretend, default: false, type: :boolean,
|
7
|
+
desc: 'Pretend opening the console. Useful for testing.'
|
7
8
|
|
8
9
|
def start
|
9
|
-
require_main_file
|
10
|
-
Pry.start
|
10
|
+
required = require_main_file
|
11
|
+
Pry.start unless options[:pretend]
|
12
|
+
required
|
11
13
|
end
|
12
14
|
end
|
13
15
|
end
|
data/lib/nrb/commands/destroy.rb
CHANGED
@@ -1,41 +1,18 @@
|
|
1
|
-
require 'nrb/commands/
|
1
|
+
require 'nrb/commands/concerns/resource_generator'
|
2
2
|
|
3
3
|
module Nrb
|
4
4
|
module Commands
|
5
|
-
class Destroy <
|
6
|
-
|
5
|
+
class Destroy < Commands::Resource
|
6
|
+
desc 'Destroy a generated resource.'
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
banner: 'RESOURCE',
|
11
|
-
enum: Nrb.config.directories.map(&:singularize)
|
12
|
-
|
13
|
-
|
14
|
-
argument :name, type: :string, required: true,
|
15
|
-
desc: 'name of the resource',
|
16
|
-
banner: 'NAME'
|
17
|
-
|
18
|
-
def valid_resource?
|
19
|
-
valid_resources = Nrb.config.directories.map(&:singularize)
|
20
|
-
return if valid_resources.include? resource
|
21
|
-
say "RESOURCE must be one of: #{valid_resources.join(', ')}."
|
22
|
-
exit
|
8
|
+
def destroy_resource
|
9
|
+
remove_file target("#{name.underscore}.rb"), opts
|
23
10
|
end
|
24
11
|
|
25
|
-
def
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
if resource == 'model'
|
30
|
-
migration_file = Dir["db/migrate/*create_#{name.underscore.pluralize}.rb"].first
|
31
|
-
remove_file migration_file if migration_file
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
private
|
36
|
-
|
37
|
-
def target(final = nil)
|
38
|
-
File.join(File.expand_path(resource.pluralize), final.to_s)
|
12
|
+
def destroy_migration
|
13
|
+
return false unless resource == 'model'
|
14
|
+
migration_file = Dir["db/migrate/*_create_#{name.underscore.pluralize}.rb"].first
|
15
|
+
remove_file(migration_file, opts) if migration_file
|
39
16
|
end
|
40
17
|
end
|
41
18
|
end
|
@@ -1,48 +1,26 @@
|
|
1
|
-
require 'nrb/commands/inside_group'
|
2
|
-
|
3
1
|
module Nrb
|
4
2
|
module Commands
|
5
|
-
class Generate <
|
6
|
-
|
7
|
-
|
8
|
-
argument :resource, type: :string, required: true,
|
9
|
-
desc: 'resource to generate',
|
10
|
-
banner: 'RESOURCE',
|
11
|
-
enum: Nrb.config.directories.map(&:singularize)
|
12
|
-
|
13
|
-
|
14
|
-
argument :name, type: :string, required: true,
|
15
|
-
desc: 'name of the resource',
|
16
|
-
banner: 'NAME'
|
17
|
-
|
18
|
-
def valid_resource?
|
19
|
-
valid_resources = Nrb.config.directories.map(&:singularize)
|
20
|
-
return if valid_resources.include? resource
|
21
|
-
say "RESOURCE must be one of: #{valid_resources.join(', ')}."
|
22
|
-
exit
|
23
|
-
end
|
3
|
+
class Generate < Commands::Resource
|
4
|
+
desc "Generate a resource (#{valid_resources.join(', ')})."
|
24
5
|
|
25
6
|
def generate_resource
|
26
7
|
template "templates/#{resource}.rb.tt", target("#{name.underscore}.rb"),
|
27
|
-
name: name.camelize
|
8
|
+
opts.merge({ name: name.camelize })
|
28
9
|
end
|
29
10
|
|
30
|
-
def
|
31
|
-
return unless resource == 'model'
|
11
|
+
def generate_table
|
12
|
+
return false unless resource == 'model'
|
32
13
|
|
33
14
|
migration_name = "create_#{name.underscore.pluralize}"
|
34
|
-
|
15
|
+
rake_options = args.join(' ')
|
35
16
|
|
36
|
-
inside Nrb.root do
|
37
|
-
|
17
|
+
inside Nrb.root, opts do
|
18
|
+
Nrb.silently(opts) do
|
19
|
+
run "bundle exec rake db:new_migration name=#{migration_name} options='#{rake_options}'",
|
20
|
+
opts
|
21
|
+
end
|
38
22
|
end
|
39
23
|
end
|
40
|
-
|
41
|
-
private
|
42
|
-
|
43
|
-
def target(final = nil)
|
44
|
-
File.join(File.expand_path(resource.pluralize), final.to_s)
|
45
|
-
end
|
46
24
|
end
|
47
25
|
end
|
48
26
|
end
|