This is an automated email from the ASF dual-hosted git repository.
janhoy pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git
The following commit(s) were added to refs/heads/main by this push:
new 10b2e53 Script to scaffold a new contrib module (#519)
10b2e53 is described below
commit 10b2e534fe11a03e16c5f7795b2eb0b030ddaf6e
Author: Jan Høydahl <[email protected]>
AuthorDate: Fri Jan 14 16:05:26 2022 +0100
Script to scaffold a new contrib module (#519)
---
dev-tools/scripts/README.md | 19 ++++
dev-tools/scripts/scaffoldNewModule.py | 165 +++++++++++++++++++++++++++++++++
2 files changed, 184 insertions(+)
diff --git a/dev-tools/scripts/README.md b/dev-tools/scripts/README.md
index 35fe283..76a1736 100644
--- a/dev-tools/scripts/README.md
+++ b/dev-tools/scripts/README.md
@@ -155,6 +155,25 @@ and prints a regular expression that will match all of them
--json Output as json
--token TOKEN Github access token in case you query too often
anonymously
+### scaffoldNewModule.py
+
+Scaffold a new contrib module and include it into the build. It will set up
the folders
+and all for you, so the only thing you need to do is add classes, tests and
test-data.
+
+ usage: scaffoldNewModule.py [-h] name full_name description
+
+ Scaffold new contrib module into solr/contrib/<name>
+
+ positional arguments:
+ name code-name/id, e.g. my-module
+ full_name Readable name, e.g. "My Module"
+ description Short description for docs
+
+ optional arguments:
+ -h, --help show this help message and exit
+
+ Example: ./addContrib.py foo "My Contrib" "Very Useful Contrib module here"
+
### gitignore-gen.sh
TBD
diff --git a/dev-tools/scripts/scaffoldNewModule.py
b/dev-tools/scripts/scaffoldNewModule.py
new file mode 100755
index 0000000..fb37b91
--- /dev/null
+++ b/dev-tools/scripts/scaffoldNewModule.py
@@ -0,0 +1,165 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import os
+import sys
+sys.path.append(os.path.dirname(__file__))
+from scriptutil import *
+
+import argparse
+import re
+from textwrap import dedent
+
+def update_build(file_path, search_re, replace_line):
+ print('adding new module into %s' % file_path)
+ matcher = re.compile(search_re)
+
+ def edit(buffer, match, line):
+ if replace_line in line:
+ return None
+ match = matcher.search(line)
+ if match is not None:
+ buffer.append(replace_line)
+ buffer.append(line)
+ return match is not None
+
+ changed = update_file(file_path, matcher, edit)
+ print('done' if changed else 'uptodate')
+
+
+def read_config():
+ parser = argparse.ArgumentParser(description='Scaffold new contrib module
into solr/contrib/<name>')
+ parser.add_argument("name", help='short-name, e.g. my-module')
+ parser.add_argument("full_name", help='Readable name, e.g. "My Module"')
+ parser.add_argument("description", help='Short description for docs, max one
line')
+ newconf = parser.parse_args()
+ return newconf
+
+
+def get_readme_skel(conrib_name):
+ return dedent('''\
+ Apache Solr %s
+ =====================================
+
+ Introduction
+ ------------
+ TBD
+
+ Getting Started
+ ---------------
+ TBD
+ ''' % conrib_name)
+
+def get_license_header():
+ return dedent('''\
+ /*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */''')
+
+def get_build_gradle(description):
+ return dedent('''\
+ apply plugin: 'java-library'
+
+ description = '%s'
+
+ dependencies {
+ implementation project(':solr:core')
+
+ testImplementation project(':solr:test-framework')
+ }''' % description)
+
+def get_overview_tpl(name):
+ return dedent('''\
+ <!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+ <html>
+ <body>
+ Apache Solr Search Server: %s
+ </body>
+ </html>''' % name)
+
+def scaffold_folder(module_name, module_full_name, module_folder,
module_description):
+ print("\nScaffolding folder %s" % module_folder)
+ os.makedirs(module_folder)
+ readme = os.path.join(module_folder, 'README.md')
+ with open(readme, 'w') as fp:
+ fp.write(get_readme_skel(module_full_name))
+ build = os.path.join(module_folder, 'build.gradle')
+ with open(build, 'w') as fp:
+ fp.write (get_license_header())
+ fp.write('\n\n')
+ fp.write (get_build_gradle(module_description))
+ src_java_folder = os.path.join(module_folder, 'src', 'java')
+ os.makedirs(src_java_folder)
+ overview = os.path.join(src_java_folder, 'overview.html')
+ with open(overview, 'w') as fp:
+ fp.write (get_overview_tpl(module_full_name))
+
+ os.makedirs(os.path.join(module_folder, 'src', 'resources'))
+ os.makedirs(os.path.join(module_folder, 'src', 'test-files'))
+ os.makedirs(os.path.join(module_folder, 'src', 'test'))
+
+ update_build(os.path.join('solr', 'packaging', 'build.gradle'),
+ r':solr:contrib:extraction',
+ ' ":solr:contrib:%s",\n' % module_name)
+ update_build(os.path.join('gradle', 'maven', 'defaults-maven.gradle'),
+ r':solr:contrib:extraction',
+ ' ":solr:contrib:%s",\n' % module_name)
+ update_build(os.path.join('settings.gradle'),
+ r'include "solr:contrib:extraction"',
+ 'include "solr:contrib:%s"\n' % module_name)
+ print("Adding new files to git")
+ run("git add %s" % module_folder)
+
+def main():
+ conf = read_config()
+ module_name = conf.name
+
+ module_folder = os.path.join('solr', 'contrib', module_name)
+ scaffold_folder(module_name, conf.full_name, module_folder, conf.description)
+
+
+if __name__ == '__main__':
+ try:
+ main()
+ except KeyboardInterrupt:
+ print('\nReceived Ctrl-C, exiting early')