Retire js-generator-openstack

This repository is unused, retire it.

Change-Id: Ib6b55e118b7092a05dfe6bcbb6bcb66a8b20fdc2
Depends-On: https://review.openstack.org/597370/
This commit is contained in:
Andreas Jaeger 2018-08-29 08:51:25 +02:00
parent c2cc0eac5d
commit b98f89f4f7
49 changed files with 8 additions and 4622 deletions

View File

@ -1,12 +0,0 @@
root = true
[*]
end_of_line = lf
insert_final_newline = true
charset = utf-8
indent_style = space
indent_size = 2
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false

View File

@ -1,6 +0,0 @@
./dist
.npm
cover
node_modules
npm-debug.log
package

View File

@ -1,6 +0,0 @@
extends: openstack
env:
node: true
jasmine: true
rules:
strict: ["error", "global"]

45
.gitignore vendored
View File

@ -1,45 +0,0 @@
# Logs
logs
*.log
npm-debug.log*
# Runtime data
pids
*.pid
*.seed
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Test reporting directories used by zuul
cover
reports
# Project output directories
package
dist
www
build
doc/source/jsdoc
*-compiled.js
*.js.map
*.tgz
.vagrant
# Dependency directories
node_modules
bower_components
# Optional npm cache directory
.npm
# Optional REPL history
.node_repl_history
# Dev Environment Excludes
*.iml
.idea
clouds.yaml
# OS-specific
.DS_Store

View File

@ -1,30 +0,0 @@
verbose: false
instrumentation:
root: .
include-all-sources: true
excludes: ['spec/**', 'doc/build/**', 'jsdoc_build/**']
default-excludes: true
reporting:
print: detail
reports:
- lcov
- html
dir: ./cover
watermarks:
statements: [80, 100]
lines: [80, 100]
functions: [80, 100]
branches: [80, 100]
check:
global:
statements: 100
lines: 100
branches: 100
functions: 100
excludes: []
each:
statements: 100
lines: 100
branches: 100
functions: 100
excludes: []

0
.nsprc
View File

View File

@ -1,9 +0,0 @@
{
"generator-openstack": {
"srcDir": "./generators",
"distDir": "./dist",
"testDir": "./spec",
"engine": "node",
"language": "es5"
}
}

174
LICENSE
View File

@ -1,174 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.

View File

@ -1,53 +1,10 @@
# generator-openstack
This project is no longer maintained.
`generator-openstack` is OpenStack's JavaScript project templating and maintenance engine. It permits you to:
The contents of this repository are still available in the Git
source code management system. To see the contents of this
repository before it reached its end of life, please check out the
previous commit with "git checkout HEAD^1".
1. ...create a new OpenStack JavaScript project.
2. ...update an existing project with new settings, requirements, and tools.
## Quick Start
Creating and updating a project follows the exact same steps:
1. Prerequisites: `nodejs`, `npm`
2. `npm install -g yo generator-openstack`
3. `cd my_project_directory`
4. `yo openstack`
The generator also provides a non-interactive mode: `yo openstack --non-interactive`
## Contributing
This project uses itself as a code management tool. In order to set up your environment for development, please follow these steps:
1. Prerequisites: `nodejs`, `npm`, `git`, `git review`
2. `npm install -g yo`
3. `git clone git://git.openstack.org/openstack/js-generator-openstack`
4. `cd js-generator-openstack`
5. `npm install`
8. `git review -s`
This should set up your project directory and make it ready for development.
### Some useful development commands
* `npm link` - Link this project into your global npm runtime. This allows you to run the project (via `yo openstack`) as if it was installed via `npm install -g`
* `npm test` - Run all the tests.
* `npm run lint` - Perform a linting check.
## TODO List
Looking for something to add? Please check [StoryBoard](https://storyboard.openstack.org/#!/project/842)
## Project Resources
- [Source code](https://git.openstack.org/cgit/openstack/js-generator-openstack)
- [Code review](https://review.openstack.org/#/admin/projects/openstack-infra/js-generator-openstack)
- [Task tracking (StoryBoard)](https://storyboard.openstack.org/#!/project/842)
- Discussion on [openstack develop mailing list](http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev) with tag `[javascript]`
- IRC: `#openstack-javascript` on freenode.net
## Workflow
- [How to contribute to OpenStack](http://docs.openstack.org/infra/manual/developers.html)
- [Code reviews workflow](http://docs.openstack.org/infra/manual/developers.html#development-workflow)
For any further questions, please email
openstack-dev@lists.openstack.org or join #openstack-dev on
Freenode.

View File

@ -1,43 +0,0 @@
# This is a cross-platform list tracking distribution packages needed by tests;
# see http://docs.openstack.org/infra/bindep/ for additional information.
apt-transport-https
lsb-release
ant
build-essential [platform:dpkg]
chromium-browser
curl
cyrus-sasl-devel [platform:rpm]
dbus
firefox [!platform:debian]
gawk
iceweasel [platform:debian]
language-pack-en [platform:ubuntu]
libcurl-devel [platform:rpm]
libcurl4-gnutls-dev [platform:dpkg]
libffi-dev [platform:dpkg]
libffi-devel [platform:rpm]
libjpeg-dev [platform:dpkg]
libjpeg-turbo-devel [platform:rpm]
libldap2-dev [platform:dpkg]
libsasl2-dev [platform:dpkg]
libselinux-python [platform:rpm]
libuuid-devel [platform:rpm]
locales [platform:debian]
pkg-config [platform:dpkg]
pkgconfig [platform:rpm]
python-dev [platform:dpkg]
python-devel [platform:rpm]
python-libvirt [platform:dpkg]
python-lxml
python-sphinx [platform:dpkg]
python-oslosphinx [platform:dpkg]
python3-all-dev [platform:ubuntu-trusty]
python3-dev [platform:dpkg]
python3-devel [platform:fedora]
python3.4 [platform:ubuntu-trusty]
python34-devel [platform:centos]
unzip
uuid-dev [platform:dpkg]
xorg-x11-server-Xvfb [platform:rpm]
xvfb [platform:dpkg]

View File

@ -1,227 +0,0 @@
# Makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = build
VENVDIR = .venv
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
.PHONY: help
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " applehelp to make an Apple Help Book"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " epub3 to make an epub3"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " xml to make Docutils-native XML files"
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
@echo " coverage to run coverage check of the documentation (if enabled)"
@echo " dummy to check syntax errors of document sources"
.PHONY: clean
clean:
rm -rf $(BUILDDIR)/*
.PHONY: html
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
.PHONY: dirhtml
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
.PHONY: singlehtml
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
.PHONY: pickle
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
.PHONY: json
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
.PHONY: htmlhelp
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
.PHONY: qthelp
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/generator-openstack.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/generator-openstack.qhc"
.PHONY: applehelp
applehelp:
$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
@echo
@echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
@echo "N.B. You won't be able to view it unless you put it in" \
"~/Library/Documentation/Help or install it in your application" \
"bundle."
.PHONY: devhelp
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/generator-openstack"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/generator-openstack"
@echo "# devhelp"
.PHONY: epub
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
.PHONY: epub3
epub3:
$(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3
@echo
@echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3."
.PHONY: latex
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
.PHONY: latexpdf
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
.PHONY: latexpdfja
latexpdfja:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through platex and dvipdfmx..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
.PHONY: text
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
.PHONY: man
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
.PHONY: texinfo
texinfo:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
@echo "Run \`make' in that directory to run these through makeinfo" \
"(use \`make info' here to do that automatically)."
.PHONY: info
info:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo "Running Texinfo files through makeinfo..."
make -C $(BUILDDIR)/texinfo info
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
.PHONY: gettext
gettext:
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
@echo
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
.PHONY: changes
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
.PHONY: linkcheck
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
.PHONY: doctest
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
.PHONY: coverage
coverage:
$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
@echo "Testing of coverage in the sources finished, look at the " \
"results in $(BUILDDIR)/coverage/python.txt."
.PHONY: xml
xml:
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
@echo
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
.PHONY: pseudoxml
pseudoxml:
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
@echo
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
.PHONY: dummy
dummy:
$(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy
@echo
@echo "Build finished. Dummy builder generates no files."

View File

@ -1,87 +0,0 @@
# -*- coding: utf-8 -*-
# Licensed 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 datetime
import os
import sys
sys.path.insert(0, os.path.abspath('../..'))
# -- General configuration ----------------------------------------------------
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = [
'sphinx.ext.autodoc',
'oslosphinx'
]
exclude_patterns = [
'template.rst',
]
# Optionally allow the use of sphinxcontrib.spelling to verify the
# spelling of the documents.
try:
import sphinxcontrib.spelling
extensions.append('sphinxcontrib.spelling')
except ImportError:
pass
# autodoc generation is a bit aggressive and a nuisance when doing heavy
# text edit cycles.
# execute "export SPHINX_DEBUG=1" in your terminal to disable
# The suffix of source filenames.
source_suffix = '.rst'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'js-generator-openstack'
copyright = u'%s, OpenStack Foundation' % datetime.date.today().year
# If true, '()' will be appended to :func: etc. cross-reference text.
add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
add_module_names = True
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# -- Options for HTML output --------------------------------------------------
# The theme to use for HTML and HTML Help pages. Major themes that come with
# Sphinx are currently 'default' and 'sphinxdoc'.
# html_theme_path = ["."]
# html_theme = '_theme'
# html_static_path = ['static']
# Output file base name for HTML help builder.
htmlhelp_basename = '%sdoc' % project
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass
# [howto/manual]).
latex_documents = [
('index',
'%s.tex' % project,
u'%s Documentation' % project,
u'OpenStack Foundation', 'manual'),
]
# Example configuration for intersphinx: refer to the Python standard library.
#intersphinx_mapping = {'http://docs.python.org/': None}

View File

@ -1,55 +0,0 @@
=================
Development Guide
=================
If you would like to contribute to the development of this project,
you must follow the steps on this page:
http://docs.openstack.org/infra/manual/developers.html
If you already have a good understanding of how the system works and your
OpenStack accounts are set up, you can skip to the development workflow section
of this documentation to learn how changes to OpenStack should be submitted for
review via the Gerrit tool:
http://docs.openstack.org/infra/manual/developers.html#development-workflow
Install Prerequisites
=====================
.. code:: bash
# Instructions for Ubuntu
sudo apt-get install nodejs nodejs-legacy npm git git-review pip
pip install Sphinx oslosphinx
npm install -g yo
Bootstrap the Project
=====================
.. code:: bash
# Clone the repository.
git clone git://git.openstack.org/openstack/js-generator-openstack
cd js-generator-openstack
# Install project dependencies
npm install
# Initialize Gerrit
git review -s
This should set up your project directory and make it ready for development.
Useful Commands for Development
===============================
* ``npm link`` - Link this project into your global npm runtime. This allows you to run the project
(via ``yo openstack``) as if it was installed via ``npm install -g``
* ``npm test`` - Run all the tests.
* ``npm run lint`` - Perform a linting check.
* ``npm run doc`` - Build this documentation (requires Sphinx and oslosphinx)

View File

@ -1,52 +0,0 @@
==========================
OpenStack Yeoman Generator
==========================
Welcome to the documentation for the OpenStack Yeoman Project Generator. This project
allows you to create a new OpenStack JavaScript project, and update an existing project
with new settings, dependencies, and tools.
Quickstart
==========
If you'd just like to create a new project, you can do so quickly and easily with the following
steps:
.. code:: bash
npm install -g yo generator-openstack
cd my_project_directory
yo openstack
From here, you'll be asked a few basic questions about your new project, and once completed, your
project will be ready to go!
Contributing
============
There are several quick and easy ways that you can contribute to this project:
1. File Bugs on StoryBoard_.
2. Chat on IRC in `#openstack-javascript`_.
3. Review code on gerrit_.
If you'd like to contribute code, and for more information on project tooling, conventions, and
setup, please see our :doc:`./development_guide`.
Topics
======
.. toctree::
:maxdepth: 2
development_guide
specs
reference_documentation
.. _StoryBoard: https://storyboard.openstack.org/#!/project/842
.. _gerrit: https://review.openstack.org/#/q/status:open+AND+project:openstack/js-generator-openstack,n,z
.. _#openstack-javascript: http://webchat.freenode.net/?channels=openstack-javascript
.. _Community Code of Conduct: https://www.openstack.org/legal/community-code-of-conduct/

View File

@ -1,12 +0,0 @@
=======================
Reference Documentation
=======================
Below you will find reference documentation for individual components of the generator. For
detailed, method-specific documentation, select the appropriate method below.
.. toctree::
:maxdepth: 2
:glob:
jsdoc/module-*

View File

@ -1,44 +0,0 @@
=====================
Design Specifications
=====================
Priority Specifications
=======================
This is a list of approved design specifications, which are considered
high-priority for this project. It is very likely that work is already in
progress, however contributions and reviews are always welcome.
.. If you add additional projects to this list, please update the gerrit
query block.
.. toctree::
:maxdepth: 1
Gerrit query for all changes related to priority efforts::
status:open AND project:openstack/js-generator-openstack
https://review.openstack.org/#/q/status:open+AND+project:openstack/js-generator-openstack,n,z
Approved Specifications
=======================
These are specifications that have been approved; work may or may not
have started on these. Reviewers will review related changes as time
permits.
.. toctree::
:glob:
:maxdepth: 1
Implemented Specifications
==========================
These specifications have already been implemented and are listed here
for historical purposes.
.. toctree::
:maxdepth: 1

View File

@ -1,107 +0,0 @@
::
Copyright <YEARS> <HOLDER> <--UPDATE THESE
This work is licensed under a Creative Commons Attribution 3.0
Unported License.
http://creativecommons.org/licenses/by/3.0/legalcode
..
This template should be in ReSTructured text. Please do not delete
any of the sections in this template. If you have nothing to say
for a whole section, just write: "None". For help with syntax, see
http://sphinx-doc.org/rest.html To test out your formatting, see
http://www.tele3.cz/jbar/rest/rest.html
===============================
The Title of Your Specification
===============================
Include the URL of your StoryBoard story:
https://storyboard.openstack.org/...
Introduction paragraph -- why are we doing anything?
Problem Description
===================
A detailed description of the problem.
Proposed Change
===============
Here is where you cover the change you propose to make in detail. How do you
propose to solve this problem?
If this is one part of a larger effort make it clear where this piece ends. In
other words, what's the scope of this effort?
Alternatives
------------
This is an optional section, where it does apply we'd just like a demonstration
that some thought has been put into why the proposed approach is the best one.
Implementation
==============
Assignee(s)
-----------
Who is leading the writing of the code? Or is this a blueprint where you're
throwing it out there to see who picks it up?
If more than one person is working on the implementation, please designate the
primary author and contact.
Primary assignee:
<launchpad-id or None>
Can optionally list additional ids if they intend on doing substantial
implementation work on this blueprint.
Gerrit Topic
------------
Use Gerrit topic "<topic_name>" for all patches related to this spec.
.. code-block:: bash
git-review -t <topic_name>
Work Items
----------
Work items or tasks -- break the feature up into the things that need to be
done to implement it. Those parts might end up being done by different people,
but we're mostly trying to understand the timeline for implementation.
Documentation
-------------
Will this require a documentation change? If so, which documents?
Will it impact developer workflow? Will additional communication need
to be made?
Security
--------
Does this introduce any additional security risks, or are there
security-related considerations which should be discussed?
Testing
-------
What tests will be available or need to be constructed in order to
validate this? Unit/functional tests, development
environments/servers, etc.
Dependencies
============
- Include specific references to specs and/or stories in storyboard, or in
other projects, that this one either depends on or is related to.
- Does this feature require any new library or program dependencies
not already in use?

View File

@ -1,129 +0,0 @@
/*
* Copyright (c) 2016 Hewlett Packard Enterprise Development Company, LP
*
* Licensed 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.
*/
'use strict';
var yeoman = require('yeoman-generator');
var projectBuilder = require('./lib/project_builder');
var Q = require('q');
var pkg = require('./lib/component/pkg');
var gerrit = require('./lib/component/gerrit');
var editorconfig = require('./lib/component/editorconfig');
var license = require('./lib/component/license');
var structure = require('./lib/component/structure');
var eslint = require('./lib/component/eslint');
var gitignore = require('./lib/component/gitignore');
var nsp = require('./lib/component/nsp');
module.exports = yeoman.Base.extend({
constructor: function () {
yeoman.Base.apply(this, arguments);
// Add support for a `--non-interactive` flag
this.option('non-interactive');
// If non-interactive is set, force-override all files.
this.conflicter.force = this.options['non-interactive'];
},
initializing: function () {
var done = this.async();
// Initialize components.
Q(this)
.then(pkg.init) // Package.json
.then(gerrit.init) // Gerrit
.then(editorconfig.init) // Editorconfig
.then(license.init) // Licensing
.then(structure.init) // Project Structure
.then(eslint.init) // Linting
.then(gitignore.init) // Gitignore
.then(nsp.init) // NSP
.then(function () {
done();
});
},
prompting: function () {
var done = this.async();
// Prompt components.
Q(this)
.then(pkg.prompt) // Package.json
.then(gerrit.prompt) // Gerrit
.then(editorconfig.prompt) // Editorconfig
.then(license.prompt) // Licensing
.then(structure.prompt) // Project Structure
.then(eslint.prompt) // Linting
.then(gitignore.prompt) // Gitignore
.then(nsp.prompt) // NSP
.then(function () {
done();
});
},
configuring: function () {
var done = this.async();
// Configure components.
Q(this)
.then(pkg.configure) // Package.json
.then(gerrit.configure) // Gerrit
.then(editorconfig.configure) // Editorconfig
.then(license.configure) // Licensing
.then(structure.configure) // Project Structure
.then(eslint.configure) // Linting
.then(gitignore.configure) // Gitignore
.then(nsp.configure) // NSP
.then(function () {
done();
});
},
writing: function () {
var self = this;
var config = self.config.getAll();
var included = projectBuilder.getIncludedFiles();
var excluded = projectBuilder.getExcludedFiles();
// Write out all files included in the project builder.
included.forEach(function (fileRef) {
if (fileRef.hasOwnProperty('content')) {
var content = typeof fileRef.content === 'function'
? "" + fileRef.content()
: "" + fileRef.content;
self.fs.write(fileRef.to, content);
} else {
self.fs.copyTpl(
self.templatePath(fileRef.from),
self.destinationPath(fileRef.to),
config
);
}
});
// Delete all files explicitly excluded in the project builder.
excluded.forEach(function (path) {
self.fs.delete(self.destinationPath(path));
});
},
install: function () {
this.npmInstall();
}
});

View File

@ -1,54 +0,0 @@
/*
* Copyright (c) 2016 Hewlett Packard Enterprise Development Company, LP
*
* Licensed 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.
*/
/**
* editorconfig module
* @module
*/
'use strict';
var projectBuilder = require('../project_builder');
/**
* No-op placeholder method, for handlers we don't need.
*
* @param {generator} generator The currently active generator.
* @returns {generator} The passed generator, for promise chaining.
*/
function noop (generator) {
return generator;
}
/**
* Configure the project by adding required files.
*
* @param {generator} generator The currently active generator.
* @returns {generator} The passed generator, for promise chaining.
*/
function configure (generator) {
projectBuilder.addFile('.editorconfig');
return generator;
}
module.exports = {
/** @see {@link module:component/editorconfig~noop} */
init: noop,
/** @see {@link module:component/editorconfig~noop} */
prompt: noop,
/** @see {@link module:component/editorconfig~configure} */
configure: configure
};

View File

@ -1,134 +0,0 @@
/*
* Copyright (c) 2016 Hewlett Packard Enterprise Development Company, LP
*
* Licensed 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.
*/
/**
* eslint module
* @module
*/
'use strict';
var pkgBuilder = require('../pkg_builder');
var projectBuilder = require('../project_builder');
var yaml = require('js-yaml');
var excludedPaths = [];
var ignoreFile = '.eslintignore';
var rcFile = '.eslintrc';
var rcContent = {extends: 'openstack'};
/**
* This method configures the package builder with all options necessary to support eslint.
*
* @param {generator} generator The currently active generator.
* @returns {generator} The passed generator, for promise chaining.
*/
function prompt (generator) {
// At this time, we don't actually need to prompt the user.
// Add the dependencies.
pkgBuilder.addDependencies(['eslint', 'eslint-config-openstack'], 'devDependencies');
pkgBuilder.addCommand('lint', 'eslint ./');
return generator;
}
/**
* Read the existing .eslintrc and .eslintignore files, and populate our initial configuration
* with them.
*
* @param {generator} generator The currently active generator.
* @returns {generator} The passed generator, for promise chaining.
*/
function init (generator) {
var fs = generator.fs;
// Re-initialize excluded paths.
excludedPaths = [];
// Read .eslintignore.
if (fs.exists(ignoreFile)) {
var paths = fs.read(ignoreFile)
.split('\n')
.filter(function (item) {
// Remove empty lines.
return item.length > 0;
});
paths.forEach(function (item) {
excludedPaths.push(item);
});
}
// Read .eslintrc
if (fs.exists(rcFile)) {
rcContent = yaml.safeLoad(fs.read(rcFile));
}
return generator;
}
/**
* Configure the project by adding required files.
*
* @param {generator} generator The currently active generator.
* @returns {generator} The passed generator, for promise chaining.
*/
function configure (generator) {
if (buildIgnore().length === 0) {
projectBuilder.removeFile('.eslintignore');
} else {
projectBuilder.writeFile('.eslintignore', buildIgnore);
}
projectBuilder.writeFile('.eslintrc', buildRc);
return generator;
}
/**
* Generate the content of our .eslintignore file from the configured list of excluded paths,
* as well as any project-level configured ignoreFiles.
*
* @returns {string} The content of the .eslintignore file.
*/
function buildIgnore () {
var ignoredFiles = projectBuilder.getIgnoredFiles();
ignoredFiles.forEach(function (item) {
if (excludedPaths.indexOf(item) === -1) {
excludedPaths.push(item);
}
});
return excludedPaths.sort().join('\n');
}
/**
* Generate the content of our .eslintrc file from the current configuration.
*
* @returns {string} The content of the .eslintrc file.
*/
function buildRc () {
return yaml.safeDump(rcContent);
}
module.exports = {
/** @see {@link module:component/eslint~init} */
init: init,
/** @see {@link module:component/eslint~prompt} */
prompt: prompt,
/** @see {@link module:component/eslint~configure} */
configure: configure
};

View File

@ -1,152 +0,0 @@
/*
* Copyright (c) 2016 Hewlett Packard Enterprise Development Company, LP
*
* Licensed 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.
*/
/**
* gerrit module
* @module
*/
'use strict';
var projectBuilder = require('../project_builder');
var pkgBuilder = require('../pkg_builder');
var ini = require('ini');
var Q = require('q');
var gerritFile = '.gitreview';
var iniContent;
var gerritFileExists = false;
/**
* Internal helper method. Returns true if gerrit has been enabled.
*
* @param {String} answers The collection of answers.
* @returns {Function} True if enableGerrit is set, otherwise false.
*/
var gerritEnabled = function(answers) {
return !!answers.enableGerrit;
};
/**
* Initialize the gerrit component of this generator. In this case, we're
* only adding default configuration values.
*
* @param {generator} generator The currently active generator.
* @returns {generator} The passed generator, for promise chaining.
*/
function init (generator) {
// Define our defaults
iniContent = {
gerrit: {
host: 'review.openstack.org',
port: '29418',
project: 'openstack/test-project.git'
}
};
return generator;
}
/**
* Initialize the gerrit component of this generator. In this case, we're
* only adding default configuration values.
*
* @param {generator} generator The currently active generator.
* @returns {generator} The passed generator, for promise chaining.
*/
function prompt (generator) {
// Read the existing file and populate it as defaults.
if (generator.fs.exists(gerritFile)) {
gerritFileExists = true;
iniContent = ini.parse(generator.fs.read(gerritFile));
} else {
// Create project name from package name if gerrit file does not exist
var projectName = pkgBuilder.getValue("name");
iniContent.gerrit.project = 'openstack/' + projectName + '.git';
}
var deferred = Q.defer();
if (!generator.options['non-interactive']) {
// Go through the prompts.
generator.prompt(
[{
type: 'confirm',
name: 'enableGerrit',
message: 'Gerrit- Enable:',
default: gerritFileExists
}, {
when: gerritEnabled,
type: 'input',
name: 'gerritHost',
message: 'Gerrit- Host:',
default: iniContent.gerrit.host
}, {
when: gerritEnabled,
type: 'input',
name: 'gerritPort',
message: 'Gerrit- Port:',
default: iniContent.gerrit.port
}, {
when: gerritEnabled,
type: 'input',
name: 'gerritProject',
message: 'Gerrit- Project Path:',
default: iniContent.gerrit.project
}],
function(answers) {
gerritFileExists = answers.enableGerrit;
iniContent.gerrit = {
host: answers.gerritHost,
port: answers.gerritPort,
project: answers.gerritProject
};
deferred.resolve(generator);
});
} else {
deferred.resolve(generator);
}
return deferred.promise;
}
/**
* Configure gerrit
*
* @param {generator} generator The currently active generator.
* @returns {generator} The passed generator, for promise chaining.
*/
function configure (generator) {
if (gerritFileExists) {
projectBuilder.writeFile(gerritFile, buildGerritFile);
} else {
projectBuilder.removeFile(gerritFile);
}
return generator;
}
function buildGerritFile () {
return ini.stringify(iniContent);
}
module.exports = {
/** @see {@link module:component/gerrit~init} */
init: init,
/** @see {@link module:component/gerrit~prompt} */
prompt: prompt,
/** @see {@link module:component/gerrit~configure} */
configure: configure
};

View File

@ -1,111 +0,0 @@
/*
* Copyright (c) 2016 Hewlett Packard Enterprise Development Company, LP
*
* Licensed 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.
*/
/**
* gitignore module
* @module
*/
'use strict';
var projectBuilder = require('../project_builder');
var excludedPaths = {};
var filePath = '.gitignore';
/**
* No-op placeholder method, for handlers we don't need.
*
* @param {generator} generator The currently active generator.
* @returns {generator} The passed generator, for promise chaining.
*/
function noop (generator) {
return generator;
}
/**
* Read the existing .gitignore file, and populate our current list of ignores.
*
* @param {generator} generator The currently active generator.
* @returns {generator} The passed generator, for promise chaining.
*/
function init (generator) {
var fs = generator.fs;
// Reinitialize the ignore map.
excludedPaths = {};
// Read .gitignore.
if (fs.exists(filePath)) {
fs.read(filePath)
// Split into lines
.split('\n')
// Remove empty lines and comments.
.filter(function (item) {
return item.length > 0 && !item.match(/\s*#/);
})
// Add to our list.
.map(function (line) {
excludedPaths[line] = true;
});
}
return generator;
}
/**
* Generate the .gitignore file from the data we've imported.
*
* @param {generator} generator The currently active generator.
* @returns {generator} The passed generator, for promise chaining.
*/
function configure (generator) {
var ignoreContent = buildGitignore();
if (ignoreContent.length === 0) {
// Delete the file if there's nothing to ignore.
projectBuilder.removeFile(filePath);
} else {
projectBuilder.writeFile(filePath, buildGitignore);
}
return generator;
}
/**
* Generate the content of our .gitignore file from the configured list of excluded paths,
* as well as any project-level configured ignoreFiles.
*
* @returns {string} The content of the .eslintignore file.
*/
function buildGitignore () {
var ignoredFiles = projectBuilder.getIgnoredFiles();
for (var i = 0; i < ignoredFiles.length; i++) {
if (!excludedPaths.hasOwnProperty(ignoredFiles[i])) {
excludedPaths[ignoredFiles[i]] = true;
}
}
return Object.keys(excludedPaths).sort().join('\n');
}
module.exports = {
/** @see {@link module:component/gitignore~init} */
init: init,
/** @see {@link module:component/gitignore~noop} */
prompt: noop,
/** @see {@link module:component/gitignore~configure} */
configure: configure
};

View File

@ -1,57 +0,0 @@
/*
* Copyright (c) 2016 Hewlett Packard Enterprise Development Company, LP
*
* Licensed 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.
*/
/**
* licence module
* @module
*/
'use strict';
var projectBuilder = require('../project_builder');
var pkgBuilder = require('../pkg_builder');
/**
* No-op placeholder method, for handlers we don't need.
*
* @param {generator} generator The currently active generator.
* @returns {generator} The passed generator, for promise chaining.
*/
function noop (generator) {
return generator;
}
/**
* Configure the project by adding required files.
*
* @param {generator} generator The currently active generator.
* @returns {generator} The passed generator, for promise chaining.
*/
function configure (generator) {
projectBuilder.addFile('LICENSE');
pkgBuilder.setValues({license: 'Apache-2.0'});
return generator;
}
module.exports = {
/** @see {@link module:component/license~noop} */
init: noop,
/** @see {@link module:component/license~noop} */
prompt: noop,
/** @see {@link module:component/license~configure} */
configure: configure
};

View File

@ -1,74 +0,0 @@
/*
* Copyright (c) 2016 Hewlett Packard Enterprise Development Company, LP
*
* Licensed 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.
*/
/**
* This module adds the Node Security commandline tool (nsp) to the project.
* Its job is to identify known vulnerabilities by scanning the projects
* source and dependencies.
* @module
*/
'use strict';
var projectBuilder = require('../project_builder');
var pkgBuilder = require('../pkg_builder');
/**
* No-op placeholder method, for handlers we don't need.
*
* @param {generator} generator The currently active generator.
* @returns {generator} The passed generator, for promise chaining.
*/
function noop (generator) {
return generator;
}
/**
* This method configures the package builder with all options necessary
* to run nsp.
*
* @param {generator} generator The currently active generator.
* @returns {generator} The passed generator, for promise chaining.
*/
function prompt (generator) {
// At this time, we don't actually need to prompt the user.
// Add the dependencies.
pkgBuilder.addDependencies(['nsp'], 'devDependencies');
pkgBuilder.addCommand('prepublish', 'nsp check');
return generator;
}
/**
* Configure the project by adding required files.
*
* @param {generator} generator The currently active generator.
* @returns {generator} The passed generator, for promise chaining.
*/
function configure (generator) {
projectBuilder.addFile('.nsprc');
return generator;
}
module.exports = {
/** @see {@link module:component/nsp~noop} */
init: noop,
/** @see {@link module:component/nsp~prompt} */
prompt: prompt,
/** @see {@link module:component/nsp~configure} */
configure: configure
};

View File

@ -1,129 +0,0 @@
/*
* Copyright (c) 2016 Hewlett Packard Enterprise Development Company, LP
*
* Licensed 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.
*/
/**
* package module
* @module
*/
'use strict';
var Q = require('q');
var hyphenize = require('hyphenize');
var pkgBuilder = require('../pkg_builder');
var projectBuilder = require('../project_builder');
var packagePath = 'package.json';
/**
* Iterate over needed package components, ensuring that required
* parameters are set.
*
* @param {generator} generator The currently active generator.
* @returns {generator} The passed generator, for promise chaining.
*/
function prompt (generator) {
var deferred = Q.defer();
if (!generator.options['non-interactive']) {
generator.prompt(
[{
type: 'input',
name: 'name',
message: 'Project- Name:',
default: pkgBuilder.getValue('name', hyphenize(generator.appname))
}, {
type: 'input',
name: 'description',
message: 'Project- Description:',
default: pkgBuilder.getValue('description')
}, {
type: 'input',
name: 'version',
message: 'Project- Version:',
default: pkgBuilder.getValue('version', '0.0.1')
}, {
type: 'input',
name: 'homepage',
message: 'Project- Homepage:',
default: pkgBuilder.getValue('homepage', 'http://www.openstack.org/')
}, {
type: 'input',
name: 'author',
message: 'Project- Author:',
default: pkgBuilder.getValue('author',
'OpenStack <openstack-dev@lists.openstack.org> (http://www.openstack.org/)')
}],
function (answers) {
pkgBuilder.setValues(answers);
deferred.resolve(generator);
});
} else {
deferred.resolve(generator);
}
return deferred.promise;
}
/**
* Read any existing package.json file, to set our defaults.
*
* @param {generator} generator The currently active generator.
* @returns {generator} The passed generator, for promise chaining.
*/
function init (generator) {
var fs = generator.fs;
// Read package.json
if (fs.exists(packagePath)) {
pkgBuilder.fromJSON(fs.read(packagePath));
}
// Add files that should be ignored overall.
projectBuilder.ignoreFile('node_modules');
// NPM execution failures.
projectBuilder.ignoreFile('npm-debug.log');
// If you unzip something generated by npm pack, this is the directory it ends up in.
projectBuilder.ignoreFile('package');
// Local .npm cache
projectBuilder.ignoreFile('.npm');
var devDeps = ['istanbul', 'jasmine'];
pkgBuilder.addDependencies(devDeps, 'devDependencies');
return generator;
}
/**
* Configure the project by adding required files.
*
* @param {generator} generator The currently active generator.
* @returns {generator} The passed generator, for promise chaining.
*/
function configure (generator) {
projectBuilder.writeFile('package.json', pkgBuilder.toJSON);
return generator;
}
module.exports = {
/** @see {@link module:component/pkg~init} */
init: init,
/** @see {@link module:component/pkg~prompt} */
prompt: prompt,
/** @see {@link module:component/pkg~configure} */
configure: configure
};

View File

@ -1,142 +0,0 @@
/*
* Copyright (c) 2016 Hewlett Packard Enterprise Development Company, LP
*
* Licensed 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.
*/
/**
* This generator module handles questions regarding the project's structure,
* such as engine, common output directories, and language level. It informs
* other generators, such as test framework generation, packaging tools,
* and/or configuration files.
* @module
*/
'use strict';
var Q = require('q');
var projectBuilder = require('../project_builder');
/**
* Initialize the component by setting configuration defaults. These, or previously set
* versions, will be accessible immediately, however it's good practice not to access them
* until after the prompting phase, as we cannot guarantee that they will be properly set.
*
* @param {generator} generator The currently active generator.
* @returns {generator} The passed generator, for promise chaining.
*/
function init (generator) {
// Set our defaults:
generator.config.defaults({
engine: 'browser',
language: 'es5',
srcDir: './src',
distDir: './dist',
testDir: './test'
});
return generator;
}
/**
* If applicable, prompt the user for a project type.
*
* @param {generator} generator The currently active generator.
* @returns {generator} The passed generator, for promise chaining.
*/
function prompt (generator) {
var deferred = Q.defer();
// We default to a node.js project.
if (!generator.options['non-interactive']) {
// Go through the prompts.
generator.prompt(
[{
type: 'list',
name: 'engine',
message: 'Structure- Runtime Engine:',
choices: [
{
name: 'Browser',
value: 'browser'
},
{
name: 'Node.js',
value: 'node'
}
],
default: generator.config.get('engine')
}, {
type: 'list',
name: 'language',
message: 'Structure- Language:',
choices: [
{
name: 'ECMAScript 5',
value: 'es5'
},
{
name: 'ECMAScript 6',
value: 'es6'
}
],
default: generator.config.get('language')
}, {
type: 'input',
name: 'srcDir',
message: 'Structure- Source Directory:',
default: generator.config.get('srcDir')
}, {
type: 'input',
name: 'testDir',
message: 'Structure- Test Directory:',
default: generator.config.get('testDir')
}, {
type: 'input',
name: 'distDir',
message: 'Structure- Dist Directory:',
default: generator.config.get('distDir'),
when: function (answers) {
return answers.engine === 'browser';
}
}],
function (answers) {
generator.config.set(answers);
deferred.resolve(generator);
});
} else {
deferred.resolve(generator);
}
return deferred.promise;
}
/**
* Add any output directories to the ignore files.
*
* @param {generator} generator The currently active generator.
* @returns {generator} The passed generator, for promise chaining.
*/
function configure (generator) {
projectBuilder.ignoreFile(generator.config.get('distDir'));
return generator;
}
module.exports = {
/** @see {@link module:structure~init} */
init: init,
/** @see {@link module:structure~prompt} */
prompt: prompt,
/** @see {@link module:structure~configure} */
configure: configure
};

View File

@ -1,75 +0,0 @@
/*
* Copyright (c) 2016 Hewlett Packard Enterprise Development Company, LP
*
* Licensed 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.
*/
/**
* Access to the global-dependencies.json file.
*/
/**
* Global dependency module
* @module
*/
'use strict';
var globalDependencies = require('../../../global-dependencies.json');
/**
* Returns whether a dependency is in the global-dependencies list.
*
* @param {String} name The name of the dependency.
* @returns {Boolean} True if the dependency exists, otherwise false.
*/
function contains (name) {
return globalDependencies.hasOwnProperty(name);
}
/**
* Return the current acceptable version of the dependencies, or null.
*
* @param {String} name The dependency name.
* @returns {String|undefined} The version, or undefined.
*/
function read (name) {
return globalDependencies[name] || undefined;
}
/**
* Given a list of dependencies, updates this list of dependencies to the versions that are
* currently set in global-dependencies.
*
* @param {{}} dependencies The list of dependencies.
* @returns {{}} The above list of dependencies, with only the appropriate versions updated.
*/
function synchronize (dependencies) {
var results = {};
for (var key in dependencies) {
if (globalDependencies.hasOwnProperty(key)) {
results[key] = globalDependencies[key];
} else {
results[key] = dependencies[key];
}
}
return results;
}
module.exports = {
/** @see {@link module:global_dependencies~contains} */
contains: contains,
/** @see {@link module:global_dependencies~read} */
read: read,
/** @see {@link module:global_dependencies~synchronize} */
synchronize: synchronize
};

View File

@ -1,176 +0,0 @@
/*
* Copyright (c) 2016 Hewlett Packard Enterprise Development Company, LP
*
* Licensed 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.
*/
/**
* Package builder module
* @module
*/
'use strict';
var dependencies = require('./global_dependencies');
var pkgContent = {};
/**
* Convert a package.json formatted list of dependencies and update them to the versions
* listed in our global dependencies.
*
* @param {{}} dependencyMap The map of dependencies.
* @returns {{}} A clone of the map, updated with current common versions.
*/
function synchronizeDependencies (dependencyMap) {
if (!dependencyMap) {
return undefined;
}
// Cloning not necessary, handled in dependencies.synchronize();
return dependencies.synchronize(dependencyMap);
}
/**
* Initialize this builder from a JSON string.
*
* @param {String} pkgString The package string content.
* @returns {void}
*/
function fromJSON (pkgString) {
pkgContent = JSON.parse(pkgString);
}
/**
* Write the package content to a JSON string.
*
* @returns {String} The JSON content of the package, as a string.
*/
function toJSON () {
// Clone the package content so we don't destroy what's in memory...
var newContent = JSON.parse(JSON.stringify(pkgContent));
// Synchronize all the dependencies.
newContent.peerDependencies = synchronizeDependencies(newContent.peerDependencies);
newContent.dependencies = synchronizeDependencies(newContent.dependencies);
newContent.devDependencies = synchronizeDependencies(newContent.devDependencies);
return JSON.stringify(newContent, null, 2);
}
/**
* Add libraries to the package dependencies.
*
* @param {Array|String} libraryNames A list of all libraries to add to the dependencies.
* @param {String} type The type of dependency.
* @returns {void}
*/
function addDependencies (libraryNames, type) {
// Default the type.
type = type || 'dependencies';
// Valuecheck type.
if (['devDependencies', 'peerDependencies', 'dependencies'].indexOf(type) === -1) {
return;
}
// Default the array.
if (!Array.isArray(libraryNames)) {
libraryNames = [libraryNames];
}
// Make sure the property exists.
if (!pkgContent.hasOwnProperty(type)) {
pkgContent[type] = {};
}
// Add the dependency
libraryNames.forEach(function (library) {
var version = dependencies.read(library);
if (version && !pkgContent[type].hasOwnProperty(library)) {
pkgContent[type][library] = version;
}
});
}
/**
* Set values on the current package.
*
* @param {{}} values A map of values.
* @returns {void}
*/
function setValues (values) {
for (var key in values) {
// Filter out things from prototype.
if (values.hasOwnProperty(key)) {
pkgContent[key] = values[key];
}
}
}
/**
* Get the values of the current package.
*
* @returns {{}} A cloned map of the values.
*/
function getValues () {
return JSON.parse(JSON.stringify(pkgContent));
}
/**
* Get a specific value from the package.json file, or a default if the
* value is not set.
*
* @param {String} name The name of the value.
* @param {String} defaultValue A default value to return.
* @returns {{}} A clone of the referenced value.
*/
function getValue (name, defaultValue) {
if (pkgContent.hasOwnProperty(name)) {
return JSON.parse(JSON.stringify(pkgContent[name]));
}
return defaultValue || undefined;
}
/**
* Create a specific NPM script command, invoked by 'npm run <name>' or 'npm <name>'.
*
* @param {String} name The name of the script.
* @param {String} command The command to invoke.
* @returns {void}
*/
function addCommand (name, command) {
// sanity check, does 'scripts' exist?
if (!pkgContent.hasOwnProperty('scripts')) {
pkgContent.scripts = {};
}
// Save/Override the command.
pkgContent.scripts[name] = command;
}
module.exports = {
/** @see {@link module:pkg_builder~fromJSON} */
fromJSON: fromJSON,
/** @see {@link module:pkg_builder~toJSON} */
toJSON: toJSON,
/** @see {@link module:pkg_builder~setValues} */
setValues: setValues,
/** @see {@link module:pkg_builder~getValues} */
getValues: getValues,
/** @see {@link module:pkg_builder~getValue} */
getValue: getValue,
/** @see {@link module:pkg_builder~addDependencies} */
addDependencies: addDependencies,
/** @see {@link module:pkg_builder~addCommand} */
addCommand: addCommand
};

View File

@ -1,129 +0,0 @@
/*
* Copyright (c) 2016 Hewlett Packard Enterprise Development Company, LP
*
* Licensed 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.
*/
/**
* Project builder module
* @module
*/
'use strict';
var includedFiles = [];
var excludedFiles = [];
var ignoredFiles = [];
/**
* Ensure that a file is removed, or not present, in the project.
*
* @param {String} destinationPath Path to the file, relative to output root.
* @returns {void}
*/
function removeFile (destinationPath) {
excludedFiles.push(destinationPath);
}
/**
* Flag a file path as 'ignored'.
*
* This does not have a real impact on which files are created/removed from the bootstrapped
* project, however it does permit other modules to retrieve this list and modify their
* behavior accordingly. For example, eslint could use this to generate .eslintignore
*
* @param {String} destinationPath Path to the file, relative to output root.
* @returns {void}
*/
function ignoreFile (destinationPath) {
ignoredFiles.push(destinationPath);
}
/**
* Add a file to the project.
*
* @param {String} sourcePath Path to the file, relative to ./templates/
* @param {String} destinationPath Destination path relative to output root.
* @returns {void}
*/
function addFile (sourcePath, destinationPath) {
includedFiles.push({from: sourcePath, to: destinationPath || sourcePath});
}
/**
* Write a file to the project.
*
* @param {String} destinationPath The destination for the file.
* @param {String|Function} content A string of content, or method that returns one.
* @returns {void}
*/
function writeFile (destinationPath, content) {
includedFiles.push({to: destinationPath, content: content});
}
/**
* Get a list of all files that are to be included.
*
* @returns {Array} A list of all file mappings: {from:, to:}
*/
function getIncludedFiles () {
return includedFiles;
}
/**
* Get a list of all file paths that should be excluded.
*
* @returns {Array} A list of file paths.
*/
function getExcludedFiles () {
return excludedFiles;
}
/**
* Get a list of all file paths that should be ignored.
*
* @returns {Array} A list of file paths.
*/
function getIgnoredFiles () {
return ignoredFiles;
}
/**
* Clear the current configuration.
*
* @returns {void}
*/
function clear () {
includedFiles = [];
excludedFiles = [];
ignoredFiles = [];
}
module.exports = {
/** @see {@link module:project_builder~addFile} */
addFile: addFile,
/** @see {@link module:project_builder~writeFile} */
writeFile: writeFile,
/** @see {@link module:project_builder~removeFile} */
removeFile: removeFile,
/** @see {@link module:project_builder~ignoreFile} */
ignoreFile: ignoreFile,
/** @see {@link module:project_builder~getIncludedFiles} */
getIncludedFiles: getIncludedFiles,
/** @see {@link module:project_builder~getIgnoredFiles} */
getIgnoredFiles: getIgnoredFiles,
/** @see {@link module:project_builder~getExcludedFiles} */
getExcludedFiles: getExcludedFiles,
/** @see {@link module:project_builder~clear} */
clear: clear
};

View File

@ -1,12 +0,0 @@
root = true
[*]
end_of_line = lf
insert_final_newline = true
charset = utf-8
indent_style = space
indent_size = 2
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false

View File

@ -1,45 +0,0 @@
# Logs
logs
*.log
npm-debug.log*
# Runtime data
pids
*.pid
*.seed
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Test reporting directories used by zuul
cover
reports
# Project output directories
package
dist
www
build
doc/source/jsdoc
*-compiled.js
*.js.map
*.tgz
.vagrant
# Dependency directories
node_modules
bower_components
# Optional npm cache directory
.npm
# Optional REPL history
.node_repl_history
# Dev Environment Excludes
*.iml
.idea
clouds.yaml
# OS-specific
.DS_Store

View File

@ -1,174 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.

View File

@ -1,12 +0,0 @@
{
"ini": "^1.3.4",
"js-yaml": "^3.5.5",
"q": "^1.4.1",
"eslint": "^3",
"eslint-config-openstack": "4",
"istanbul": "^0.4.2",
"jasmine": "^2.4.1",
"karma": "^0.13.22",
"karma-htmlfile-reporter": "^0.2.2",
"nsp": "^2.3.0"
}

View File

@ -1,49 +0,0 @@
{
"name": "generator-openstack",
"homepage": "http://www.openstack.org/",
"version": "1.2.0",
"description": "Yeoman Project Generator for OpenStack JavaScript Projects",
"main": "index.js",
"scripts": {
"test": "istanbul cover jasmine",
"posttest": "istanbul check-coverage",
"prepublish": "nsp check",
"lint": "eslint ./",
"docs": "npm run jsdoc; (cd doc; make html)",
"jsdoc": "jsdoc -t node_modules/jsdoc-sphinx/template -r -d ./doc/source/jsdoc ./generators/app/lib"
},
"keywords": [
"yeoman-generator",
"openstack"
],
"files": [
"generators",
"global-dependencies.json"
],
"author": "OpenStack <openstack-dev@lists.openstack.org> (http://www.openstack.org/)",
"license": "Apache-2.0",
"dependencies": {
"hyphenize": "0.0.2",
"ini": "^1.3.4",
"js-yaml": "^3.5.5",
"q": "^1.4.1",
"semver": "^5.1.0",
"yeoman-generator": "^0.24.1"
},
"devDependencies": {
"eslint": "^3.3.1",
"eslint-config-openstack": "^4.0.1",
"istanbul": "^0.4.2",
"jasmine": "^2.4.1",
"jsdoc": "^3.4.0",
"jsdoc-sphinx": "0.0.6",
"karma": "^0.13.22",
"karma-htmlfile-reporter": "^0.2.2",
"mem-fs": "^1.1.2",
"mem-fs-editor": "^2.2.0",
"nsp": "^2.3.0",
"yeoman-assert": "^2.1.2",
"yeoman-test": "^1.1.0"
},
"repository": "git://git.openstack.org/openstack-infra/js-generator-openstack"
}

View File

@ -1,112 +0,0 @@
/*
* Copyright (c) 2016 Hewlett Packard Enterprise Development Company, LP
*
* Licensed 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.
*/
'use strict';
var path = require('path');
var assert = require('yeoman-assert');
var helpers = require('yeoman-test');
var generator = path.join(__dirname, '../../generators/app');
var modules = ['gerrit', 'license', 'editorconfig'];
var projectBuilder = require('../../generators/app/lib/project_builder');
describe('generator-openstack:app', function () {
beforeEach(function () {
projectBuilder.clear();
});
it('should call all module lifecycle prompts',
function (done) {
var spies = [];
modules.forEach(function (name) {
var module = require('../../generators/app/lib/component/' + name);
spies.push(spyOn(module, 'init').and.callThrough());
spies.push(spyOn(module, 'prompt').and.callThrough());
spies.push(spyOn(module, 'configure').and.callThrough());
});
helpers.run(generator)
.withArguments(['--non-interactive'])
.on('end', function () {
spies.forEach(function (spy) {
expect(spy.calls.any()).toBeTruthy();
});
done();
});
});
it('should force overwrite if --non-interactive is set.',
function (done) {
helpers.run(generator)
.withArguments(['--non-interactive'])
.on('ready', function (generator) {
expect(generator.conflicter.force).toBeTruthy();
})
.on('end', function () {
done();
});
});
describe('writing()', function () {
it('should create all files created in the project builder',
function (done) {
helpers.run(generator)
.withArguments(['--non-interactive'])
.on('end', function () {
assert.file(['package.json']);
done();
});
});
it('should write any files provided to the content builder',
function (done) {
projectBuilder.writeFile('test.json', function () {
return 'foo';
});
projectBuilder.writeFile('test_null.json', function () {
// do nothing.
});
projectBuilder.writeFile('test_empty.json', function () {
return '';
});
projectBuilder.writeFile('test_static.json', 'static_content');
projectBuilder.writeFile('test_undefined.json');
helpers.run(generator)
.withArguments(['--non-interactive'])
.on('end', function () {
assert.file(['test.json', 'test_static.json', 'test_empty.json', 'test_null.json',
'test_undefined.json']);
done();
});
});
it('should delete all files flagged in the project builder',
function (done) {
projectBuilder.removeFile('test.json');
helpers.run(generator)
.withArguments(['--non-interactive'])
.on('end', function () {
assert.noFile(['test.json']);
done();
});
});
});
});

View File

@ -1,87 +0,0 @@
/*
* Copyright (c) 2016 Hewlett Packard Enterprise Development Company, LP
*
* Licensed 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.
*/
'use strict';
var libDir = '../../../../generators/app/lib';
var editorconfig = require(libDir + '/component/editorconfig');
var projectBuilder = require(libDir + '/project_builder');
var mocks = require('../../../helpers/mocks');
var mockGenerator;
describe('generator-openstack:lib/component/editorconfig', function () {
beforeEach(function () {
mockGenerator = mocks.buildGenerator();
projectBuilder.clear();
});
it('should define init, prompt, and configure',
function () {
expect(typeof editorconfig.init).toBe('function');
expect(typeof editorconfig.prompt).toBe('function');
expect(typeof editorconfig.configure).toBe('function');
});
describe('init()', function () {
it('should return a generator',
function () {
var outputGenerator = editorconfig.init(mockGenerator);
expect(outputGenerator).toEqual(mockGenerator);
});
it('should do nothing',
function () {
var spy = spyOn(mockGenerator.config, 'defaults');
editorconfig.init(mockGenerator);
expect(spy.calls.any()).toBeFalsy();
});
});
describe('prompt()', function () {
it('should return a generator',
function () {
var outputGenerator = editorconfig.prompt(mockGenerator);
expect(outputGenerator).toEqual(mockGenerator);
});
it('should do nothing',
function () {
var spy = spyOn(mockGenerator, 'prompt');
editorconfig.prompt(mockGenerator);
expect(spy.calls.any()).toBeFalsy();
});
});
describe('configure()', function () {
it('should return a generator',
function () {
var outputGenerator = editorconfig.configure(mockGenerator);
expect(outputGenerator).toEqual(mockGenerator);
});
it('should add editorconfig to the project files.',
function () {
editorconfig.configure(mockGenerator);
var files = projectBuilder.getIncludedFiles();
expect(files.length).toBe(1);
expect(files[0].from).toBe('.editorconfig');
expect(files[0].to).toBe('.editorconfig');
});
});
});

View File

@ -1,263 +0,0 @@
/*
* Copyright (c) 2016 Hewlett Packard Enterprise Development Company, LP
*
* Licensed 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.
*/
'use strict';
var libDir = '../../../../generators/app/lib';
var mockGenerator;
var mockEslintIgnore = ['node_modules', 'bower_components', 'dist'];
var eslint = require(libDir + '/component/eslint');
var pkgBuilder = require(libDir + '/pkg_builder');
var projectBuilder = require(libDir + '/project_builder');
var mocks = require('../../../helpers/mocks');
var yaml = require('js-yaml');
describe('generator-openstack:lib/component/eslint', function () {
beforeEach(function () {
mockGenerator = mocks.buildGenerator();
mockGenerator.fs.write('.eslintignore', mockEslintIgnore.join('\n'));
projectBuilder.clear();
});
it('should define init, prompt, and configure',
function () {
expect(typeof eslint.init).toBe('function');
expect(typeof eslint.prompt).toBe('function');
expect(typeof eslint.configure).toBe('function');
});
describe('init()', function () {
it('should return a generator',
function () {
var outputGenerator = eslint.init(mockGenerator);
expect(outputGenerator).toEqual(mockGenerator);
});
it('should not interact with config',
function () {
var spy = spyOn(mockGenerator.config, 'defaults');
eslint.init(mockGenerator);
expect(spy.calls.any()).toBeFalsy();
});
});
describe('prompt()', function () {
it('should return a generator',
function () {
var outputGenerator = eslint.prompt(mockGenerator);
expect(outputGenerator).toEqual(mockGenerator);
});
it('should add eslint and eslint-config-openstack to the project',
function () {
pkgBuilder.fromJSON('{"devDependencies":{}}');
var devDeps = pkgBuilder.getValue('devDependencies');
expect(devDeps.eslint).not.toBeDefined();
expect(devDeps['eslint-config-openstack']).not.toBeDefined();
eslint.prompt(mockGenerator);
devDeps = pkgBuilder.getValue('devDependencies');
expect(devDeps.eslint).toBeDefined();
expect(devDeps['eslint-config-openstack']).toBeDefined();
});
it('should add the lint command to the project',
function () {
pkgBuilder.fromJSON('{}');
var scripts = pkgBuilder.getValue('scripts');
expect(scripts).not.toBeDefined();
eslint.prompt(mockGenerator);
var newScripts = pkgBuilder.getValue('scripts');
expect(newScripts.lint).toBeDefined();
expect(newScripts.lint).toEqual('eslint ./');
});
});
describe('configure()', function () {
it('should return a generator',
function () {
var outputGenerator = eslint.configure(mockGenerator);
expect(outputGenerator).toEqual(mockGenerator);
});
it('should add .eslintrc and .eslintignore to the project files.',
function () {
eslint.configure(mockGenerator);
var files = projectBuilder.getIncludedFiles();
expect(files.length).toBe(2);
expect(files[0].to).toBe('.eslintignore');
expect(files[1].to).toBe('.eslintrc');
});
});
describe('.eslintrc management', function () {
var mockEslintRc = {
extends: 'openstack',
plugins: ['angular']
};
it('should write a .eslintrc file as valid .yaml',
function () {
eslint.init(mockGenerator);
eslint.configure(mockGenerator);
var files = projectBuilder.getIncludedFiles();
var eslintRcRef = files[1];
expect(eslintRcRef.to).toBe('.eslintrc');
expect(yaml.safeLoad(eslintRcRef.content()))
.toEqual({extends: 'openstack'});
});
it('should echo back existing .eslintrc',
function () {
var yamlContent = yaml.safeDump(mockEslintRc);
mockGenerator.fs.write('.eslintrc', yamlContent);
eslint.init(mockGenerator);
eslint.configure(mockGenerator);
var files = projectBuilder.getIncludedFiles();
var eslintRcRef = files[1];
var eslintContent = yaml.safeLoad(eslintRcRef.content());
expect(mockEslintRc).toEqual(eslintContent);
});
it('should convert a json .eslintrc to yaml',
function () {
mockGenerator.fs.write('.eslintrc', JSON.stringify(mockEslintRc));
eslint.init(mockGenerator);
eslint.configure(mockGenerator);
var files = projectBuilder.getIncludedFiles();
var eslintRcRef = files[1];
var eslintContent = yaml.safeLoad(eslintRcRef.content());
expect(mockEslintRc).toEqual(eslintContent);
});
});
describe('.eslintignore management', function () {
it('should echo back existing .eslintignore',
function () {
mockGenerator.fs.write('.eslintignore', mockEslintIgnore.join('\n'));
eslint.init(mockGenerator);
eslint.prompt(mockGenerator);
eslint.configure(mockGenerator);
var files = projectBuilder.getIncludedFiles();
var ignoreRef = files[0];
var ignoreContent = ignoreRef.content().split('\n');
expect(ignoreContent.length).toBe(mockEslintIgnore.length);
ignoreContent.forEach(function (item) {
expect(mockEslintIgnore.indexOf(item)).not.toBe(-1);
});
});
it('should include any files flagged as ignored in the project builder.',
function () {
mockGenerator.fs.write('.eslintignore', '');
projectBuilder.ignoreFile('foo/bar.json');
eslint.init(mockGenerator);
eslint.prompt(mockGenerator);
eslint.configure(mockGenerator);
var files = projectBuilder.getIncludedFiles();
var ignoreRef = files[0]; // There should only be one file.
var ignoreContent = ignoreRef.content().split('\n');
expect(ignoreContent.length).toBe(1);
expect(ignoreContent[0]).toBe('foo/bar.json');
});
it('should de-duplicate file paths from multiple locations.',
function () {
// include 'node_modules' from both an existing file and from the project builder.
mockGenerator.fs.write('.eslintignore', ['node_modules'].join('\n'));
projectBuilder.ignoreFile('node_modules');
eslint.init(mockGenerator);
eslint.prompt(mockGenerator);
eslint.configure(mockGenerator);
var files = projectBuilder.getIncludedFiles();
var ignoreRef = files[0]; // There should only be one file.
var ignoreContent = ignoreRef.content().split('\n');
expect(ignoreContent.length).toBe(1);
expect(ignoreContent[0]).toBe('node_modules');
});
it('should sort the ignored files.',
function () {
mockGenerator.fs.write('.eslintignore', mockEslintIgnore.join('\n'));
eslint.init(mockGenerator);
eslint.prompt(mockGenerator);
eslint.configure(mockGenerator);
var files = projectBuilder.getIncludedFiles();
var ignoreRef = files[0];
var ignoreContent = ignoreRef.content().split('\n');
expect(ignoreContent[0]).toBe('bower_components');
expect(ignoreContent[1]).toBe('dist');
expect(ignoreContent[2]).toBe('node_modules');
});
it('should remove any whitespace from the existing .eslintignore',
function () {
mockGenerator.fs.write('.eslintignore', ['1_one', '', '2_two', ''].join('\n'));
eslint.init(mockGenerator);
eslint.prompt(mockGenerator);
eslint.configure(mockGenerator);
var files = projectBuilder.getIncludedFiles();
var ignoreRef = files[0];
var ignoreContent = ignoreRef.content().split('\n');
expect(ignoreContent.length).toBe(2);
expect(ignoreContent[0]).toBe('1_one');
expect(ignoreContent[1]).toBe('2_two');
});
it('should delete the file if there\'s nothing to ignore', function () {
mockGenerator.fs.write('.eslintignore', '');
eslint.init(mockGenerator);
eslint.prompt(mockGenerator);
eslint.configure(mockGenerator);
var files = projectBuilder.getIncludedFiles();
expect(files.length).toBe(1);
expect(files[0].to).not.toBe('.eslintignore');
var rmFiles = projectBuilder.getExcludedFiles();
expect(rmFiles.length).toBe(1);
expect(rmFiles[0]).toBe('.eslintignore');
});
});
});

View File

@ -1,272 +0,0 @@
/*
* Copyright (c) 2016 Hewlett Packard Enterprise Development Company, LP
*
* Licensed 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.
*/
'use strict';
var libDir = '../../../../generators/app/lib';
var ini = require('ini');
var gerrit = require(libDir + '/component/gerrit');
var projectBuilder = require(libDir + '/project_builder');
var pkgBuilder = require(libDir + '/pkg_builder');
var mocks = require('../../../helpers/mocks');
var iniFile = {
gerrit: {
host: 'review.example.org',
port: '1000',
project: 'openstack/test-project.git'
}
};
/**
* Assert that the gerrit file content matches the passed structure.
*
* @param {object} content The expected data structure.
* @returns {void}
*/
function expectGerritFileContent (content) {
var files = projectBuilder.getIncludedFiles();
// get the .gitreview file
var gitreview = null;
files.forEach(function (fileRef) {
if (fileRef.to === '.gitreview') {
gitreview = ini.parse(fileRef.content());
}
});
// Test the content
expect(gitreview).toBeTruthy();
expect(gitreview).toEqual(content);
}
describe('generator-openstack:lib/component/gerrit', function () {
beforeEach(function () {
projectBuilder.clear();
});
afterEach(function () {
pkgBuilder.fromJSON(JSON.stringify({}));
});
describe('api', function () {
it('should define init, prompt, and configure',
function () {
expect(typeof gerrit.init).toBe('function');
expect(typeof gerrit.prompt).toBe('function');
expect(typeof gerrit.configure).toBe('function');
});
});
describe('runtime', function () {
it('should not create a new file if one does not exist already.',
function () {
// No answers, non-interactive run.
var mockAnswers = {};
var generator = mocks.buildGenerator(null, mockAnswers);
generator.fs.delete('.gitreview');
gerrit.init(generator);
gerrit.prompt(generator);
gerrit.configure(generator);
expect(generator.fs.exists('.gitreview')).toBeFalsy();
});
it('should not delete a file if one exists.',
function () {
// No answers, non-interactive run.
var mockAnswers = {};
var generator = mocks.buildGenerator(null, mockAnswers);
generator.fs.write('.gitreview', ini.stringify(iniFile));
// Set defaults
gerrit.init(generator);
gerrit.prompt(generator);
gerrit.configure(generator);
expect(generator.fs.exists('.gitreview')).toBeTruthy();
});
it('should write default values if a new file is requested.',
function () {
// No answers, non-interactive run.
var mockAnswers = {enableGerrit: true};
var generator = mocks.buildGenerator(null, mockAnswers);
pkgBuilder.fromJSON(JSON.stringify({name: 'generator-openstack'}));
generator.fs.delete('.gitreview');
// Set defaults
gerrit.init(generator);
gerrit.prompt(generator);
gerrit.configure(generator);
expectGerritFileContent({
gerrit: {
host: 'review.openstack.org',
port: '29418',
project: 'openstack/generator-openstack.git'
}
});
});
it('should read the default project name from the package builder.',
function () {
// No answers, non-interactive run.
var mockAnswers = {enableGerrit: true};
pkgBuilder.fromJSON(JSON.stringify({name: 'foo'}));
var generator = mocks.buildGenerator(null, mockAnswers);
generator.fs.delete('.gitreview');
// Set defaults
gerrit.init(generator);
gerrit.prompt(generator);
gerrit.configure(generator);
expectGerritFileContent({
gerrit: {
host: 'review.openstack.org',
port: '29418',
project: 'openstack/foo.git'
}
});
});
});
describe('init()', function () {
it('should return a generator',
function () {
var generator = mocks.buildGenerator();
var outputGenerator = gerrit.init(generator);
expect(outputGenerator).toEqual(generator);
});
});
describe('prompt()', function () {
it('should return a promise that resolves with a generator',
function () {
var generator = mocks.buildGenerator();
var outputPromise = gerrit.prompt(generator);
outputPromise.then(function (outputGenerator) {
expect(outputGenerator).toEqual(generator);
});
});
it('should not show a prompt if non-interactive is set',
function () {
var generator = mocks.buildGenerator(null, null,
{'non-interactive': true});
var promptSpy = spyOn(generator, 'prompt');
generator.fs.write('.gitreview', ini.stringify(iniFile));
gerrit.init(generator);
gerrit.prompt(generator);
expect(promptSpy.calls.any()).toBeFalsy();
});
it('should use defaults in .gitreview if no answers provided',
function () {
var generator = mocks.buildGenerator();
generator.fs.write('.gitreview', ini.stringify(iniFile));
gerrit.init(generator);
gerrit.prompt(generator);
gerrit.configure(generator);
expectGerritFileContent(iniFile);
});
it('should configure answers if answers provided',
function () {
var config = {};
var mockAnswers = {
enableGerrit: true,
gerritHost: 'review.example.org',
gerritPort: '1000',
gerritProject: 'openstack/test.git'
};
var generator = mocks.buildGenerator(config, mockAnswers);
// Set defaults
gerrit.init(generator);
gerrit.prompt(generator);
gerrit.configure(generator);
expectGerritFileContent({
gerrit: {
host: mockAnswers.gerritHost,
port: mockAnswers.gerritPort,
project: mockAnswers.gerritProject
}
});
});
});
describe('configure()', function () {
it('should return a generator',
function () {
var generator = mocks.buildGenerator();
var outputGenerator = gerrit.init(generator);
expect(outputGenerator).toEqual(generator);
});
it('should create a .gitreview file if enabled',
function () {
var generator = mocks.buildGenerator(null, {enableGerrit: true});
pkgBuilder.fromJSON(JSON.stringify({name: 'generator-openstack'}));
// Make sure we don't have something left over from another test.
generator.fs.delete('.gitreview');
gerrit.init(generator);
gerrit.prompt(generator);
gerrit.configure(generator);
expectGerritFileContent({
gerrit: {
host: 'review.openstack.org',
port: '29418',
project: 'openstack/generator-openstack.git'
}
});
var excludedFiles = projectBuilder.getExcludedFiles();
expect(excludedFiles.length).toBe(0);
});
it('should delete a .gitreview file if disabled',
function () {
var generator = mocks.buildGenerator(null, {enableGerrit: false});
gerrit.init(generator);
gerrit.prompt(generator);
gerrit.configure(generator);
var includedFiles = projectBuilder.getIncludedFiles();
expect(includedFiles.length).toBe(0);
var excludedFiles = projectBuilder.getExcludedFiles();
expect(excludedFiles.length).toBe(1);
expect(excludedFiles[0]).toBe('.gitreview');
});
});
});

View File

@ -1,222 +0,0 @@
/*
* Copyright (c) 2016 Hewlett Packard Enterprise Development Company, LP
*
* Licensed 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.
*/
'use strict';
var libDir = '../../../../generators/app/lib';
var gitignore = require(libDir + '/component/gitignore');
var projectBuilder = require(libDir + '/project_builder');
var mocks = require('../../../helpers/mocks');
var mockGenerator;
describe('generator-openstack:lib/component/gitignore', function () {
beforeEach(function () {
mockGenerator = mocks.buildGenerator();
projectBuilder.clear();
});
it('should define init, prompt, and configure',
function () {
expect(typeof gitignore.init).toBe('function');
expect(typeof gitignore.prompt).toBe('function');
expect(typeof gitignore.configure).toBe('function');
});
describe('init()', function () {
it('should return a generator',
function () {
var outputGenerator = gitignore.init(mockGenerator);
expect(outputGenerator).toEqual(mockGenerator);
});
it('should not interact with config',
function () {
var spy = spyOn(mockGenerator.config, 'defaults');
gitignore.init(mockGenerator);
expect(spy.calls.any()).toBeFalsy();
});
});
describe('prompt()', function () {
it('should return a generator',
function () {
var outputGenerator = gitignore.prompt(mockGenerator);
expect(outputGenerator).toEqual(mockGenerator);
});
it('should do nothing',
function () {
var spy = spyOn(mockGenerator, 'prompt');
gitignore.init(mockGenerator);
gitignore.prompt(mockGenerator);
expect(spy.calls.any()).toBeFalsy();
});
});
describe('configure()', function () {
it('should return a generator',
function () {
var outputGenerator = gitignore.configure(mockGenerator);
expect(outputGenerator).toEqual(mockGenerator);
});
it('should add gitignore to the project files.',
function () {
mockGenerator.fs.write('.gitignore', ['one', 'two'].join('\n'));
gitignore.init(mockGenerator);
gitignore.prompt(mockGenerator);
gitignore.configure(mockGenerator);
var files = projectBuilder.getIncludedFiles();
expect(files.length).toBe(1);
expect(files[0].to).toBe('.gitignore');
});
});
describe('.gitignore management', function () {
it('should echo back existing .gitignore',
function () {
mockGenerator.fs.write('.gitignore', ['one', 'two'].join('\n'));
gitignore.init(mockGenerator);
gitignore.prompt(mockGenerator);
gitignore.configure(mockGenerator);
var files = projectBuilder.getIncludedFiles();
var ignoreRef = files[0];
var ignoreContent = ignoreRef.content().split('\n');
expect(ignoreContent.length).toBe(2);
expect(ignoreContent[0]).toEqual('one');
expect(ignoreContent[1]).toEqual('two');
});
it('should include any files flagged as ignored in the project builder.',
function () {
mockGenerator.fs.write('.gitignore', '');
projectBuilder.ignoreFile('foo/bar.json');
gitignore.init(mockGenerator);
gitignore.prompt(mockGenerator);
gitignore.configure(mockGenerator);
var files = projectBuilder.getIncludedFiles();
var ignoreRef = files[0]; // There should only be one file.
var ignoreContent = ignoreRef.content().split('\n');
expect(ignoreContent.length).toBe(1);
expect(ignoreContent[0]).toBe('foo/bar.json');
});
it('should de-duplicate file paths from multiple locations.',
function () {
// include 'node_modules' from both an existing file and from the project builder.
mockGenerator.fs.write('.gitignore', ['node_modules'].join('\n'));
projectBuilder.ignoreFile('node_modules');
gitignore.init(mockGenerator);
gitignore.prompt(mockGenerator);
gitignore.configure(mockGenerator);
var files = projectBuilder.getIncludedFiles();
var ignoreRef = files[0]; // There should only be one file.
var ignoreContent = ignoreRef.content().split('\n');
expect(ignoreContent.length).toBe(1);
expect(ignoreContent[0]).toBe('node_modules');
});
it('should sort the ignored files.',
function () {
mockGenerator.fs.write('.gitignore', ['b_line', 'a_line'].join('\n'));
gitignore.init(mockGenerator);
gitignore.prompt(mockGenerator);
gitignore.configure(mockGenerator);
var files = projectBuilder.getIncludedFiles();
var ignoreRef = files[0];
var ignoreContent = ignoreRef.content().split('\n');
expect(ignoreContent.length).toBe(2);
expect(ignoreContent[0]).toBe('a_line');
expect(ignoreContent[1]).toBe('b_line');
});
it('should remove any whitespace from the existing .gitignore',
function () {
mockGenerator.fs.write('.gitignore', ['1_one', '', '2_two', ''].join('\n'));
gitignore.init(mockGenerator);
gitignore.prompt(mockGenerator);
gitignore.configure(mockGenerator);
var files = projectBuilder.getIncludedFiles();
var ignoreRef = files[0];
var ignoreContent = ignoreRef.content().split('\n');
expect(ignoreContent.length).toBe(2);
expect(ignoreContent[0]).toBe('1_one');
expect(ignoreContent[1]).toBe('2_two');
});
it('should remove any comments from the existing .gitignore',
function () {
mockGenerator.fs.write('.gitignore', ['1_one', '# comment', ' #comment'].join('\n'));
gitignore.init(mockGenerator);
gitignore.prompt(mockGenerator);
gitignore.configure(mockGenerator);
var files = projectBuilder.getIncludedFiles();
var ignoreRef = files[0];
var ignoreContent = ignoreRef.content().split('\n');
expect(ignoreContent.length).toBe(1);
expect(ignoreContent[0]).toBe('1_one');
});
it('should deduplicate content',
function () {
mockGenerator.fs.write('.gitignore', ['1_one', '1_one'].join('\n'));
gitignore.init(mockGenerator);
gitignore.prompt(mockGenerator);
gitignore.configure(mockGenerator);
var files = projectBuilder.getIncludedFiles();
var ignoreRef = files[0];
var ignoreContent = ignoreRef.content().split('\n');
expect(ignoreContent.length).toBe(1);
expect(ignoreContent[0]).toBe('1_one');
});
it('should delete the file if there\'s nothing to ignore', function () {
mockGenerator.fs.write('.gitignore', '');
gitignore.init(mockGenerator);
gitignore.prompt(mockGenerator);
gitignore.configure(mockGenerator);
var files = projectBuilder.getIncludedFiles();
expect(files.length).toBe(0);
var rmFiles = projectBuilder.getExcludedFiles();
expect(rmFiles.length).toBe(1);
expect(rmFiles[0]).toBe('.gitignore');
});
});
});

View File

@ -1,96 +0,0 @@
/*
* Copyright (c) 2016 Hewlett Packard Enterprise Development Company, LP
*
* Licensed 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.
*/
'use strict';
var libDir = '../../../../generators/app/lib';
var license = require(libDir + '/component/license');
var projectBuilder = require(libDir + '/project_builder');
var pkgBuilder = require(libDir + '/pkg_builder');
var mocks = require('../../../helpers/mocks');
var mockGenerator;
describe('generator-openstack:lib/component/license', function () {
beforeEach(function () {
mockGenerator = mocks.buildGenerator();
projectBuilder.clear();
});
it('should define init, prompt, and configure',
function () {
expect(typeof license.init).toBe('function');
expect(typeof license.prompt).toBe('function');
expect(typeof license.configure).toBe('function');
});
describe('init()', function () {
it('should return a generator',
function () {
var outputGenerator = license.init(mockGenerator);
expect(outputGenerator).toEqual(mockGenerator);
});
it('should do nothing',
function () {
var spy = spyOn(mockGenerator.config, 'defaults');
license.init(mockGenerator);
expect(spy.calls.any()).toBeFalsy();
});
});
describe('prompt()', function () {
it('should return a generator',
function () {
var outputGenerator = license.prompt(mockGenerator);
expect(outputGenerator).toEqual(mockGenerator);
});
it('should do nothing',
function () {
var spy = spyOn(mockGenerator, 'prompt');
license.prompt(mockGenerator);
expect(spy.calls.any()).toBeFalsy();
});
});
describe('configure()', function () {
it('should return a generator',
function () {
var outputGenerator = license.configure(mockGenerator);
expect(outputGenerator).toEqual(mockGenerator);
});
it('should add license to the project files.',
function () {
license.configure(mockGenerator);
var files = projectBuilder.getIncludedFiles();
expect(files.length).toBe(1);
expect(files[0].from).toBe('LICENSE');
expect(files[0].to).toBe('LICENSE');
});
it('should add license to the package.json files.',
function () {
license.configure(mockGenerator);
var parsedResult = JSON.parse(pkgBuilder.toJSON());
expect(parsedResult.license).toBe("Apache-2.0");
});
});
});

View File

@ -1,108 +0,0 @@
/*
* Copyright (c) 2016 Hewlett Packard Enterprise Development Company, LP
*
* Licensed 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.
*/
'use strict';
var libDir = '../../../../generators/app/lib';
var nsp = require(libDir + '/component/nsp');
var projectBuilder = require(libDir + '/project_builder');
var pkgBuilder = require(libDir + '/pkg_builder');
var mocks = require('../../../helpers/mocks');
var mockGenerator;
describe('generator-openstack:lib/component/nsp', function () {
beforeEach(function () {
mockGenerator = mocks.buildGenerator();
projectBuilder.clear();
});
it('should define init, prompt, and configure',
function () {
expect(typeof nsp.init).toBe('function');
expect(typeof nsp.prompt).toBe('function');
expect(typeof nsp.configure).toBe('function');
});
describe('init()', function () {
it('should return a generator',
function () {
var outputGenerator = nsp.init(mockGenerator);
expect(outputGenerator).toEqual(mockGenerator);
});
it('should do nothing',
function () {
var spy = spyOn(mockGenerator.config, 'defaults');
nsp.init(mockGenerator);
expect(spy.calls.any()).toBeFalsy();
});
});
describe('prompt()', function () {
it('should return a generator',
function () {
var outputGenerator = nsp.prompt(mockGenerator);
expect(outputGenerator).toEqual(mockGenerator);
});
it('should add nsp to dependencies',
function () {
pkgBuilder.fromJSON('{"devDependencies":{}}');
var devDeps = pkgBuilder.getValue('devDependencies');
expect(devDeps.nsp).not.toBeDefined();
nsp.prompt(mockGenerator);
devDeps = pkgBuilder.getValue('devDependencies');
expect(devDeps.nsp).toBeDefined();
});
it('should add the prepublish hook to the project',
function () {
pkgBuilder.fromJSON('{}');
var scripts = pkgBuilder.getValue('scripts');
expect(scripts).not.toBeDefined();
nsp.prompt(mockGenerator);
var newScripts = pkgBuilder.getValue('scripts');
expect(newScripts.prepublish).toBeDefined();
expect(newScripts.prepublish).toEqual('nsp check');
});
});
describe('configure()', function () {
it('should return a generator',
function () {
var outputGenerator = nsp.configure(mockGenerator);
expect(outputGenerator).toEqual(mockGenerator);
});
it('should add .nsprc to the project files.',
function () {
nsp.configure(mockGenerator);
var files = projectBuilder.getIncludedFiles();
expect(files.length).toBe(1);
expect(files[0].from).toBe('.nsprc');
expect(files[0].to).toBe('.nsprc');
});
});
});

View File

@ -1,189 +0,0 @@
/*
* Copyright (c) 2016 Hewlett Packard Enterprise Development Company, LP
*
* Licensed 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.
*/
'use strict';
var libDir = '../../../../generators/app/lib';
var pkg = require(libDir + '/component/pkg');
var projectBuilder = require(libDir + '/project_builder');
var pkgBuilder = require(libDir + '/pkg_builder');
var mocks = require('../../../helpers/mocks');
var mockGenerator;
var packageFile = {};
describe('generator-openstack:lib/component/pkg', function () {
beforeEach(function () {
mockGenerator = mocks.buildGenerator();
projectBuilder.clear();
jasmine.clock().install();
});
afterEach(function () {
jasmine.clock().uninstall();
});
it('should define init, prompt, and configure',
function () {
expect(typeof pkg.init).toBe('function');
expect(typeof pkg.prompt).toBe('function');
expect(typeof pkg.configure).toBe('function');
});
describe('init()', function () {
it('should return a generator',
function () {
var outputGenerator = pkg.init(mockGenerator);
expect(outputGenerator).toEqual(mockGenerator);
});
it('should read an existing package.json file into the package builder',
function () {
mockGenerator.fs.writeJSON("package.json", {name: "foo"});
pkg.init(mockGenerator);
var output = JSON.parse(pkgBuilder.toJSON());
expect(output.name).toBe('foo');
});
it('should add several files to the ignore list.',
function () {
pkg.init(mockGenerator);
var ignoredFiles = projectBuilder.getIgnoredFiles();
expect(ignoredFiles.indexOf('node_modules')).not.toBe(-1);
expect(ignoredFiles.indexOf('npm-debug.log')).not.toBe(-1);
expect(ignoredFiles.indexOf('package')).not.toBe(-1);
expect(ignoredFiles.indexOf('.npm')).not.toBe(-1);
});
});
describe('prompt()', function () {
it('should return a promise that resolves with a generator',
function () {
var generator = mocks.buildGenerator();
var outputPromise = pkg.prompt(generator);
outputPromise.then(function (outputGenerator) {
expect(outputGenerator).toEqual(generator);
});
});
it('should revert to config defaults if no answers provided',
function () {
var config = {};
var mockAnswers = {};
var generator = mocks.buildGenerator(config, mockAnswers);
// Start with a blank package file.
generator.fs.write('package.json', JSON.stringify({}));
// Set defaults
pkg.init(generator);
pkg.configure(generator);
pkg.prompt(generator);
// Call the generator
expect(pkgBuilder.getValues()).toEqual({
devDependencies: { istanbul: '^0.4.2', jasmine: '^2.4.1'},
name: generator.appname,
description: null,
version: '0.0.1',
homepage: 'http://www.openstack.org/',
author: 'OpenStack <openstack-dev@lists.openstack.org> (http://www.openstack.org/)'
});
});
it('should not show a prompt if non-interactive is set',
function () {
var generator = mocks.buildGenerator(null, null,
{'non-interactive': true});
var promptSpy = spyOn(generator, 'prompt');
generator.fs.write('package.json', JSON.stringify(packageFile));
pkg.init(generator);
pkg.prompt(generator);
expect(promptSpy.calls.any()).toBeFalsy();
});
it('should use defaults in package.json if no answers provided',
function () {
var generator = mocks.buildGenerator();
var mockPackage = {
devDependencies: { istanbul: '^0.4.2', jasmine: '^2.4.1'},
name: 'name',
description: 'description',
version: '0.0.1',
homepage: 'http://www.openstack.org/',
author: 'OpenStack <openstack-dev@lists.openstack.org> (http://www.openstack.org/)'
};
generator.fs.write('package.json', JSON.stringify(mockPackage));
pkg.init(generator);
pkg.configure(generator);
pkg.prompt(generator);
expect(pkgBuilder.getValues()).toEqual(mockPackage);
});
it('should configure answers if answers provided',
function () {
var config = {};
var mockAnswers = {
devDependencies: { istanbul: '^0.4.2', jasmine: '^2.4.1'},
name: 'name',
description: 'description',
version: '1.0.0',
homepage: 'http://example.openstack.org/',
author: 'Example Author'
};
var generator = mocks.buildGenerator(config, mockAnswers);
// Start with a blank package file.
generator.fs.write('package.json', JSON.stringify({}));
// Set defaults
pkg.init(generator);
pkg.prompt(generator);
pkg.configure(generator);
expect(pkgBuilder.getValues()).toEqual(mockAnswers);
});
});
describe('configure()', function () {
it('should return a generator',
function () {
var outputGenerator = pkg.configure(mockGenerator);
expect(outputGenerator).toEqual(mockGenerator);
});
it('should add package.json to the project files.',
function () {
pkg.configure(mockGenerator);
var files = projectBuilder.getIncludedFiles();
expect(files.length).toBe(1);
expect(files[0].to).toBe('package.json');
expect(files[0].content).toBe(pkgBuilder.toJSON);
});
});
});

View File

@ -1,181 +0,0 @@
/*
* Copyright (c) 2016 Hewlett Packard Enterprise Development Company, LP
*
* Licensed 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.
*/
'use strict';
var libDir = '../../../../generators/app/lib';
var structure = require(libDir + '/component/structure');
var projectBuilder = require(libDir + '/project_builder');
var mocks = require('../../../helpers/mocks');
var mockGenerator;
var expectedDefaults = {
engine: 'browser',
language: 'es5',
srcDir: './src',
distDir: './dist',
testDir: './test'
};
describe('generator-openstack:lib/component/structure', function () {
beforeEach(function () {
mockGenerator = mocks.buildGenerator();
jasmine.clock().install();
});
afterEach(function () {
jasmine.clock().uninstall();
});
it('should define init, prompt, and configure',
function () {
expect(typeof structure.init).toBe('function');
expect(typeof structure.prompt).toBe('function');
expect(typeof structure.configure).toBe('function');
});
describe('init()', function () {
it('should return a generator',
function () {
var outputGenerator = structure.init(mockGenerator);
expect(outputGenerator).toEqual(mockGenerator);
});
it('should set configuration defaults',
function () {
var spy = spyOn(mockGenerator.config, 'defaults');
structure.init(mockGenerator);
expect(spy).toHaveBeenCalledWith(expectedDefaults);
});
});
describe('prompt()', function () {
it('should return a promise that resolves with a generator',
function () {
var generator = mocks.buildGenerator();
var outputPromise = structure.prompt(generator);
outputPromise.then(function (outputGenerator) {
expect(outputGenerator).toEqual(generator);
});
});
it('should revert to config defaults if no answers provided',
function () {
var config = {};
var mockAnswers = {};
var generator = mocks.buildGenerator(config, mockAnswers);
// Call the component
structure.init(generator);
structure.prompt(generator);
structure.configure(generator);
Object.keys(expectedDefaults).forEach(function (key) {
expect(generator.config.get(key)).toEqual(expectedDefaults[key]);
});
});
it('should not show a prompt if non-interactive is set',
function () {
var generator = mocks.buildGenerator(null, null, {'non-interactive': true});
var promptSpy = spyOn(generator, 'prompt');
structure.init(generator);
structure.prompt(generator);
expect(promptSpy.calls.any()).toBeFalsy();
});
it('should configure answers if answers provided',
function () {
var config = {};
var mockAnswers = {
language: 'es6',
srcDir: './dir',
distDir: './foo',
testDir: './bar'
};
var generator = mocks.buildGenerator(config, mockAnswers);
// Set defaults
structure.init(generator);
structure.prompt(generator);
structure.configure(generator);
Object.keys(mockAnswers).forEach(function (key) {
expect(generator.config.get(key)).toEqual(mockAnswers[key]);
});
});
it('should not configure the dist directory for a node project',
function () {
var config = {};
var mockAnswers = {
engine: 'node',
distDir: './foo' // This answer should never be read.
};
var generator = mocks.buildGenerator(config, mockAnswers);
// Set defaults
structure.init(generator);
structure.prompt(generator);
structure.configure(generator);
expect(generator.config.get('distDir')).not.toBe(mockAnswers.distDir);
});
it('should configure the dist directory for a browser project',
function () {
var config = {};
var mockAnswers = {
engine: 'browser',
distDir: './foo' // This answer should never be read.
};
var generator = mocks.buildGenerator(config, mockAnswers);
// Set defaults
structure.init(generator);
structure.prompt(generator);
structure.configure(generator);
expect(generator.config.get('distDir')).toBe(mockAnswers.distDir);
});
});
describe('configure()', function () {
it('should return a generator',
function () {
var outputGenerator = structure.configure(mockGenerator);
expect(outputGenerator).toEqual(mockGenerator);
});
it('should add the dist directory to the ignoreFile.',
function () {
var ignoreSpy = spyOn(projectBuilder, 'ignoreFile');
var generator = mocks.buildGenerator();
structure.init(generator);
structure.prompt(generator);
structure.configure(generator);
expect(ignoreSpy).toHaveBeenCalledWith('./dist');
});
});
});

View File

@ -1,94 +0,0 @@
/*
* Copyright (c) 2016 Hewlett Packard Enterprise Development Company, LP
*
* Licensed 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.
*/
'use strict';
var builder = require('../../../generators/app/lib/global_dependencies');
var globals = require('../../../global-dependencies.json');
var semver = require('semver');
describe('lib/global_dependencies', function () {
describe('data', function () {
it('should contain all dependencies from the root global-dependencies.json',
function () {
for (var key in globals) {
if (globals.hasOwnProperty(key)) {
expect(builder.contains(key)).toBe(true);
}
}
});
it('should contain valid semver versions for all dependencies',
function () {
for (var key in globals) {
if (globals.hasOwnProperty(key)) {
var version = builder.read(key);
expect(semver.validRange(version)).toBeTruthy();
}
}
});
});
describe('contains()', function () {
it('should return true when a dependency exists', function () {
expect(builder.contains('eslint')).toBe(true);
});
it('should return false when a dependency doesn\'t exist', function () {
expect(builder.contains('notarealdependency')).toBe(false);
});
});
describe('read()', function () {
it('should return the version of a dependency', function () {
expect(builder.read('eslint')).toBe(globals.eslint);
});
it('should return undefined when a dependency doesn\'t exist', function () {
expect(builder.read('notarealdependency')).toBeUndefined();
});
});
describe('synchronize()', function () {
it('should update dependencies that are out of date.', function () {
var testDeps = {
eslint: '0.0.1'
};
var newDeps = builder.synchronize(testDeps);
expect(newDeps.eslint).toBeDefined();
expect(newDeps.eslint).not.toEqual(testDeps.eslint);
expect(newDeps.eslint).toEqual(globals.eslint);
});
it('should not update dependencies that are up to date.', function () {
var testDeps = {
eslint: globals.eslint
};
var newDeps = builder.synchronize(testDeps);
expect(newDeps).toEqual(testDeps);
});
it('should not touch unregistered dependencies.', function () {
var testDeps = {
notarealdependency: '0.0.1'
};
var newDeps = builder.synchronize(testDeps);
expect(newDeps.notarealdependency).toEqual(testDeps.notarealdependency);
});
});
});

View File

@ -1,226 +0,0 @@
/*
* Copyright (c) 2016 Hewlett Packard Enterprise Development Company, LP
*
* Licensed 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.
*/
'use strict';
var builder = require('../../../generators/app/lib/pkg_builder');
var dependencies = require('../../../generators/app/lib/global_dependencies');
describe('generator-openstack:lib/pkg_builder', function () {
beforeEach(function () {
builder.fromJSON("{}"); // Clear
});
it('should start as an empty object',
function () {
expect(builder.toJSON()).toBe("{}");
});
it('should honor and echo back any pre-loaded package file',
function () {
var packageString = '{"name":"foo"}';
builder.fromJSON(packageString);
var parsedResult = JSON.parse(builder.toJSON());
expect(parsedResult.name).toBe("foo");
});
it('should permit adding and overriding values.',
function () {
builder.fromJSON('{"name":"foo"}');
builder.setValues({name: "bar", lol: "cat"});
var parsedResult = JSON.parse(builder.toJSON());
expect(parsedResult.name).toBe("bar");
expect(parsedResult.lol).toBe("cat");
});
it('should not add parent prototype values.',
function () {
function Thing () {
}
Thing.prototype.foo = 'bar';
var thing = new Thing();
thing.name = 'bar';
thing.lol = 'cat';
builder.fromJSON('{"name":"foo"}');
builder.setValues(thing);
var parsedResult = JSON.parse(builder.toJSON());
expect(parsedResult.name).toBe("bar");
expect(parsedResult.lol).toBe("cat");
expect(parsedResult.foo).toBeUndefined();
});
describe('toJSON()', function () {
it('should update out-of-date dependencies.',
function () {
var testPackage = {
dependencies: {
eslint: "0.0.1"
},
peerDependencies: {
eslint: "0.0.1"
},
devDependencies: {
eslint: "0.0.1"
}
};
builder.fromJSON(JSON.stringify(testPackage));
var result = JSON.parse(builder.toJSON());
expect(result.dependencies.eslint).toBe(dependencies.read('eslint'));
expect(result.peerDependencies.eslint).toBe(dependencies.read('eslint'));
expect(result.devDependencies.eslint).toBe(dependencies.read('eslint'));
});
it('should not error if no dependencies are declared.',
function () {
var testPackage = {
dependencies: {
eslint: "0.0.1"
}
};
builder.fromJSON(JSON.stringify(testPackage));
var result = JSON.parse(builder.toJSON());
expect(result.dependencies.eslint).toBe(dependencies.read('eslint'));
});
});
describe('getValues()', function () {
it('should permit retrieving the entire package block.',
function () {
builder.fromJSON('{"name":"foo"}');
expect(builder.getValues()).toEqual({name: 'foo'});
});
});
describe('getValue()', function () {
it('should permit retrieving values from the package.',
function () {
builder.fromJSON('{"name":"foo"}');
expect(builder.getValue('name')).toBe('foo');
});
it('should return undefined if the value is not set.',
function () {
builder.fromJSON('{"name":"foo"}');
expect(builder.getValue('invalidname')).toBeUndefined();
});
it('should return a default if provided.',
function () {
builder.fromJSON('{"name":"foo"}');
expect(builder.getValue('invalidname', 'defaultValue'))
.toBe('defaultValue');
});
});
describe('addDependencies()', function () {
var eslintVersion = dependencies.read('eslint');
it('should be able to add to dependencies', function () {
builder.fromJSON('{"dependencies":{}}');
builder.addDependencies('eslint');
expect(builder.getValue('dependencies').eslint).toBe(eslintVersion);
builder.fromJSON('{"dependencies":{}}');
builder.addDependencies(['eslint']);
expect(builder.getValue('dependencies').eslint).toBe(eslintVersion);
builder.fromJSON('{"dependencies":{}}');
builder.addDependencies('eslint', 'dependencies');
expect(builder.getValue('dependencies').eslint).toBe(eslintVersion);
builder.fromJSON('{"dependencies":{}}');
builder.addDependencies(['eslint'], 'dependencies');
expect(builder.getValue('dependencies').eslint).toBe(eslintVersion);
});
it('should be able to add to devDependencies', function () {
builder.fromJSON('{"devDependencies":{}}');
builder.addDependencies('eslint', 'devDependencies');
expect(builder.getValue('devDependencies').eslint).toBe(eslintVersion);
builder.fromJSON('{"devDependencies":{}}');
builder.addDependencies(['eslint'], 'devDependencies');
expect(builder.getValue('devDependencies').eslint).toBe(eslintVersion);
});
it('should be able to add to peerDependencies', function () {
builder.fromJSON('{"peerDependencies":{}}');
builder.addDependencies('eslint', 'peerDependencies');
expect(builder.getValue('peerDependencies').eslint).toBe(eslintVersion);
builder.fromJSON('{"peerDependencies":{}}');
builder.addDependencies(['eslint'], 'peerDependencies');
expect(builder.getValue('peerDependencies').eslint).toBe(eslintVersion);
});
it('should create dependency maps if they don\'t yet exist in the package', function () {
builder.fromJSON('{}');
builder.addDependencies('eslint');
builder.addDependencies('eslint', 'devDependencies');
builder.addDependencies('eslint', 'peerDependencies');
expect(builder.getValue('dependencies')).not.toBeUndefined();
expect(builder.getValue('devDependencies')).not.toBeUndefined();
expect(builder.getValue('peerDependencies')).not.toBeUndefined();
});
it('should not modify things if an invalid section was declared', function () {
builder.fromJSON('{}');
builder.addDependencies('eslint', 'lol');
expect(builder.getValues()).toEqual({});
});
it('should not override an existing dependency declaration', function () {
builder.fromJSON('{"dependencies":{"eslint":"0.0.1"}}');
builder.addDependencies(['eslint'], 'dependencies');
expect(builder.getValue('dependencies').eslint).toEqual('0.0.1');
});
it('should not add a dependency that is not globally managed', function () {
builder.fromJSON('{}');
builder.addDependencies('leftpad');
expect(builder.getValues()).toEqual({dependencies: {}});
});
});
describe('addCommand', function () {
it('should add a command', function () {
builder.fromJSON('{"scripts":{}}');
builder.addCommand('foo', 'bar');
expect(builder.getValue('scripts').foo).toBe('bar');
});
it('should overwrite an existing command', function () {
builder.fromJSON('{"scripts":{"foo":"bar"}}');
builder.addCommand('foo', 'lol');
expect(builder.getValue('scripts').foo).toBe('lol');
});
it('should create the scripts hash if it doesn\'t exist', function () {
builder.fromJSON('{}');
builder.addCommand('foo', 'bar');
expect(builder.getValue('scripts')).toBeDefined();
});
});
});

View File

@ -1,73 +0,0 @@
/*
* Copyright (c) 2016 Hewlett Packard Enterprise Development Company, LP
*
* Licensed 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.
*/
'use strict';
var builder = require('../../../generators/app/lib/project_builder');
describe('generator-openstack:lib/project_builder', function () {
beforeEach(function () {
builder.clear();
});
it('should start with an empty list of included files',
function () {
expect(builder.getIncludedFiles().length).toBe(0);
});
it('should start with an empty list of excluded files',
function () {
expect(builder.getExcludedFiles().length).toBe(0);
});
it('should permit adding a file with only one path.',
function () {
var testFilePath = 'test_path.json';
builder.addFile(testFilePath);
var testFile = builder.getIncludedFiles()[0];
expect(testFile.from).toBe(testFilePath);
expect(testFile.to).toBe(testFilePath);
});
it('should permit adding a file with a different destination path.',
function () {
var testFilePath = 'test_path.json';
var testFileOutput = 'test_path_output.json';
builder.addFile(testFilePath, testFileOutput);
var testFile = builder.getIncludedFiles()[0];
expect(testFile.from).toBe(testFilePath);
expect(testFile.to).toBe(testFileOutput);
});
it('should permit adding a file to the exclusion list',
function () {
var testFilePath = 'test_path.json';
builder.removeFile(testFilePath);
expect(builder.getExcludedFiles()[0]).toBe(testFilePath);
});
it('should permit adding a file to the ignore list',
function () {
var testFilePath = 'test_path.json';
builder.ignoreFile(testFilePath);
expect(builder.getIgnoredFiles()[0]).toBe(testFilePath);
});
});

View File

@ -1,78 +0,0 @@
/*
* Copyright (c) 2016 Hewlett Packard Enterprise Development Company, LP
*
* Licensed 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.
*/
'use strict';
function buildMockGenerator (config, mockAnswers, mockOptions) {
var configDefaults = {};
var memFs = require('mem-fs');
var editor = require('mem-fs-editor');
var store = memFs.create();
config = config || {};
mockAnswers = mockAnswers || {};
mockOptions = mockOptions || {};
return {
fs: editor.create(store),
appname: 'generator-openstack',
async: function () {
return function () {
};
},
config: {
defaults: function (values) {
Object.keys(values).forEach(function (key) {
configDefaults[key] = values[key];
});
},
get: function (value) {
return config[value] || configDefaults[value];
},
set: function (key, value) {
if (typeof key === 'object') {
Object.keys(key).forEach(function (index) {
config[index] = key[index];
});
} else {
config[key] = value;
}
}
},
prompt: function (params, callback) {
var answers = {};
params.forEach(function (param) {
if (param.when && !param.when(answers)) {
return;
}
if (mockAnswers.hasOwnProperty(param.name)) {
answers[param.name] = mockAnswers[param.name];
} else {
answers[param.name] = param.default || null;
}
});
callback(answers);
},
options: mockOptions
};
}
module.exports = {
buildGenerator: buildMockGenerator
};

View File

@ -1,7 +0,0 @@
{
"spec_dir": "spec",
"spec_files": [
"**/*.js",
"!helpers/**/*.js"
]
}