railsmdb 1.0.0.alpha1
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 +7 -0
- checksums.yaml.gz.sig +0 -0
- data/LICENSE +20 -0
- data/README.md +117 -0
- data/Rakefile +65 -0
- data/lib/railsmdb/cli.rb +16 -0
- data/lib/railsmdb/commands/dbconsole/dbconsole_command.rb +65 -0
- data/lib/railsmdb/commands/setup/setup_command.rb +20 -0
- data/lib/railsmdb/commands.rb +5 -0
- data/lib/railsmdb/crypt_shared/catalog.rb +123 -0
- data/lib/railsmdb/crypt_shared/listing.rb +71 -0
- data/lib/railsmdb/downloader.rb +55 -0
- data/lib/railsmdb/ext/rails/command/behavior.rb +55 -0
- data/lib/railsmdb/ext/rails/command.rb +21 -0
- data/lib/railsmdb/ext/rails/generators/rails/app/app_generator.rb +48 -0
- data/lib/railsmdb/ext/rails/generators.rb +21 -0
- data/lib/railsmdb/extractor.rb +94 -0
- data/lib/railsmdb/generators/mongoid/model/model_generator.rb +41 -0
- data/lib/railsmdb/generators/mongoid/model/templates/model.rb.tt +19 -0
- data/lib/railsmdb/generators/setup/concerns/setuppable.rb +545 -0
- data/lib/railsmdb/generators/setup/setup_generator.rb +123 -0
- data/lib/railsmdb/generators/setup/templates/README.md.tt +3 -0
- data/lib/railsmdb/generators/setup/templates/_bin/railsmdb.tt +3 -0
- data/lib/railsmdb/generators/setup/templates/_config/initializers/mongoid.rb.tt +26 -0
- data/lib/railsmdb/prioritizable.rb +97 -0
- data/lib/railsmdb/version.rb +12 -0
- data.tar.gz.sig +4 -0
- metadata +182 -0
- metadata.gz.sig +0 -0
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'railsmdb/generators/setup/concerns/setuppable'
|
4
|
+
|
5
|
+
module Rails
|
6
|
+
module Generators
|
7
|
+
# Monkeypatch the Rails AppGenerator class to make it emit a Mongoid-friendly
|
8
|
+
# application.
|
9
|
+
#
|
10
|
+
# @api private
|
11
|
+
class AppGenerator
|
12
|
+
include Railsmdb::Generators::Setup::Concerns::Setuppable
|
13
|
+
|
14
|
+
# change the --skip-active-record option to default to true. Users
|
15
|
+
# may pass --no-skip-active-record to enable it again, if they want
|
16
|
+
# to use both Mongoid and ActiveRecord.
|
17
|
+
class_option :skip_active_record, type: :boolean,
|
18
|
+
aliases: '-O',
|
19
|
+
default: true,
|
20
|
+
desc: 'Skip Active Record files'
|
21
|
+
|
22
|
+
prioritize :save_initial_path, :before, :create_root
|
23
|
+
prioritize :confirm_legal_shenanigans, :before, :create_root
|
24
|
+
prioritize :fetch_crypt_shared, :after, :create_root
|
25
|
+
prioritize :add_mongoid_gem_entries, :before, :run_bundle
|
26
|
+
|
27
|
+
public_task :save_initial_path
|
28
|
+
public_task :confirm_legal_shenanigans
|
29
|
+
public_task :fetch_crypt_shared
|
30
|
+
public_task :add_mongoid_gem_entries
|
31
|
+
public_task :mongoid_yml
|
32
|
+
public_task :add_mongodb_local_master_key_to_credentials
|
33
|
+
public_task :add_encryption_options_to_mongoid_yml
|
34
|
+
public_task :mongoid_initializer
|
35
|
+
public_task :railsmdb
|
36
|
+
|
37
|
+
# OVERRIDES
|
38
|
+
# The following methods override the existing methods on AppGenerator,
|
39
|
+
# to replace the default behavior with Mongoid-specific behavior.
|
40
|
+
|
41
|
+
# Overridden to ignore the "skip_active_record" guard. We always want the
|
42
|
+
# db folder, even when active record is being skipped.
|
43
|
+
def create_db_files
|
44
|
+
build(:db)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails/generators'
|
4
|
+
require 'railsmdb/ext/rails/command/behavior'
|
5
|
+
|
6
|
+
module Rails
|
7
|
+
module Generators # :nodoc:
|
8
|
+
class << self
|
9
|
+
private
|
10
|
+
|
11
|
+
# Prepends the railsmdb generators lookup path to the existing rails
|
12
|
+
# lookup paths.
|
13
|
+
def railsmdb_lookup_paths
|
14
|
+
@railsmdb_lookup_paths ||= [ 'railsmdb/generators', *rails_lookup_paths ]
|
15
|
+
end
|
16
|
+
|
17
|
+
alias rails_lookup_paths lookup_paths
|
18
|
+
alias lookup_paths railsmdb_lookup_paths
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'minitar'
|
4
|
+
require 'zlib'
|
5
|
+
require 'zip'
|
6
|
+
|
7
|
+
module Railsmdb
|
8
|
+
# A utility class for extracting a specific file from a given archive.
|
9
|
+
# Currently only supports .tgz, .tar.gz, and .zip archives.
|
10
|
+
class Extractor
|
11
|
+
# Returns the appropriate extractor class for the given archive path.
|
12
|
+
#
|
13
|
+
# @param [ String ] archive_path the path to the archive file
|
14
|
+
#
|
15
|
+
# @return [ ZipExtractor | TarGzipExtractor ] the extractor instance
|
16
|
+
# corresponding to the given archive.
|
17
|
+
def self.for(archive_path)
|
18
|
+
case archive_path
|
19
|
+
when /\.(tgz|tar\.gz)$/ then TarGzipExtractor.new(archive_path)
|
20
|
+
when /\.zip$/ then ZipExtractor.new(archive_path)
|
21
|
+
else raise ArgumentError, "don't know how to extract #{archive_path}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# The path to the archive.
|
26
|
+
attr_reader :archive_path
|
27
|
+
|
28
|
+
# Instantiates a new extractor with the given archive path.
|
29
|
+
#
|
30
|
+
# @param [ String ] archive_path the path to the archive.
|
31
|
+
def initialize(archive_path)
|
32
|
+
@archive_path = archive_path
|
33
|
+
end
|
34
|
+
|
35
|
+
# Extract the first file that matches the given pattern from the
|
36
|
+
# archive.
|
37
|
+
#
|
38
|
+
# @param [ Regexp ] pattern the pattern to use for finding the file
|
39
|
+
#
|
40
|
+
# @yield [ String, String ] report the name and contents of the first
|
41
|
+
# matching file. It will never yield more than once.
|
42
|
+
#
|
43
|
+
# @return [ String | nil ] returns the name of the matching file, or
|
44
|
+
# nil if no file matched.
|
45
|
+
#
|
46
|
+
# @raise [ NotImplementedError ] subclasses must override this method.
|
47
|
+
def extract(pattern)
|
48
|
+
raise NotImplementedError
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# An extractor subclass for dealing with .zip files.
|
53
|
+
#
|
54
|
+
# @api private
|
55
|
+
class ZipExtractor < Extractor
|
56
|
+
# See Extractor#extract for documentation.
|
57
|
+
def extract(pattern)
|
58
|
+
Zip::File.open(archive_path).each do |entry|
|
59
|
+
if entry.name.match?(pattern)
|
60
|
+
yield entry.name, entry.get_input_stream.read.force_encoding('BINARY')
|
61
|
+
return entry.name
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
nil
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# An extractor subclass for dealing with .tgz/.tar.gz files.
|
70
|
+
#
|
71
|
+
# @api private
|
72
|
+
class TarGzipExtractor < Extractor
|
73
|
+
# See Extractor#extract for documentation.
|
74
|
+
def extract(pattern)
|
75
|
+
reader.each_entry do |entry|
|
76
|
+
if entry.name.match?(pattern)
|
77
|
+
yield entry.name, entry.read.force_encoding('BINARY')
|
78
|
+
return entry.name
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
nil
|
83
|
+
end
|
84
|
+
|
85
|
+
# Returns a reader able to iterate over all the entries in the
|
86
|
+
# archive.
|
87
|
+
def reader
|
88
|
+
@reader ||= begin
|
89
|
+
gzip = Zlib::GzipReader.new(File.open(archive_path, 'rb'))
|
90
|
+
Minitar::Reader.new(gzip)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails/generators/named_base'
|
4
|
+
|
5
|
+
module Mongoid
|
6
|
+
module Generators
|
7
|
+
# Generator implementation for creating a new model.
|
8
|
+
class ModelGenerator < Rails::Generators::NamedBase
|
9
|
+
desc 'Creates a Mongoid model'
|
10
|
+
argument :attributes, type: :array, default: [], banner: 'field:type field:type'
|
11
|
+
|
12
|
+
check_class_collision
|
13
|
+
|
14
|
+
def self.base_root
|
15
|
+
File.expand_path('../..', __dir__)
|
16
|
+
end
|
17
|
+
|
18
|
+
class_option :timestamps, type: :boolean, default: true
|
19
|
+
class_option :parent, type: :string, desc: 'The parent class for the generated model'
|
20
|
+
class_option :collection, type: :string, desc: 'The collection for storing model\'s documents'
|
21
|
+
|
22
|
+
# Task for creating a new model file
|
23
|
+
def create_model_file
|
24
|
+
template 'model.rb.tt', File.join('app/models', class_path, "#{file_name}.rb")
|
25
|
+
end
|
26
|
+
|
27
|
+
hook_for :test_framework
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def type_class_for(attribute)
|
32
|
+
case attribute.type
|
33
|
+
when :datetime then 'Time'
|
34
|
+
when :text then 'String'
|
35
|
+
when :boolean then 'Mongoid::Boolean'
|
36
|
+
else attribute.type.to_s.classify
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<% module_namespacing do -%>
|
2
|
+
class <%= class_name %><%= " < #{options[:parent].classify}" if options[:parent] %>
|
3
|
+
<% unless options[:parent] -%>
|
4
|
+
include Mongoid::Document
|
5
|
+
<% end -%>
|
6
|
+
<% if options[:timestamps] -%>
|
7
|
+
include Mongoid::Timestamps
|
8
|
+
<% end -%>
|
9
|
+
<% if options[:collection] -%>
|
10
|
+
store_in collection: '<%= options[:collection] %>'
|
11
|
+
<% end -%>
|
12
|
+
<% attributes.reject(&:reference?).each do |attribute| -%>
|
13
|
+
field :<%= attribute.name %>, type: <%= type_class_for(attribute) %>
|
14
|
+
<% end -%>
|
15
|
+
<% attributes.select(&:reference?).each do |attribute| -%>
|
16
|
+
belongs_to :<%= attribute.name %>
|
17
|
+
<% end -%>
|
18
|
+
end
|
19
|
+
<% end -%>
|