From 10b5c4f956a3c2e8ed3d144464ac915e267ee9be Mon Sep 17 00:00:00 2001 From: yongqiangyang Date: Thu, 29 Jun 2023 19:22:08 +0800 Subject: [PATCH] fitst commit --- LICENSE | 661 + README.md | 46 + community-gitee-openeuler.json | 13 + community-gitee-openeuler.yaml | 27 + community-gitee-openharmony.json | 13 + community-gitee-openharmony.yaml | 27 + identities.yml | 46 + metrics_model/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 156 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 144 bytes .../codeDevActivityModel.cpython-37.pyc | Bin 0 -> 6517 bytes .../codeDevActivityModel.cpython-39.pyc | Bin 0 -> 6628 bytes .../codeDevQualityModel.cpython-37.pyc | Bin 0 -> 12067 bytes .../codeSecurityModel.cpython-37.pyc | Bin 0 -> 5255 bytes .../communityActivityModel.cpython-37.pyc | Bin 0 -> 3610 bytes .../humanDiversityModel.cpython-37.pyc | Bin 0 -> 5896 bytes .../__pycache__/metrics_model.cpython-37.pyc | Bin 0 -> 13175 bytes .../__pycache__/metrics_model.cpython-39.pyc | Bin 0 -> 13042 bytes .../metrics_model_summary.cpython-37.pyc | Bin 0 -> 6602 bytes .../__pycache__/statModel.cpython-37.pyc | Bin 0 -> 6465 bytes .../__pycache__/summaryModel.cpython-37.pyc | Bin 0 -> 11196 bytes .../techDiversityModel.cpython-37.pyc | Bin 0 -> 4025 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 15543 bytes metrics_model/codeDevActivityModel.py | 201 + metrics_model/codeDevQualityModel.py | 402 + metrics_model/codeSecurityModel.py | 136 + metrics_model/communityActivityModel.py | 100 + metrics_model/humanDiversityModel.py | 208 + metrics_model/metrics_model.py | 636 + metrics_model/statModel.py | 198 + metrics_model/summaryModel.py | 283 + metrics_model/techDiversityModel.py | 124 + metrics_model/utils.py | 620 + organizations.json | 11459 ++++++++++++++++ project-gitee.json | 55 + project-gitee.yaml | 27 + project-github copy.json | 58 + project-github.json | 58 + project-github.yaml | 27 + run.py | 103 + 40 files changed, 15528 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 community-gitee-openeuler.json create mode 100644 community-gitee-openeuler.yaml create mode 100644 community-gitee-openharmony.json create mode 100644 community-gitee-openharmony.yaml create mode 100644 identities.yml create mode 100644 metrics_model/__init__.py create mode 100644 metrics_model/__pycache__/__init__.cpython-37.pyc create mode 100644 metrics_model/__pycache__/__init__.cpython-39.pyc create mode 100644 metrics_model/__pycache__/codeDevActivityModel.cpython-37.pyc create mode 100644 metrics_model/__pycache__/codeDevActivityModel.cpython-39.pyc create mode 100644 metrics_model/__pycache__/codeDevQualityModel.cpython-37.pyc create mode 100644 metrics_model/__pycache__/codeSecurityModel.cpython-37.pyc create mode 100644 metrics_model/__pycache__/communityActivityModel.cpython-37.pyc create mode 100644 metrics_model/__pycache__/humanDiversityModel.cpython-37.pyc create mode 100644 metrics_model/__pycache__/metrics_model.cpython-37.pyc create mode 100644 metrics_model/__pycache__/metrics_model.cpython-39.pyc create mode 100644 metrics_model/__pycache__/metrics_model_summary.cpython-37.pyc create mode 100644 metrics_model/__pycache__/statModel.cpython-37.pyc create mode 100644 metrics_model/__pycache__/summaryModel.cpython-37.pyc create mode 100644 metrics_model/__pycache__/techDiversityModel.cpython-37.pyc create mode 100644 metrics_model/__pycache__/utils.cpython-37.pyc create mode 100644 metrics_model/codeDevActivityModel.py create mode 100644 metrics_model/codeDevQualityModel.py create mode 100644 metrics_model/codeSecurityModel.py create mode 100644 metrics_model/communityActivityModel.py create mode 100644 metrics_model/humanDiversityModel.py create mode 100644 metrics_model/metrics_model.py create mode 100644 metrics_model/statModel.py create mode 100644 metrics_model/summaryModel.py create mode 100644 metrics_model/techDiversityModel.py create mode 100644 metrics_model/utils.py create mode 100644 organizations.json create mode 100644 project-gitee.json create mode 100644 project-gitee.yaml create mode 100644 project-github copy.json create mode 100644 project-github.json create mode 100644 project-github.yaml create mode 100644 run.py diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0ad25db --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..0fc970e --- /dev/null +++ b/README.md @@ -0,0 +1,46 @@ +## Metrics Model +Metrics Model makes metrics combine metrics together, you could find us [here](https://github.com/chaoss/wg-metrics-models) + +### Please create json file as following way: + + { + "gitee-{community name}": { + "gitee-software-artifact": [ + "https://gitee.com/{owner}/{repo}" + ], + "gitee-governance": [ + "https://gitee.com/{owner}/{repo}" + ] + } + } + +If it is a github repository, you need to change gitee to github +### Please create conf.yaml file as following way: + + url: + "https://user:password@ip:port" + params: + { + 'issue_index': Issue index, + 'pr_index':pr index, + 'json_file': json file for repos messages, + 'git_index': git index, + 'git_branch': git branch, + 'from_date': the beginning of time for metric model, + 'end_date': the end of time for metric model, + 'out_index': new index for metric model, + 'community': the name of community, + 'level': representation of the metrics, choose from repo, project, community, + 'company': the name of company, + 'pr_comments_index': pr comment index, + 'issue_comments_index': issue comment index, + 'repo_index': repo index, + 'release_index': release index + } + +params is designed to init Metric Model. + +### Modify 'cofig_url' path in the run.py , Run metrics model + + python run.py + diff --git a/community-gitee-openeuler.json b/community-gitee-openeuler.json new file mode 100644 index 0000000..463b125 --- /dev/null +++ b/community-gitee-openeuler.json @@ -0,0 +1,13 @@ +{ + "openeuler": { + "gitee-software-artifact": [ + "https://gitee.com/openeuler/iSulad", + "https://gitee.com/openeuler/A-Tune", + "https://gitee.com/openeuler/stratovirt", + "https://gitee.com/openeuler/bishengjdk-8", + "https://gitee.com/openeuler/kernel" + ], + "gitee-governance": [ + ] + } +} \ No newline at end of file diff --git a/community-gitee-openeuler.yaml b/community-gitee-openeuler.yaml new file mode 100644 index 0000000..57ef9fe --- /dev/null +++ b/community-gitee-openeuler.yaml @@ -0,0 +1,27 @@ +url: + "http://localhost:9200" + +params: + { + 'git_index': 'git_chaoss_enriched', + 'git_aoc_index': 'git-aoc_chaoss_enriched', + 'git_onion_index':'git-onion_enriched', + 'cocom_index':'cocom_chaoss_enrich', + 'colic_index':'colic_chaoss_enrich', + 'issue_index': 'gitee_issues_chaoss_enriched', + 'pr_index':'gitee_pulls_chaoss_enriched', + 'repo_index':'gitee_repo_enriched', + 'issue_comments_index':'gitee2-issues_enriched', + 'pr_comments_index':'gitee2-pull_enriched', + 'json_file': '/home/ruoxuan/metrics-model/community-gitee-openeuler.json', + 'git_branch': None, + 'from_date': '2023-05-01', + 'end_date': '2023-06-30', + 'out_index': 'health_metric_model', + 'risk_index': 'risk_model', + 'community': 'openeuler', + 'level': 'community', + 'company': 'huawei', + 'identities_config_file': '/home/ruoxuan/metrics-model/identities.yml', + 'organizations_config_file': '/home/ruoxuan/metrics-model/organizations.json' + } \ No newline at end of file diff --git a/community-gitee-openharmony.json b/community-gitee-openharmony.json new file mode 100644 index 0000000..7178241 --- /dev/null +++ b/community-gitee-openharmony.json @@ -0,0 +1,13 @@ +{ + "openharmony": { + "gitee-software-artifact": [ + "https://gitee.com/openharmony/arkui_ace_engine", + "https://gitee.com/openharmony/kernel_liteos_a", + "https://gitee.com/openharmony/systemabilitymgr_samgr_lite", + "https://gitee.com/openharmony/communication_dsoftbus", + "https://gitee.com/openharmony/community" + ], + "gitee-governance": [ + ] + } +} \ No newline at end of file diff --git a/community-gitee-openharmony.yaml b/community-gitee-openharmony.yaml new file mode 100644 index 0000000..976765d --- /dev/null +++ b/community-gitee-openharmony.yaml @@ -0,0 +1,27 @@ +url: + "http://localhost:9200" + +params: + { + 'git_index': 'git_chaoss_enriched', + 'git_aoc_index': 'git-aoc_chaoss_enriched', + 'git_onion_index':'git-onion_enriched', + 'cocom_index':'cocom_chaoss_enrich', + 'colic_index':'colic_chaoss_enrich', + 'issue_index': 'gitee_issues_chaoss_enriched', + 'pr_index':'gitee_pulls_chaoss_enriched', + 'repo_index':'gitee_repo_enriched', + 'issue_comments_index':'gitee2-issues_enriched', + 'pr_comments_index':'gitee2-pull_enriched', + 'json_file': '/home/ruoxuan/metrics-model/community-gitee-openharmony.json', + 'git_branch': None, + 'from_date': '2023-05-01', + 'end_date': '2023-06-30', + 'out_index': 'health_metric_model', + 'risk_index': 'risk_model', + 'community': 'openharmony', + 'level': 'community', + 'company': 'huawei', + 'identities_config_file': '/home/ruoxuan/metrics-model/identities.yml', + 'organizations_config_file': '/home/ruoxuan/metrics-model/organizations.json' + } \ No newline at end of file diff --git a/identities.yml b/identities.yml new file mode 100644 index 0000000..e0be015 --- /dev/null +++ b/identities.yml @@ -0,0 +1,46 @@ +- profile: + name: GitHub No Reply + is_bot: true + email: + - noreply@github.com + +- profile: + name: Owlbert Einstein + enrollments: + - organization: Bitergia + email: + - owlbert_einstein@bitergia.com + github: + - owlbert_einstein + +- profile: + name: Owlfred Hitchcock + enrollments: + - organization: Hogwarts + end: 2012-05-31 + - organization: Bitergia + start: 2012-06-01 + email: + - owl_hitchcock@hogwarts.com + - owl_hitchcock@bitergia.com + github: + - owl_hitchcock + +- profile: + name: Owl Capone + enrollments: + - organization: Hogwarts + end: 2012-05-31 + - organization: Bitergia + start: 2012-06-01 + email: + - owl_capone@bitergia.com + github: + - owl_capone + +- profile: + name: i-robot + enrollments: + - organization: Huawei + email: + - huawei_ci_bot@163.com diff --git a/metrics_model/__init__.py b/metrics_model/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/metrics_model/__pycache__/__init__.cpython-37.pyc b/metrics_model/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0a203aa49ac6b00a92fef9397c9dd30c88d295e GIT binary patch literal 156 zcmZ?b<>g`kf)AR1l0o!i5CH>>K!yVl7qb9~6oz01O-8?!3`HPe1o6vNKO;XkRlle- zzoIlTPd_<7w;-{&ST{Gdq$o2PNav@d=Dg`kf)AR1l0o!i5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!Hienx(7s(w*v zenn|wo_=m>Nl|8Uv2JdDN@@;_7Z2gZ$7kkcmc+;F6;$5humOsd=A_zzjQb443;?%2 BB3J+b literal 0 HcmV?d00001 diff --git a/metrics_model/__pycache__/codeDevActivityModel.cpython-37.pyc b/metrics_model/__pycache__/codeDevActivityModel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0244308d7e5a6f4db6f8b90f9948a498b1ec861 GIT binary patch literal 6517 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 M8-VPnZOu^s3u)A4g8%>k literal 0 HcmV?d00001 diff --git a/metrics_model/__pycache__/codeDevActivityModel.cpython-39.pyc b/metrics_model/__pycache__/codeDevActivityModel.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..451795356efc8b6fd08145616efd0a5753de47fe GIT binary patch literal 6628 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 G)c*r&JeM8- literal 0 HcmV?d00001 diff --git a/metrics_model/__pycache__/codeDevQualityModel.cpython-37.pyc b/metrics_model/__pycache__/codeDevQualityModel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9900bbba93a5a5b31115a998e1a03dcd13bee14 GIT binary patch literal 12067 zcmcIq+mjsES?}BQ^jvp#XZF65*LG}aoakbM?ZlCV?MN}f_C`iBcG?l`(VX7h*`3Sk zbdRjv^dw*jyPzUacnG1&P^+p`DEtRd@E5>Co~RT>^#fEv6;$Ea%rj>QGt(=={<=uR%;1*g%x7eC;r&=Yqg!ZPen$zwy zzh~STyi?6`tL&Cr6}O^m{`CH=KX*@e=TTxe7g~$%Vr$7=;+E;=a%;t1LELeVy{d_f z$llgO*4J;D?r~vV)~dPtIwoAz!BPmh|GpoD zUds=H+J+y`*Ejw8wih;#;ceCeuXDqf&Du^}t_guAO}`fSgW8MKS3k4S7XD4IRomHV zv^U~PUHY}qKUf-1^#|XPoh`o}#udt-(LB*uU-w#_cDNbDS;}qsqS0-|4#m6OhKLIk z6Vz$55ri=hUdO5~_%~jzhmCq8-1UNbNBZ#s)l7=s?ADsYlFC@F@awhR``9UMt!l&$ z^-i;iGZbRO!Wy!t`q^GLthYPw$5TNly|BZRp^Dh%85(l95K-F=8vlt;P^Z58zd{lT zeujvzxw_C?Lp=JCwyq09n71=7Kp|2>_bp-H(*4veZ9OH@!nv)x_DG(=A6$3SA}8{< zHP;aZQN%kVrbG$vte6%vc;`e}RPfG=SuuxqLClKrT|Y@=i30j@ zs&h@&+V#!Y*^x=^G-CBmtL3-DpkJ{?bmX;b07)8UJGJ&MsLBfb=DJ+L^5r8G977Oi zwt`OETW>UdxyKUwhf7zxMpuQ)i#Xf1U6_zYLx{o^Rj@ zB!b8ijC^55Mnk7Rpg$#Sk-n`(`UUNlE*z2h7-b?$Sf?5rhA2cSQ4~(nq5wSE`%>FpXW+5%T*ed7SKiPf?P{e50*-W{Z(tEL%#V!g#Cy%S95h-xP2aoT^(B}R7%*6( z8P+zyO;Vg0+dNJnzl`3HYn(nC>kUq+;48@gG<%L%9l`AUS7~UThqZTZ(q|zC1iU7k z9Js|2PoHac>a}KY9+7@Wk_Cei+reh1iK`G9w z5kPAAbn;2cN+;}@dmYLi*46ljK_8}#VelwlgWZP~hGA!So;)}qkSk2`xO zKkH|xlNLe06dn=+OaLDs(uY5RK7ljXJ+XI@OVUIT`ADDFL}6Y_K%Ik7C<1v?KpsOK z@0?($Bj$*i$N(XfK@g^Ti%LQex|sdg0y)irAgqYcI={vQdqtkceB>DffJR+5cEY{2 z#`;Oosh_SxEY}+C;5C2u zqt@*Drv!C8pU6r;1q&G zIF~OWw`$2@wU?>xD=L@1vb;dSMG6$Y-{@Bv2P^A20PEj**fS$Gm*^jn4sJDRkf%b(v=^pfj zL3`*xW9{wTJah|d84_gOxC~t-w70YJ&vlLdMDeor4it2NdumM~+9C~-aem*$+`(on zQqig=GmzmIApWdW1qcAK8|T59q`y%MA>0C{kT}K2Vm!o;w81x}f1}~QKU5UnZ-n5i zP$xPepur&c7RDSMM3G!ItvC_QO?^=%Fk~6k;}kUTMjN!~*JOQDsTHqL!L;kk&V|N} zMu16Ol(HkM=>$$JeqW_ZMJ0Mzfq@`krG`a9To{z_3e6p8xb*P^KoJg7u;Pg*O;Byb)1a*J_0iKuuDh)tD zZ5)NrK0zlh3d9lb!5*7XS{y0WwoCw#Kxc|6fT;u^PUD$jFpl?JCdGNs^Ml%^0L0WG zApTj?IKqL}!*Cscj!+Ae8nHCACy^x5a?`Bh?|im}$Z0I+;Og~>fJ zT@ZJj)C(6LWV%(OPX_XBnk}Q=hW!X#SiVC!-=To@X(n2mQ7+%5Tmrcyb0eN&K~7td zh!Ky9NUa({bcvD3^Y$3fe}Qt=q&>@ZlHqxh(_oLLC;*+rGK-7az7biB@i8QVNu~}U*%swqT2#a=)aR6#Lu)*w zM)#bXe-+x1a|=rK)lYhvDAUWrG}E@y+qV2`GR3yi5g7CHS}%S5$Afv3@1ZOf?xcD- z%oIjrG(OXOlpC9A{=iHfl!M-Sg{Uw(Q&HZw?&|V6ky9g|(;^tNYIITV=UxBt+ggM* zaa|E+X#SXMTE&*Nb@Q?&mhlj)U+J@YxGgrB#2Td&0Ko%EjH!#sMH3?tI}r`8vVUEK?_lu`G_{bst6JPgQ$EOy8PwHL4v#D6bn}S1E{P8xT$70pkNRFt2C90JJSzWS}c%p>2{{FzhP_ zJ<|q*$fE_ZOJbF2@_~uz5#im}LhbPpdg)yUGf6LlTA)EX&>(-F2yWyg8sv-;QU}|Z&G9|`kCiSBHWvc!^qfW4jfONnt0ZL!cD|oL!d}iS|B3;lSUGVWqKpN}q0Eh-s z6Q07)AT=lGdZU`)sFW;1_Q1{+Q-BBQd=^}a>tgycxt^f=i87uFbU-pUG%>5pnTh%* z0d2&D8P`9>+=h-C^GTnxcrQSz4d-GD%w;gmAict05+|K<+pd%#Cy#sPXB8{0C+nkQbMTf%HekV~Niq1)f{toV}-x zAcg+iN4gwP1hLcsMcn-YD1xa06w$Mw6IyVxmOvF-L=_vLgq!~!SzzG*(zD@5g7&qj zK}QT#jPYAR?O!Bm;9UM9Ob=7g(DZHOMX7xwbdr2%p(8a6))2X8?r(nEfG+sLpqGV3 z?XJGlZvjeCeNvqxdQ~l+NyeZSJjV5KygoEX{g&P@eH(6rD5chq-kY=oVK&TBo+?=; z-8mh?#v>gXx~IdmxwIxb_(*bx0`d%f233=FIo3Bxp_2!#xkI$a+73}3&ND)Cs;^U{ z8Uh?Fvf&3#5NFjXo1nN|Z*~G-#2NMG;_eQ41gN-Lcrf+JZR&rPf;j}S2`?;s;mrh=N(V`M}_D}(n>xAqH zG?^c5Y=S@nvUxQKp#@N%4WX0=9g>jB>t~T((w{^4ltD4lfhrJFd#guK=3u%5dL%Vx zK#$HBK#!l7ggQb7Jy32vTta~o(qa0R5&ZWd8MQo42mcSR2GE9+3jZ)AT*vlLkU>%+ zUj`Jgdo`q37lD#F5GMn#!nmEVf?9DF{<4rPgimgF82a)yW_pYee}wFTThHCs@go2}l!l+1qKwuFuA`ozh^7#pb z4+xE;Zaq@Q1_D9eq!f#T@2QG=c)5=B=|+Vwg0h26&p0&G5+SkA`fj4?+laSuQMrj&G z>4%4m(#jftEO(jCA8?FK9s|Cl@Nk>JlE04Cj2(L%?P@-R#Vgc$=wfDQGKYQ$zm?yo zhHS5@!>0M4IDNX2@NwCqpy(Lz=NT$l0ACF*#z&| zu!lOGNziW|4=F+H*7%8mZ*SpBN=D`*t4(JJbbOWKoa0f7bM#&cnzP-2{nh|dJmao$ z^HP+$pxrg#2ysF)#B~_xnK;Eo`xMS{DQ3*$E92xs+lOa1((f7Mmqovh46na{Txgq= z`(2}#?ZHpFj|&V*IuC!UwhwOj zEU9^7j?-}5;A#$?m)rtM;U-b3EUw}dg#oNiMI~W^5o2edJ3kZ7Bx&oGL6$61sX^%_ zE~Rw86!+c+rEQd|^ssc;_J>?L+7@@^25mn_T&Ww!vcU(H!wmj1I-%zU3{kG*n zTSHo0I@-3vYc=HYu#B<_t>u=^YjyT3_q1>p7oYGJ_Q#dpEcSISnvK%;3|$N7!v%`N z)-v%Jy}1ZwA`Sn5y}uaEl06hIMY!@6E^k|~a8Y6mxTLL~)he{e&H zuP+J@IwJJL_mDT-F4?B!`xN{x1*DV7k0{^?<|%d(0j|j45{_Wb7iStlXT2kFtwvU; zY`$K@tUX-jA~!o<(PT%roTBC>3a(K=c3E6`VrM7n{AmPQUmVZKBWy$>Fk%D;o@aSyX(P^(*Gy4S@ zCw0mru*g58V6b{Oxl_kD8SVlu5REJfMl4;-9OvSdejRnGPJPKs#K`GnPh%~X>^O2Q z9tS&jz|c!Z$;hie9dA4f$fZAvLmMIaV@Cg$s0TBT{v5Umi=+-ryuCANLI-pLA~2Q< zbWU>ftf2F>lQ^5kO&jJ(rnFTY=Plrp8|-}q?=;V8*X_5}NtL-)%?T9dRMK0$KNQqT&sginF7qsM1#`m`6ZX9v|_-C!Je*wsOuXIy26b zcxId>JabMi`vTXjJ`xuWe0fP6HBNQm-wdQl9nyD~q!dch5@ebJ+D)0EfHXzcoFx-~ zfs#cE2E-hvo1Kjfx&~;01#C*vRMd%g1{e2UN0~3>&yX40R1p_gSNgXr!M1T(uG8FZ zgr|vbk^7N(2=8jV+^^^P&F#~DZg^VFozxilXB5zm3^z-~Xscr9oceI*0T87@<&Bq0 O4oIW~Vga$~mhnF_g{-{* literal 0 HcmV?d00001 diff --git a/metrics_model/__pycache__/codeSecurityModel.cpython-37.pyc b/metrics_model/__pycache__/codeSecurityModel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aab6ab654535b3c9a8f04975ede976f5f981b9de GIT binary patch literal 5255 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 IU$fNz0#GK!`~Uy| literal 0 HcmV?d00001 diff --git a/metrics_model/__pycache__/communityActivityModel.cpython-37.pyc b/metrics_model/__pycache__/communityActivityModel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1e7abef0b5060da2458ef84c02ec19c58eb4784 GIT binary patch literal 3610 zcmZ`+Nt4`271myoYU!_RmvKP-_juiKS2rbaL78uFN!OhoR01x8! zYb~(2!#kL5-sLX$Uh9GLt!8OK2ma7g8;|lU$7@_-94*Z^pxMPRF$xY)YA4#MUR$+S z`*o-8*1a=F*J``gm{IG1W^DpmwF_w12B1?rfSq~(=yKxm>OR*FjNnLwG@4GTj8^bGCWW2?^^HVE35r-m?-y;Fv1%PXKj73RU z6pZ~%`|qQBdwDAE$tr(Uh1tEdjp#d#nu|BY4wSxkE_C6;jgjw8kK}a-CgqDEfTnNg z&XwQstw#$xT>f}*_YrvpJvK%M;}J&j44~Hbwc6lXt(Q87TfWh^fOGSWHG_xj8~X$; z4EWAIJY>Iv;qKZsT=$K^?QM-a7@cixX4RCw-0|B0a&ZwBMa9T$FJ}ar>db=(L1wp( zVD04mNcFBx{j#w33Npsc;PEaV!Y9aiL(jL5W`jcMmXia3iFCjBXW_%i|&tI9#G zLO4pgP-P-L1EAuViO5Es#-Q@&#QXptSY2q<3T#S{ML8!}YfXG%<6QX1w}OZNmfpHFHa|L|Q+A2W(Ps+neZofEk5S69>3CfAh<3 z*{i$UIx*lggnKPsyQlp#tsI~@VdnN<{aLSEs&UQ}W7bD$>2c?QRy(K5C|J<8T&W#M zSUs>LblhJ%9l}#PXV8aE|MEV3^Aff3NOyc}+_|It#a)M`>bEToXN?EErOt5VD~oc7 z`~hB+RUSvZpde9{eR~)adqvutq`hMoF$C zKLJqoZjwVwTOu!V<;6w5o69sT>Awm`D>W*=m;=slx{ko1i$ z;PkVIhM%JkOdlLR@B!xIPu>%v3%%M-qTO>e7+-qO`i#dTmwFp&HPGAmjFhYr!g~yL zC`{Uwrg*<&tPqN;{=7wq1iE>4aqN*U?_gb06_MKjl|A}&b35)*Lmk~#{Yz>} z11!p}$~Y+`m3m1oE~(f{N-~lvh9o)CBS2|Wb_q1T(h{Yim^m^A9;ekLx!<;7vae0@#n>yvz2{(!V+JcXX#dfj;dkk;9{cmNn)WApnf@$PUPHwZ1;d@pVIjkM`E)0W>#+kQLk_?>jlpG)Wc`E%QeGsctdylnP)5rjz+2)>oc_K<(f^CC!jo`-!dk4FO@ zZ3aaQMlcBTAiK*&5^l-GkTHCc@G$55y-(6uQ)WD5{9cfTTU+t4FP9?0!-5}fm7VG2 zTO!-wQ6ZOzL9+!c?)8E+8y16Hdc;jRi$|$+sXiLTOtz@TXwW3i3#lfLu&e9*?zO0h zqqx`(@+cEro}iwSrgukSa?o;Y+H#9WBXPh#Rq@kwGz61|yL-^6h8v91aCkk2IP!y* zr6ZFt9);VFA$V=AYe<(COPiB*qL6e5zTR--I?T%Eh-1?O$orTGW}WfSxXjiIOvr zLfh5$^wKKprB~L}-vaw(o;>2rc+X{!<-Hx-^jCJ(2El;P80Ka#mq*NH40!6I`u@BDz%UK^07JcEcdaL7I z-P#sUV^mssz67G_$8_h&-*{z)VysT3KK3rXeEH(}i5mi@MX712U)OeZQdQO{%{`4ZA3?3ECu==aU$FK=GuHdnx1ERPj$PVNkGVBL ztCp=O8x4yf>jjzU=duxng2h9H3exVyJYmvW&$2{X=_oHE!cF=aD74gDDES$XzE*0t zPwc?TN}cJ);RE_QGieFGHSQ4RT5>Uu)2)ODcSc+Qi~ziVLj9aHi?9#Nw-sMHYSLU> zz@Xq7s~4pntG9|=1pjmI3ZWcn(bZS*o~z}U<5y>io4^8lgFezm)g-G|k}L|7{3c-huZ8j0HPN3NFyk%HuJYR@m?7;$_;OE?vl>r*O>?FVYH>$>j>g#W%qa=ZIUI zAfWo}h&1Hlj4gf*U*#(xnt`8g=$=i~FdWkXCEht}{NfiBSVY)GKT^{gic-&aP${(y ztu%m0dZ85cfqsHCz_dlRg#|6 z*Q8O5ANv>^;;{(ayM_{ic$;`olnSVzmTX%#Axy#hVSzKs#U=ER_T4ZU@oruG5O3m` zV!>g@L!1*2MKq{DfO~>TB#kf+Rqmo}HJ))`Mp-G|FNAyDL z%*i@5eMP^hkGr#^JoC#hSI(_)R17i^uq+MZp}2tscXe@-9)~0@*1!@!CPGK9q%7X0 zZcoTq{Dhha5B`;S#e39gU%IlsZ=FZQyMUH(7>_FvD+8vbHhtP z`=X_gmVyJN!hb|%im(bV2rULfIyT08n#{0svC;J)O-1Z}sZQ7A9XV zK7qGO4-cDx$(A1&r0DDzl>Ru%iBlR7*dS=({T8f)TN1JB;H#ojyGoxPuGWevu&GC_5#5F;+z={B4wAiPpuX+x<~VEp9R z$rV2)!^UY7(#RIz3(62pbp0jp#J52H8`Kxyrco{v`3?xCB8w7)+Um5yc$Ml`ri@Al z2<63hK{(13-oG*Hq}NAz&v`UcWI*Gs6lxL(jp_w z>4@PV$RUt(nBgQ|vKI6?{8{+(^rr6O&(X)H|M^k;KN*|&h|Z7vmG~JE3fjbNkcnA| zUl8Me!kB)8l}wH4@~jg?3cEE35hi^J79|3b%Sy^Xk>YQ}M- z4ahjPJqJ!ie`LVH)G@9riaW1>ORj~uUSTq$^mYx^*PU=1;F@J)!X?*4eVgD~Wpl#y zCfpXdcG)6s(Wusfbznb~)gmS|cOBHt$(u*HFmhOTuk}bP+Q^deWX{9JPP^zJ_qBG7 zolc1wt6kABa;@yB`JBDEvi%4V zUmF|e&x`j-4L&5YNhAS5s%+8iia3uKX%*XB9BE~^jMX$$o@&w80aULuYYbAgx+Zl#bwOEcj^xpec|hr#Rb-}q7R z{yW#Nz4u0N>uvuH=^%ba`YjvlqhvD}Z6#UAx^tC}Qh{7XqYa6WsDz+#y|~~iK@W2| zkF=Y1qHfzLmkKN2c9(k35Tk59*%ucUbai#qQkSNEs;h-c(!axqIYs`OzJNdSTMoj+ z)5>=lpyb8&i*Z8vJp;We4`@(t!-JReRIfH_$d2og`zFo zw0HsCDU6T?2eKI;9SxJJMcpQd6C@9HG_-|Tk`cc~gKSN1G9r%4%HTjSh~HP~Llr+g zg&N(TZUkln4dIE7C?1ljMRTLtzoIi4aB!O8o>y z-=a>$BhnzERE(fY&|IQJgwRaP6CpJdiy*R=Wc@z!ez8m}m7CR(z1{$q3-Jkcai|M| zoRw(~4ueCilO>yRu}aoK*>WW#l9oI*?HBN5b9HKNtJNk>(llctwBZ9eJ%RV`mFhsQ X0&lgP7Tq*%EV_t!Jblh+>Xz|0-QmzT literal 0 HcmV?d00001 diff --git a/metrics_model/__pycache__/metrics_model.cpython-37.pyc b/metrics_model/__pycache__/metrics_model.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a803d7a9cdc0a1daa1ee97b4b89ac5f90cff3a67 GIT binary patch literal 13175 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 YpR>XlD&xuVULKvN!nrCVZ&>F40l#e6)&Kwi literal 0 HcmV?d00001 diff --git a/metrics_model/__pycache__/metrics_model_summary.cpython-37.pyc b/metrics_model/__pycache__/metrics_model_summary.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59a5ddf08bd5b24fc2c3dee6c75fbe5a11ee8aa5 GIT binary patch literal 6602 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 JeX0J){{W3i;f4SJ literal 0 HcmV?d00001 diff --git a/metrics_model/__pycache__/statModel.cpython-37.pyc b/metrics_model/__pycache__/statModel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ae4f6de48da6790e20de358a7362ea8b1e711309 GIT binary patch literal 6465 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 literal 0 HcmV?d00001 diff --git a/metrics_model/__pycache__/summaryModel.cpython-37.pyc b/metrics_model/__pycache__/summaryModel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8810b7a2add1de4ddd30dc6dd19fdeef52158f7 GIT binary patch literal 11196 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 literal 0 HcmV?d00001 diff --git a/metrics_model/__pycache__/techDiversityModel.cpython-37.pyc b/metrics_model/__pycache__/techDiversityModel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db932cc79b74de2ba41b8c1d43efbdebba1b53f7 GIT binary patch literal 4025 zcmcInJ98Yz5#HI??LF~+P=rWIHYJ_P07<)Crezjw%2c^*kuYVFmbA9KUhE7G3+&@K zyGs$MMFdtUVqnJ%fKaJ_h(iaHI%49;i52v4i>gnnJy6@v|w`Jh@ z*MDyEzb+WYKdCW!Y*c=MQv3~s8=NIZ%6!JCZYE}G`BrNCcIx;}>iTZl@EfV;duh{e zrY*mfw*7Y6@jGeP@1{M!mrnUp>9jwc&iFIwtUsI1`E%*KKace+ZYK-=0=`bNm@fK@ z>5{+146$&yEG`@||1I>m$;EWVUrFEg-_|o4$))tNe;IYpzw#@CH+k#1!CQhISpGZQ zerWXDuNVaHGu62-N*PDR{hW)WKdU+eQ3hd>1X2uh)yu@!q9}t@6h$}?YAM3pvM>M1+Mn9({q$56MPI?w6Jr6}x$rJv?5kF0<3`|~0Ko6em4PG_4fT z*6SVfukFr76z;yljTq~FQ+ad>I<;yN#l@5%*i#dBP?b@Zf32p9QU+zN4^0DcowIt! zV}w}}6ZtBz>x$ul*s6!%aOhR?X+o4ostvB|i}t>;bO5;nIFm~ak^O_Mv^ea?KB zH@NrQ@Eap@@;%<;ZQemo^Bco9{1(h=O3gkxeOzr->(TUhL;89s7D}-VQW^)wA*=1W zRkv%e?$q5Qml?HF8-ZCfP^-2;?Yar-)F!A~Pk}b-2B=rNpiNFATXl~cJ7)1me9awG z{+Sz@S@+P><_1Kw*7xS=DzZGu2fJ5}Z$#Pac_#WDw&nWu3I( zk&yh_857rczBb&Im$2v+lwuLYV2jLs9KVNE(u&z&G9A0`m>kjq)lhgM2f{<)BdQD3m zrQBjGub`{>6wZ}aX)tOd9+dDL94IM;#5lW%_k^;;!Jv>oqvJ87Zet9DdfIEsP;=)TaTT+Q6%fP3!%Wt4h?=HrxuC@R(B6CRf74e)kVX&L zX#+*u=WSGKW80`rKol#rrM_UxWCHdJdmqrYZEh2_YlQa~CU-9wyn*6fF!t@5%%ZvO zd*tnbcvimhu^u#H6Rh`5eQxg)h`MTRtm@K)Z3czq_<>2pS-^0#2g2Sh$2LRyr+139fj zN&YP#5g{NRt4}^A#%c|b z8n<*3aM(UF$_~;3e7X6ux!)qIW9+;59J?zy$b!L=PwR^zI z=^a}_hV7Zd+1lmy5ysHzp4|MLPH>8=lLBXb&s<&YHHhH#KD2tzCkf)wW0p*vN(VrWw+$66WWv6o#hmjGC z6KhOEw(AT5`K7YpLV9BaADt!hpop_boRXtM!mN=n&A7-na|s-k%fy@`ri&~aAzxXE zfL!26V(7#TP^}6$yyoTp#e*az7JtMfJaIPHSY*I*yJ(B*BN{T*`pg>X#k_5i8 zNrcvvgbPxe4rNf1phD7r0ZDneoFOtxgltI8gQx~_WuzVhNh#bYYBUi_?}00%%xH*9 zLy$MGOcDY(4*rzn$xd9Zk-<~w9;t?uq%Kaz1tQs5n>f(g=p=8^Hk(998z+hy)ksas byEVFp+mwwIBzebtFz>NxT>G@yVYc~SFDX}l literal 0 HcmV?d00001 diff --git a/metrics_model/__pycache__/utils.cpython-37.pyc b/metrics_model/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..817e369506cdf80023d7fbf6830fb344b488c00d GIT binary patch literal 15543 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 qulNW2FZH+hoBiGXR=+>s^D6 0: + is_maintained_list.append("True") + else: + is_maintained_list.append("False") + + elif level in ["project", "community"]: + for repo in repos_list: + query_git_commit_i = self.get_uuid_count_query("cardinality",[repo+'.git'], "hash",from_date=date-timedelta(days=30), to_date=date) + commit_frequency_i = self.es_in.search(index=self.git_index, body=query_git_commit_i)['aggregations']["count_of_uuid"]['value'] + if commit_frequency_i > 0: + is_maintained_list.append("True") + else: + is_maintained_list.append("False") + try: + return is_maintained_list.count("True") / len(is_maintained_list) + except ZeroDivisionError: + return 0 + + + def metrics_model_enrich(self, repos_list, label, type=None, level=None, date_list=None): + level = level if level is not None else self.level + date_list = date_list if date_list is not None else self.date_list + item_datas = [] + last_metrics_data = {} + for date in date_list: + print(str(date)+"--"+self.model_name+"--"+label) + created_since = self.created_since(date, repos_list) + if created_since is None: + continue + LOC_frequency = self.LOC_frequency(date, repos_list) + code_review_ratio, pr_count = self.code_review_ratio(date, repos_list) + commit_frequency_message = self.commit_frequency(date, repos_list) + metrics_data = { + 'uuid': get_uuid(str(date), self.community, level, label, self.model_name, type), + 'level': level, + 'type': type, + 'label': label, + 'model_name': self.model_name, + 'LOC_frequency': LOC_frequency, + 'contributor_count': self.contributor_count(date, repos_list), + 'pr_count': pr_count, + 'commit_frequency': commit_frequency_message[0], + 'updated_issues_count': self.updated_issue_count(date, repos_list), + 'is_maintained': round(self.is_maintained(date, repos_list, level), 4), + 'grimoire_creation_date': date.isoformat(), + 'metadata__enriched_on': datetime_utcnow().isoformat() + } + score = get_codeDevActicity_score(metrics_data, level) + metrics_data["code_develop_activity_score"] = score + print(score) + item_datas.append(metrics_data) + if len(item_datas) > MAX_BULK_UPDATE_SIZE: + self.es_out.bulk_upload(item_datas, "uuid") + item_datas = [] + self.es_out.bulk_upload(item_datas, "uuid") diff --git a/metrics_model/codeDevQualityModel.py b/metrics_model/codeDevQualityModel.py new file mode 100644 index 0000000..f706953 --- /dev/null +++ b/metrics_model/codeDevQualityModel.py @@ -0,0 +1,402 @@ +from .metrics_model import MetricsModel + +from .utils import (get_all_repo, + newest_message, + check_times_has_overlap, + add_release_message, + get_release_index_mapping, + create_release_index, + get_all_project, + get_time_diff_months, + get_medium, + get_uuid, + get_date_list, + get_codeDevActicity_score, + get_codeDevQuality_score, + codeDevQuality_decay + ) + +import logging +import math +from datetime import datetime, timedelta +logger = logging.getLogger(__name__) +from grimoirelab_toolkit.datetime import (datetime_utcnow, + str_to_datetime) +from grimoire_elk.enriched.utils import get_time_diff_days +MAX_BULK_UPDATE_SIZE = 500 + +class CodeDevQualityModel(MetricsModel): + def __init__(self, issue_index=None, pr_index=None, repo_index=None, json_file=None, git_index=None, out_index=None, git_branch=None, from_date=None, end_date=None, community=None, level=None, company=None, pr_comments_index=None): + super().__init__(json_file, from_date, end_date, out_index, community, level) + self.git_index = git_index + self.issue_index = issue_index + self.repo_index = repo_index + self.git_branch = git_branch + self.pr_index = pr_index + self.pr_comments_index = pr_comments_index + self.model_name = 'Code develop Quality' + self.company = None if company == None or company == 'None' else company + + def get_pr_message_count(self, repos_list, field, date_field="grimoire_creation_date", size=0, filter_field=None, from_date=str_to_datetime("1970-01-01"), to_date=datetime_utcnow()): + query = { + "size": size, + "track_total_hits": True, + "aggs": { + "count_of_uuid": { + "cardinality": { + "field": field + } + } + }, + "query": { + "bool": { + "must": [ + { + "bool": { + "should": [{ + "simple_query_string": { + "query": i, + "fields": ["tag"] + }}for i in repos_list], + "minimum_should_match": 1 + } + }, + { + "match_phrase": { + "pull_request": "true" + } + } + ], + "filter": [ + { + "range": + { + filter_field: { + "gte": 1 + } + }}, + { + "range": + { + date_field: { + "gte": from_date.strftime("%Y-%m-%d"), + "lt": to_date.strftime("%Y-%m-%d") + } + } + } + ] + } + } + } + return query + + def get_pr_linked_issue_count(self, repo, from_date=str_to_datetime("1970-01-01"), to_date=datetime_utcnow()): + query = { + "size": 0, + "track_total_hits": True, + "aggs": { + "count_of_uuid": { + "cardinality": { + "script": "if(doc.containsKey('pull_id')) {return doc['pull_id']} else {return doc['id']}" + } + } + }, + "query": { + "bool": { + "should": [ + { + "range": { + "linked_issues_count": { + "gte": 1 + } + } + }, + { + "script": { + "script": "if (doc.containsKey('body') && doc['body'].size()>0 &&doc['body'].value.indexOf('"+repo+"/issue') != -1){return true}" + } + } + ], + "minimum_should_match": 1, + "must": [ + { + "bool": { + "should": [ + { + "simple_query_string": { + "query": repo, + "fields": [ + "tag" + ] + } + } + ], + "minimum_should_match": 1 + } + } + ], + "filter": [ + { + "range": { + "grimoire_creation_date": { + "gte": from_date.strftime("%Y-%m-%d"), + "lt": to_date.strftime("%Y-%m-%d") + } + } + } + ] + } + } + } + return query + + def code_review_ratio(self, date, repos_list): + query_pr_count = self.get_uuid_count_query( + "cardinality", repos_list, "uuid", size=0, from_date=(date-timedelta(days=90)), to_date=date) + pr_count = self.es_in.search(index=self.pr_index, body=query_pr_count)[ + 'aggregations']["count_of_uuid"]['value'] + query_pr_body = self.get_pr_message_count(repos_list, "uuid", "grimoire_creation_date", size=0, + filter_field="num_review_comments_without_bot", from_date=(date-timedelta(days=90)), to_date=date) + prs = self.es_in.search(index=self.pr_index, body=query_pr_body)[ + 'aggregations']["count_of_uuid"]['value'] + try: + return prs/pr_count, pr_count + except ZeroDivisionError: + return None, 0 + + def code_merge_ratio(self, date, repos_list): + query_pr_body = self.get_uuid_count_query( "cardinality", repos_list, "uuid", "grimoire_creation_date", size=0, from_date=(date-timedelta(days=90)), to_date=date) + query_pr_body["query"]["bool"]["must"].append({"match_phrase": {"pull_request": "true" }}) + query_pr_body["query"]["bool"]["must"].append({"match_phrase": {"merged": "true" }}) + pr_merged_count = self.es_in.search(index=self.pr_index, body=query_pr_body)[ + 'aggregations']["count_of_uuid"]['value'] + query_pr_body["query"]["bool"]["must"].append({ + "script": { + "script": "if(doc['merged_by_data_name'].size() > 0 && doc['author_name'].size() > 0 && doc['merged_by_data_name'].value != doc['author_name'].value){return true}" + } + }) + prs = self.es_in.search(index=self.pr_index, body=query_pr_body)[ + 'aggregations']["count_of_uuid"]['value'] + try: + return prs/pr_merged_count, pr_merged_count + except ZeroDivisionError: + return None, 0 + + def git_pr_linked_ratio(self, date, repos_list): + commit_frequency = self.get_uuid_count_query("cardinality", repos_list, "hash", "grimoire_creation_date", size=10000, from_date=date - timedelta(days=90), to_date=date) + commits_without_merge_pr = { + "bool": { + "should": [{"script": { + "script": "if (doc.containsKey('message') && doc['message'].size()>0 &&doc['message'].value.indexOf('Merge pull request') == -1){return true}" + } + }], + "minimum_should_match": 1} + } + commit_frequency["query"]["bool"]["must"].append(commits_without_merge_pr) + commit_message = self.es_in.search(index=self.git_index, body=commit_frequency) + commit_count = commit_message['aggregations']["count_of_uuid"]['value'] + commit_pr_cout = 0 + commit_all_message = [commit_message_i['_source']['hash'] for commit_message_i in commit_message['hits']['hits']] + + for commit_message_i in set(commit_all_message): + commit_hash = commit_message_i + if commit_hash in self.commit_message_dict: + commit_pr_cout += self.commit_message_dict[commit_hash] + else: + pr_message = self.get_uuid_count_query("cardinality", repos_list, "uuid", "grimoire_creation_date", size=0) + commit_hash_query = { "bool": {"should": [ {"match_phrase": {"commits_data": commit_hash} }], + "minimum_should_match": 1 + } + } + pr_message["query"]["bool"]["must"].append(commit_hash_query) + prs = self.es_in.search(index=self.pr_index, body=pr_message) + if prs['aggregations']["count_of_uuid"]['value']>0: + self.commit_message_dict[commit_hash] = 1 + commit_pr_cout += 1 + else: + self.commit_message_dict[commit_hash] = 0 + if commit_count>0: + return len(commit_all_message), commit_pr_cout, commit_pr_cout/len(commit_all_message) + else: + return 0, None, None + + def pr_issue_linked(self, date, repos_list): + pr_linked_issue = 0 + for repo in repos_list: + query_pr_linked_issue = self.get_pr_linked_issue_count( + repo, from_date=date-timedelta(days=90), to_date=date) + pr_linked_issue += self.es_in.search(index=(self.pr_index, self.pr_comments_index), body=query_pr_linked_issue)[ + 'aggregations']["count_of_uuid"]['value'] + query_pr_count = self.get_uuid_count_query( + "cardinality", repos_list, "uuid", size=0, from_date=(date-timedelta(days=90)), to_date=date) + query_pr_count["query"]["bool"]["must"].append({"match_phrase": {"pull_request": "true" }}) + pr_count = self.es_in.search(index=self.pr_index, + body=query_pr_count)[ + 'aggregations']["count_of_uuid"]['value'] + try: + return pr_linked_issue/pr_count + except ZeroDivisionError: + return None + + def pr_first_response_time(self, date, repos_list): + query_pr_first_reponse_avg = self.get_uuid_count_query( + "avg", repos_list, "time_to_first_attention_without_bot", "grimoire_creation_date", size=0, from_date=date-timedelta(days=90), to_date=date) + query_pr_first_reponse_avg["query"]["bool"]["must"].append({"match_phrase": {"pull_request": "true" }}) + pr_first_reponse = self.es_in.search(index=self.pr_index, body=query_pr_first_reponse_avg) + if pr_first_reponse["hits"]["total"] == 0: + return None, None + pr_first_reponse_avg = pr_first_reponse['aggregations']["count_of_uuid"]['value'] + query_pr_first_reponse_mid = self.get_uuid_count_query( + "percentiles", repos_list, "time_to_first_attention_without_bot", "grimoire_creation_date", size=0, from_date=date-timedelta(days=90), to_date=date) + query_pr_first_reponse_mid["query"]["bool"]["must"].append({"match_phrase": {"pull_request": "true" }}) + query_pr_first_reponse_mid["aggs"]["count_of_uuid"]["percentiles"]["percents"] = [ + 50] + pr_first_reponse_mid = self.es_in.search(index=self.pr_index, body=query_pr_first_reponse_mid)[ + 'aggregations']["count_of_uuid"]['values']['50.0'] + pr_first_reponse_mid = pr_first_reponse_mid if pr_first_reponse_mid != 'NaN' else None + return pr_first_reponse_avg, pr_first_reponse_mid + + def pr_open_time(self, date, repos_list): + query_pr_opens = self.get_uuid_count_query("avg", repos_list, "time_to_first_attention_without_bot", + "grimoire_creation_date", size=10000, from_date=date-timedelta(days=90), to_date=date) + query_pr_opens["query"]["bool"]["must"].append({"match_phrase": {"pull_request": "true" }}) + pr_opens_items = self.es_in.search( + index=self.pr_index, body=query_pr_opens)['hits']['hits'] + if len(pr_opens_items) == 0: + return None, None + pr_open_time_repo = [] + for item in pr_opens_items: + if 'state' in item['_source']: + if item['_source']['state'] == 'merged' and item['_source']['merged_at'] and str_to_datetime(item['_source']['merged_at']) < date: + pr_open_time_repo.append(get_time_diff_days( + item['_source']['created_at'], item['_source']['merged_at'])) + if item['_source']['state'] == 'closed' and str_to_datetime(item['_source']['closed_at'] or item['_source']['updated_at']) < date: + pr_open_time_repo.append(get_time_diff_days( + item['_source']['created_at'], item['_source']['closed_at'] or item['_source']['updated_at'])) + else: + pr_open_time_repo.append(get_time_diff_days( + item['_source']['created_at'], str(date))) + if len(pr_open_time_repo) == 0: + return None, None + pr_open_time_repo_avg = float(sum(pr_open_time_repo)/len(pr_open_time_repo)) + pr_open_time_repo_mid = get_medium(pr_open_time_repo) + return pr_open_time_repo_avg, pr_open_time_repo_mid + + def issue_first_reponse(self, date, repos_list): + query_issue_first_reponse_avg = self.get_uuid_count_query( + "avg", repos_list, "time_to_first_attention_without_bot", "grimoire_creation_date", size=0, from_date=date-timedelta(days=90), to_date=date) + query_issue_first_reponse_avg["query"]["bool"]["must"].append({"match_phrase": {"pull_request": "false" }}) + issue_first_reponse = self.es_in.search(index=self.issue_index, body=query_issue_first_reponse_avg) + if issue_first_reponse["hits"]["total"] == 0: + return None, None + issue_first_reponse_avg = issue_first_reponse['aggregations']["count_of_uuid"]['value'] + query_issue_first_reponse_mid = self.get_uuid_count_query( + "percentiles", repos_list, "time_to_first_attention_without_bot", "grimoire_creation_date", size=0, from_date=date-timedelta(days=90), to_date=date) + query_issue_first_reponse_mid["aggs"]["count_of_uuid"]["percentiles"]["percents"] = [ + 50] + query_issue_first_reponse_mid["query"]["bool"]["must"].append({"match_phrase": {"pull_request": "false" }}) + issue_first_reponse_mid = self.es_in.search(index=self.issue_index, body=query_issue_first_reponse_mid)[ + 'aggregations']["count_of_uuid"]['values']['50.0'] + issue_first_reponse_mid = issue_first_reponse_mid if not isinstance(issue_first_reponse_mid, str) else None + return issue_first_reponse_avg, issue_first_reponse_mid + + def issue_open_time(self, date, repos_list): + query_issue_opens = self.get_uuid_count_query("avg", repos_list, "time_to_first_attention_without_bot", "grimoire_creation_date", size=10000, from_date=date-timedelta(days=90), to_date=date) + query_issue_opens["query"]["bool"]["must"].append({"match_phrase": {"pull_request": "false" }}) + issue_opens_items = self.es_in.search(index=self.issue_index, body=query_issue_opens)['hits']['hits'] + if len(issue_opens_items) == 0: + return None, None + issue_open_time_repo = [] + for item in issue_opens_items: + if 'state' in item['_source']: + if item['_source']['closed_at']: + if item['_source']['state'] in ['closed', 'rejected'] and str_to_datetime(item['_source']['closed_at']) < date: + issue_open_time_repo.append(get_time_diff_days( + item['_source']['created_at'], item['_source']['closed_at'])) + else: + issue_open_time_repo.append(get_time_diff_days( + item['_source']['created_at'], str(date))) + if len(issue_open_time_repo) == 0: + return None, None + issue_open_time_repo_avg = sum(issue_open_time_repo)/len(issue_open_time_repo) + issue_open_time_repo_mid = get_medium(issue_open_time_repo) + return issue_open_time_repo_avg, issue_open_time_repo_mid + + def comment_frequency(self, date, repos_list): + query_issue_comments_count = self.get_uuid_count_query( + "sum", repos_list, "num_of_comments_without_bot", date_field='grimoire_creation_date', size=0, from_date=(date-timedelta(days=90)), to_date=date) + query_issue_comments_count["query"]["bool"]["must"].append({"match_phrase": {"pull_request": "false" }}) + issue = self.es_in.search( + index=self.issue_index, body=query_issue_comments_count) + try: + return float(issue['aggregations']["count_of_uuid"]['value']/issue["hits"]["total"]) + except ZeroDivisionError: + return None + + def metrics_model_enrich(self, repos_list, label, type=None, level=None, date_list=None): + level = level if level is not None else self.level + date_list = date_list if date_list is not None else self.date_list + item_datas = [] + last_metrics_data = {} + self.commit_message_dict = {} + for date in date_list: + print(str(date)+"--"+self.model_name+"--"+label) + created_since = self.created_since(date, repos_list) + if created_since is None: + continue + code_review_ratio, pr_count = self.code_review_ratio(date, repos_list) + # print("code_review_ratio", code_review_ratio) + code_merge_ratio, pr_merged_count = self.code_merge_ratio(date, repos_list) + # print("code_merge_ratio", code_merge_ratio) + git_pr_linked_ratio = self.git_pr_linked_ratio(date, repos_list) + # print("git_pr_linked_ratio", git_pr_linked_ratio) + pr_issue_linked_ratio = self.pr_issue_linked(date, repos_list) + # print("pr_issue_linked_ratio", pr_issue_linked_ratio) + pr_first_response_time = self.pr_first_response_time(date, repos_list) + # print("pr_first_response_time", pr_first_response_time) + pr_open_time = self.pr_open_time(date, repos_list) + issue_first = self.issue_first_reponse(date, repos_list) + # print(issue_first[0], issue_first[1]) + issue_open_time = self.issue_open_time(date, repos_list) + comment_frequency = self.comment_frequency(date, repos_list) + metrics_data = { + 'uuid': get_uuid(str(date), self.community, level, label, self.model_name, type), + 'level': level, + 'type': type, + 'label': label, + 'model_name': self.model_name, + 'code_review_ratio': code_review_ratio, + 'code_merge_ratio': code_merge_ratio, + 'git_pr_linked_ratio': git_pr_linked_ratio[2], + 'pr_issue_linked_ratio': pr_issue_linked_ratio, + 'pr_first_response_time_avg': round(pr_first_response_time[0], 4) if pr_first_response_time[0] is not None else None, + 'pr_first_response_time_mid': round(pr_first_response_time[1], 4) if pr_first_response_time[1] is not None else None, + 'pr_open_time_avg': round(pr_open_time[0], 4) if pr_open_time[0] is not None else None, + 'pr_open_time_mid': round(pr_open_time[1], 4) if pr_open_time[1] is not None else None, + 'issue_first_reponse_avg': round(issue_first[0], 4) if issue_first[0] is not None else None, + 'issue_first_reponse_mid': round(issue_first[1], 4) if issue_first[1] is not None else None, + 'issue_open_time_avg': round(issue_open_time[0], 4) if issue_open_time[0] is not None else None, + 'issue_open_time_mid': round(issue_open_time[1], 4) if issue_open_time[1] is not None else None, + 'comment_frequency': float(round(comment_frequency, 4)) if comment_frequency is not None else None, + 'grimoire_creation_date': date.isoformat(), + 'metadata__enriched_on': datetime_utcnow().isoformat() + } + # TODO + self.cache_last_metrics_data(metrics_data, last_metrics_data) + score = get_codeDevQuality_score(codeDevQuality_decay(metrics_data, last_metrics_data, level), level) + metrics_data["code_develop_quality_score"] = score + item_datas.append(metrics_data) + if len(item_datas) > MAX_BULK_UPDATE_SIZE: + self.es_out.bulk_upload(item_datas, "uuid") + item_datas = [] + self.es_out.bulk_upload(item_datas, "uuid") + + def cache_last_metrics_data(self, item, last_metrics_data): + for i in ["issue_first_reponse_avg", "issue_first_reponse_mid", + "pr_open_time_avg","pr_open_time_mid", + "pr_first_response_time_avg", "pr_first_response_time_mid", + "comment_frequency", "code_merge_ratio", "code_review_ratio", + "pr_issue_linked_ratio", "git_pr_linked_ratio"]: + if item[i] != None: + data = [item[i],item['grimoire_creation_date']] + last_metrics_data[i] = data diff --git a/metrics_model/codeSecurityModel.py b/metrics_model/codeSecurityModel.py new file mode 100644 index 0000000..d21a816 --- /dev/null +++ b/metrics_model/codeSecurityModel.py @@ -0,0 +1,136 @@ +from .metrics_model import MetricsModel + +from .utils import (get_all_repo, + newest_message, + check_times_has_overlap, + add_release_message, + get_release_index_mapping, + create_release_index, + get_all_project, + get_time_diff_months, + get_medium, + get_uuid, + get_date_list, + get_codeDevActicity_score, + get_codeDevQuality_score, + get_codeSecurity_score, + codeDevQuality_decay + ) + +import logging +from datetime import datetime, timedelta +logger = logging.getLogger(__name__) +from grimoirelab_toolkit.datetime import (datetime_utcnow, + str_to_datetime) +from grimoire_elk.enriched.utils import get_time_diff_days +MAX_BULK_UPDATE_SIZE = 500 +import random +class CodeSecurityModel(MetricsModel): + def __init__(self, issue_index=None, pr_index=None, repo_index=None, json_file=None, git_index=None, cocom_index=None, colic_index=None, out_index=None, git_branch=None, from_date=None, end_date=None, community=None, level=None, company=None, pr_comments_index=None): + super().__init__(json_file, from_date, end_date, out_index, community, level) + self.git_index = git_index + self.issue_index = issue_index + self.repo_index = repo_index + self.git_branch = git_branch + self.pr_index = pr_index + self.cocom_index = cocom_index + self.colic_index = colic_index + self.pr_comments_index = pr_comments_index + self.model_name = 'Code security' + self.company = None if company == None or company == 'None' else company + + def bug_issue_open_time(self, date, repos_list): + query_issue_opens = self.get_uuid_count_query("avg", repos_list, "time_to_first_attention_without_bot", + "grimoire_creation_date", size=10000, from_date=date-timedelta(days=90), to_date=date) + query_issue_opens["query"]["bool"]["must"].append({"match_phrase": {"pull_request": "false" }}) + bug_query = { + "bool": { + "should": [{ + "script": { + "script": "if (doc.containsKey('labels') && doc['labels'].size()>0) { for (int i = 0; i < doc['labels'].length; ++i){ if(doc['labels'][i].toLowerCase().indexOf('bug')!=-1|| doc['labels'][i].toLowerCase().indexOf('缺陷')!=-1){return true;}}}" + } + }, + { + "script": { + "script": "if (doc.containsKey('issue_type') && doc['issue_type'].size()>0) { for (int i = 0; i < doc['issue_type'].length; ++i){ if(doc['issue_type'][i].toLowerCase().indexOf('bug')!=-1 || doc['issue_type'][i].toLowerCase().indexOf('缺陷')!=-1){return true;}}}" + } + }], + "minimum_should_match": 1 + } + } + query_issue_opens["query"]["bool"]["must"].append(bug_query) + issue_opens_items = self.es_in.search( + index=self.issue_index, body=query_issue_opens)['hits']['hits'] + if len(issue_opens_items) == 0: + return None, None + issue_open_time_repo = [] + for item in issue_opens_items: + if 'state' in item['_source']: + if item['_source']['closed_at'] and item['_source']['state'] in ['closed', 'rejected'] and str_to_datetime(item['_source']['closed_at']) < date: + issue_open_time_repo.append(get_time_diff_days( + item['_source']['created_at'], item['_source']['closed_at'])) + else: + issue_open_time_repo.append(get_time_diff_days( + item['_source']['created_at'], str(date))) + issue_open_time_repo_avg = sum(issue_open_time_repo)/len(issue_open_time_repo) + issue_open_time_repo_mid = get_medium(issue_open_time_repo) + return issue_open_time_repo_avg, issue_open_time_repo_mid + + def code_cyclomatic_complexity(self, date, repos_list): + query = self.get_uuid_count_query('sum', repos_list, 'ccn', 'grimoire_creation_date', size=0, from_date=date-timedelta(days=90), to_date=date) + code_cyclomatic_complexity = self.es_in.search(index=self.cocom_index, body=query)[ + 'aggregations']['count_of_uuid']['value'] + return code_cyclomatic_complexity/12.85 + + def licenses_include_percent(self, date, repos_list): + query = self.get_uuid_count_query('sum', repos_list, 'has_license', 'grimoire_creation_date', size=0, from_date=date-timedelta(days=90), to_date=date) + answer = self.es_in.search(index=self.colic_index, body=query) + has_license_count = answer['aggregations']['count_of_uuid']['value'] + total_files = answer['hits']['total'] if answer['hits']['total'] is not 0 else 1 + return has_license_count / total_files + + def metrics_model_enrich(self, repos_list, label, type=None, level=None, date_list=None): + level = level if level is not None else self.level + date_list = date_list if date_list is not None else self.date_list + item_datas = [] + last_metrics_data = {} + self.commit_message_dict = {} + for date in date_list: + print(str(date)+"--"+self.model_name+"--"+label) + created_since = self.created_since(date, repos_list) + if created_since is None: + continue + bug_issue_open_time = self.bug_issue_open_time(date, repos_list) + vulnerability_count = self.vulnerability_count(date, repos_list) + defect_count = self.defect_count(date, repos_list) + code_smell = self.code_smell(date, repos_list) + code_clone_percent = self.code_clone_percent(date, repos_list) + code_cyclomatic_complexity = self.code_cyclomatic_complexity(date, repos_list) + # print("code_cyclomatic_complexity", code_cyclomatic_complexity) + licenses_include_percent = self.licenses_include_percent(date, repos_list) + # print("licenses_include_percent", licenses_include_percent) + metrics_data = { + 'uuid': get_uuid(str(date), self.community, level, label, self.model_name, type), + 'level': level, + 'type': type, + 'label': label, + 'model_name': self.model_name, + 'bug_issue_open_time_avg': round(bug_issue_open_time[0], 4) if bug_issue_open_time[0] is not None else None, + 'bug_issue_open_time_mid': round(bug_issue_open_time[1], 4) if bug_issue_open_time[1] is not None else None, + 'vulnerability_count' : vulnerability_count, + 'defect_count': defect_count, + 'code_smell': code_smell, + 'code_clone_percent': code_clone_percent, + 'code_cyclomatic_complexity': code_cyclomatic_complexity, + 'licenses_include_percent': licenses_include_percent, + 'grimoire_creation_date': date.isoformat(), + 'metadata__enriched_on': datetime_utcnow().isoformat() + } + # TODO + score = get_codeSecurity_score(metrics_data, level) + metrics_data["code_security_score"] = score + item_datas.append(metrics_data) + if len(item_datas) > MAX_BULK_UPDATE_SIZE: + self.es_out.bulk_upload(item_datas, "uuid") + item_datas = [] + self.es_out.bulk_upload(item_datas, "uuid") diff --git a/metrics_model/communityActivityModel.py b/metrics_model/communityActivityModel.py new file mode 100644 index 0000000..f4fddce --- /dev/null +++ b/metrics_model/communityActivityModel.py @@ -0,0 +1,100 @@ +from .metrics_model import MetricsModel + +from .utils import (get_all_repo, + newest_message, + check_times_has_overlap, + add_release_message, + get_release_index_mapping, + create_release_index, + get_all_project, + get_time_diff_months, + get_medium, + get_uuid, + get_date_list, + get_codeDevActicity_score, + get_codeDevQuality_score, + get_codeSecurity_score, + get_communityActivity_score, + codeDevQuality_decay + ) + +import logging +from datetime import datetime, timedelta +logger = logging.getLogger(__name__) +from grimoirelab_toolkit.datetime import (datetime_utcnow, + str_to_datetime) +from grimoire_elk.enriched.utils import get_time_diff_days +MAX_BULK_UPDATE_SIZE = 500 + +class CommunityActivityModel(MetricsModel): + def __init__(self, issue_index=None, pr_index=None, repo_index=None, json_file=None, git_index=None, issue_comments_index=None, out_index=None, git_branch=None, from_date=None, end_date=None, community=None, level=None, company=None, pr_comments_index=None): + super().__init__(json_file, from_date, end_date, out_index, community, level) + self.git_index = git_index + self.issue_index = issue_index + self.repo_index = repo_index + self.git_branch = git_branch + self.pr_index = pr_index + self.issue_comments_index = issue_comments_index + self.pr_comments_index = pr_comments_index + self.model_name = 'community activity' + self.company = None if company == None or company == 'None' else company + + def contributors_number(self, date, repos_list): + query_author_uuid_data = self.get_uuid_count_contribute_query( + repos_list, company=None, from_date=(date - timedelta(days=90)), to_date=date) + author_uuid_count = self.es_in.search(index=(self.git_index, self.issue_index, self.pr_index, self.issue_comments_index,self.pr_comments_index), body=query_author_uuid_data)[ + 'aggregations']["count_of_contributors"]['value'] + return author_uuid_count + + def updated_since(self, date, repos_list): + updated_since_list = [] + for repo in repos_list: + query_updated_since = self.get_updated_since_query( + [repo], date_field='metadata__updated_on', to_date=date) + updated_since = self.es_in.search( + index=self.git_index, body=query_updated_since)['hits']['hits'] + if updated_since: + updated_since_list.append(get_time_diff_months( + updated_since[0]['_source']["metadata__updated_on"], str(date))) + if updated_since_list: + return sum(updated_since_list) / len(updated_since_list) + else: + return 0 + + def metrics_model_enrich(self, repos_list, label, type=None, level=None, date_list=None): + level = level if level is not None else self.level + date_list = date_list if date_list is not None else self.date_list + item_datas = [] + last_metrics_data = {} + self.commit_message_dict = {} + for date in date_list: + print(str(date)+"--"+self.model_name+"--"+label) + created_since = self.created_since(date, repos_list) + if created_since is None: + continue + contributors_number = self.contributors_number(date, repos_list) + # print("contributors_number", contributors_number) + updated_at = self.updated_since(date, repos_list) + print("updated_at", updated_at) + print("created_since", created_since) + metrics_data = { + 'uuid': get_uuid(str(date), self.community, level, label, self.model_name, type), + 'level': level, + 'type': type, + 'label': label, + 'model_name': self.model_name, + 'contributors_number': contributors_number, + 'updated_at': float(round(updated_at, 4)), + 'created_at': float(round(created_since, 4)), + 'grimoire_creation_date': date.isoformat(), + 'metadata__enriched_on': datetime_utcnow().isoformat() + } + # TODO + score = get_communityActivity_score(metrics_data, level) + metrics_data["community_activity_score"] = score + item_datas.append(metrics_data) + if len(item_datas) > MAX_BULK_UPDATE_SIZE: + self.es_out.bulk_upload(item_datas, "uuid") + item_datas = [] + self.es_out.bulk_upload(item_datas, "uuid") + diff --git a/metrics_model/humanDiversityModel.py b/metrics_model/humanDiversityModel.py new file mode 100644 index 0000000..8631659 --- /dev/null +++ b/metrics_model/humanDiversityModel.py @@ -0,0 +1,208 @@ +from .metrics_model import MetricsModel + +from .utils import (get_all_repo, + newest_message, + check_times_has_overlap, + add_release_message, + get_release_index_mapping, + create_release_index, + get_all_project, + get_time_diff_months, + get_medium, + get_uuid, + get_date_list, + get_codeDevActicity_score, + get_codeDevQuality_score, + get_codeSecurity_score, + get_communityActivity_score, + get_humanDiversity_score, + codeDevQuality_decay + ) + +import logging +from datetime import datetime, timedelta +logger = logging.getLogger(__name__) +from grimoirelab_toolkit.datetime import (datetime_utcnow, + str_to_datetime) +from grimoire_elk.enriched.utils import get_time_diff_days +MAX_BULK_UPDATE_SIZE = 500 + +class HumanDiversityModel(MetricsModel): + def __init__(self, issue_index=None, pr_index=None, repo_index=None, json_file=None, git_index=None, issue_comments_index=None, out_index=None, git_branch=None, from_date=None, end_date=None, community=None, level=None, company=None, pr_comments_index=None): + super().__init__(json_file, from_date, end_date, out_index, community, level) + self.git_index = git_index + self.issue_index = issue_index + self.repo_index = repo_index + self.git_branch = git_branch + self.pr_index = pr_index + self.issue_comments_index = issue_comments_index + self.pr_comments_index = pr_comments_index + self.model_name = 'human Diversity' + self.company = None if company == None or company == 'None' else company + + def get_org_count_query(self, repos_list, field, from_date=str_to_datetime("1970-01-01"), to_date=datetime_utcnow()): + query = { + "size": 0, + "aggs": { + "count_of_orgs": { + "cardinality": { + "field": field + } + } + }, + "query": + {"bool": { + "must": [ + {"bool": + {"should": + [{"simple_query_string": + {"query": i + "*", + "fields": + ["tag"]}}for i in repos_list], + "minimum_should_match": 1, + "filter": + {"range": + + {"grimoire_creation_date": + {"gte": from_date.strftime("%Y-%m-%d"), "lt": to_date.strftime("%Y-%m-%d")}}} + } + }]}}, + } + return query + + def location_distribution(self, date, repos_list): + query = self.get_org_count_query(repos_list, "tz", from_date=(date - timedelta(days=90)), to_date=date) + tz_count = self.es_in.search(index=(self.git_index, self.issue_index, self.pr_index, self.issue_comments_index,self.pr_comments_index), body=query)['aggregations']["count_of_orgs"]['value'] + return tz_count + + def organization_count(self, date, repos_list): + query = self.get_org_count_query(repos_list, "author_domain", from_date=(date - timedelta(days=90)), to_date=date) + org_count = self.es_in.search(index=(self.git_index, self.issue_index, self.pr_index, self.issue_comments_index,self.pr_comments_index), body=query)[ + 'aggregations']["count_of_orgs"]['value'] + return org_count + + def bus_factor(self, date, repos_list): + query = { + "size": 0, + "track_total_hits": "true", + "aggs": { + "my_field_count": { + "terms": { + "field": "author_name", + "min_doc_count": 3 + } + } + }, + "query": + {"bool": { + "must": [ + {"bool": + {"should": + [{"simple_query_string": + {"query": i + "*", + "fields": + ["tag"]}}for i in repos_list], + "minimum_should_match": 1, + "filter": + {"range": + + {"grimoire_creation_date": + {"gte": (date - timedelta(days=90)).strftime("%Y-%m-%d"), "lt": date.strftime("%Y-%m-%d")}}} + } + }]}}, + } + answer = self.es_in.search(index=self.git_index, body=query) + half_total = answer["hits"]["total"] / 2 + developers = answer["aggregations"]["my_field_count"]["buckets"] + result = 0 + cur = 0 + for dev in developers: + cur += dev["doc_count"] + result += 1 + if cur >= half_total: + break + return result + + def elephant_factor(self, date, repos_list): + query = { + "size": 0, + "track_total_hits": "true", + "aggs": { + "my_field_count": { + "terms": { + "field": "author_domain", + "min_doc_count": 3 + } + } + }, + "query": + {"bool": { + "must": [ + {"bool": + {"should": + [{"simple_query_string": + {"query": i + "*", + "fields": + ["tag"]}}for i in repos_list], + "minimum_should_match": 1, + "filter": + {"range": + + {"grimoire_creation_date": + {"gte": (date - timedelta(days=90)).strftime("%Y-%m-%d"), "lt": date.strftime("%Y-%m-%d")}}} + } + }]}}, + } + answer = self.es_in.search(index=self.git_index, body=query) + half_total = answer["hits"]["total"] / 2 + developers = answer["aggregations"]["my_field_count"]["buckets"] + result = 0 + cur = 0 + for dev in developers: + cur += dev["doc_count"] + result += 1 + if cur >= half_total: + break + return result + + def metrics_model_enrich(self, repos_list, label, type=None, level=None, date_list=None): + level = level if level is not None else self.level + date_list = date_list if date_list is not None else self.date_list + item_datas = [] + last_metrics_data = {} + self.commit_message_dict = {} + for date in date_list: + print(str(date)+"--"+self.model_name+"--"+label) + created_since = self.created_since(date, repos_list) + if created_since is None: + continue + location_distribution = self.location_distribution(date, repos_list) + print("location_distribution", location_distribution) + organization_count = self.organization_count(date, repos_list) + print("organization_count", organization_count) + bus_factor = self.bus_factor(date, repos_list) + print("bus_factor", bus_factor) + elephant_factor = self.elephant_factor(date, repos_list) + print("elephant_factor", elephant_factor) + metrics_data = { + 'uuid': get_uuid(str(date), self.community, level, label, self.model_name, type), + 'level': level, + 'type': type, + 'label': label, + 'model_name': self.model_name, + 'location_distribution': location_distribution, + 'organization_count': organization_count, + 'bus_factor': bus_factor, + 'elephant_factor': elephant_factor, + 'grimoire_creation_date': date.isoformat(), + 'metadata__enriched_on': datetime_utcnow().isoformat() + } + score = get_humanDiversity_score(metrics_data, level) + metrics_data["human_diversity_score"] = score + print("human_diversity_score", score) + item_datas.append(metrics_data) + if len(item_datas) > MAX_BULK_UPDATE_SIZE: + self.es_out.bulk_upload(item_datas, "uuid") + item_datas = [] + self.es_out.bulk_upload(item_datas, "uuid") + diff --git a/metrics_model/metrics_model.py b/metrics_model/metrics_model.py new file mode 100644 index 0000000..3d5a25c --- /dev/null +++ b/metrics_model/metrics_model.py @@ -0,0 +1,636 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Copyright (C) 2021-2022 Yehui Wang, Chenqi Shan +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# Authors: +# Yehui Wang +# Chenqi Shan + +from perceval.backend import uuid +from datetime import datetime, timedelta +from urllib.parse import urlparse +import json +import yaml +import pandas as pd +import logging +from grimoire_elk.enriched.utils import get_time_diff_days +from grimoirelab_toolkit.datetime import (datetime_utcnow, + str_to_datetime) +from elasticsearch import Elasticsearch, RequestsHttpConnection +from elasticsearch import helpers +from elasticsearch.exceptions import NotFoundError +from grimoire_elk.elastic import ElasticSearch + +from .utils import (get_all_repo, + newest_message, + check_times_has_overlap, + add_release_message, + get_release_index_mapping, + create_release_index, + get_all_project, + get_time_diff_months, + get_medium, + get_uuid, + get_date_list, + get_codeDevActicity_score + ) + +import os +import inspect +import sys +current_dir = os.path.dirname(os.path.abspath( + inspect.getfile(inspect.currentframe()))) +os.chdir(current_dir) +sys.path.append('../') + +logger = logging.getLogger(__name__) + +MAX_BULK_UPDATE_SIZE = 500 + + +class MetricsModel: + def __init__(self, json_file, from_date, end_date, out_index=None, risk_index=None, community=None, level=None): + """Metrics Model is designed for the integration of multiple CHAOSS metrics. + :param json_file: the path of json file containing repository message. + :param out_index: target index for Metrics Model. + :param community: used to mark the repo belongs to which community. + :param level: str representation of the metrics, choose from repo, project, community. + """ + self.json_file = json_file + self.out_index = out_index + self.risk_index = risk_index + self.community = community + self.level = level + self.from_date = from_date + self.end_date = end_date + self.date_list = get_date_list(from_date, end_date) + + def metrics_model_metrics(self, elastic_url): + is_https = urlparse(elastic_url).scheme == 'https' + self.es_in = Elasticsearch( + elastic_url, use_ssl=is_https, verify_certs=False, connection_class=RequestsHttpConnection) + self.es_out = ElasticSearch(elastic_url, self.out_index) + print("here1") + self.risk_out = ElasticSearch(elastic_url, self.risk_index) + print("here2") + print(self.level) + all_repo_json = json.load(open(self.json_file)) + if self.level == "community": + software_artifact_repos_list = [] + governance_repos_list = [] + for project in all_repo_json: + origin = 'gitee' if 'gitee' in self.issue_index else 'github' + origin_software_artifact = origin + "-software-artifact" + origin_governance = origin + "-governance" + for key in all_repo_json[project].keys(): + if key == origin_software_artifact: + for j in all_repo_json[project].get(key): + software_artifact_repos_list.append(j) + if key == origin_governance: + for j in all_repo_json[project].get(key): + governance_repos_list.append(j) + all_repo_list = software_artifact_repos_list + governance_repos_list + if len(all_repo_list) > 0: + for repo in all_repo_list: + # last_time = self.last_metrics_model_time(repo, self.model_name, "repo") + # if last_time is None: + # self.metrics_model_enrich(repos_list=[repo], label=repo, level="repo", + # date_list=get_date_list(self.from_date, self.end_date)) + # if last_time is not None and last_time < self.end_date: + # self.metrics_model_enrich(repos_list=[repo], label=repo, level="repo", + # date_list=get_date_list(last_time, self.end_date)) + self.metrics_model_enrich(repos_list=[repo], label=repo, level="repo", + date_list=get_date_list(self.from_date, self.end_date)) + if len(software_artifact_repos_list) > 0: + self.metrics_model_enrich(software_artifact_repos_list, self.community, "software-artifact") + if len(governance_repos_list) > 0: + self.metrics_model_enrich(governance_repos_list, self.community, "governance") + if self.level == "project": + for project in all_repo_json: + software_artifact_repos_list = [] + governance_repos_list = [] + origin = 'gitee' if 'gitee' in self.issue_index else 'github' + origin_software_artifact = origin + "-software-artifact" + origin_governance = origin + "-governance" + for key in all_repo_json[project].keys(): + if key == origin_software_artifact: + for j in all_repo_json[project].get(key): + software_artifact_repos_list.append(j) + if key == origin_governance: + for j in all_repo_json[project].get(key): + governance_repos_list.append(j) + all_repo_list = software_artifact_repos_list + governance_repos_list + if len(all_repo_list) > 0: + for repo in all_repo_list: + last_time = self.last_metrics_model_time(repo, self.model_name, "repo") + if last_time is None: + self.metrics_model_enrich(repos_list=[repo], label=repo, level="repo", + date_list=get_date_list(self.from_date, self.end_date)) + if last_time is not None and last_time < self.end_date: + self.metrics_model_enrich(repos_list=[repo], label=repo, level="repo", + date_list=get_date_list(last_time, self.end_date)) + if len(software_artifact_repos_list) > 0: + self.metrics_model_enrich(software_artifact_repos_list, project, "software-artifact") + if len(governance_repos_list) > 0: + self.metrics_model_enrich(governance_repos_list, project, "governance") + if self.level == "repo": + for project in all_repo_json: + origin = 'gitee' if 'gitee' in self.issue_index else 'github' + origin_software_artifact = origin + "-software-artifact" + origin_governance = origin + "-governance" + for key in all_repo_json[project].keys(): + if key == origin_software_artifact or key == origin_governance or key == origin: + for j in all_repo_json[project].get(key): + self.metrics_model_enrich([j], j) + + def metrics_model_enrich(repos_list, label, type=None, level=None, date_list=None): + pass + + def get_last_metrics_model_query(self, repo_url, model_name, level): + query = { + "size": 1, + "query": { + "bool": { + "must": [ + { + "match_phrase": { + "label": repo_url + } + }, + { + "term": { + "model_name.keyword": model_name + } + }, + { + "term": { + "level.keyword":level + } + } + ] + } + }, + "sort": [ + { + "grimoire_creation_date": { + "order": "desc", + "unmapped_type": "keyword" + } + } + ] + } + return query + + def last_metrics_model_time(self, repo_url, model_name, level): + query = self.get_last_metrics_model_query(repo_url, model_name, level) + try: + query_hits = self.es_in.search(index=self.out_index, body=query)["hits"]["hits"] + return query_hits[0]["_source"]["grimoire_creation_date"] if query_hits.__len__() > 0 else None + except NotFoundError: + return None + + def created_since(self, date, repos_list): + created_since_list = [] + for repo in repos_list: + query_first_commit_since = self.get_updated_since_query( + [repo], date_field='grimoire_creation_date', to_date=date, order="asc") + first_commit_since = self.es_in.search( + index=self.git_index, body=query_first_commit_since)['hits']['hits'] + if len(first_commit_since) > 0: + creation_since = first_commit_since[0]['_source']["grimoire_creation_date"] + created_since_list.append( + get_time_diff_months(creation_since, str(date))) + # print(get_time_diff_months(creation_since, str(date))) + # print(repo) + if created_since_list: + return sum(created_since_list) + else: + return None + + def get_uuid_count_query(self, option, repos_list, field, date_field="grimoire_creation_date", size=0, from_date=str_to_datetime("1970-01-01"), to_date=datetime_utcnow()): + query = { + "size": size, + "track_total_hits": "true", + "aggs": {"count_of_uuid": + {option: + {"field": field} + } + }, + "query": + {"bool": { + "must": [ + {"bool": + {"should": + [{"simple_query_string": + {"query": i + "*", + "fields": + ["tag"]}}for i in repos_list], + "minimum_should_match": 1, + "filter": + {"range": + {date_field: + {"gte": from_date.strftime("%Y-%m-%d"), "lt": to_date.strftime("%Y-%m-%d")}}} + } + }]}} + } + return query + + def get_uuid_count_contribute_query(self, repos_list, company=None, from_date=str_to_datetime("1970-01-01"), to_date=datetime_utcnow()): + query = { + "size": 0, + "aggs": { + "count_of_contributors": { + "cardinality": { + "field": "author_name" + } + } + }, + "query": + {"bool": { + "must": [ + {"bool": + {"should": + [{"simple_query_string": + {"query": i + "*", + "fields": + ["tag"]}}for i in repos_list], + "minimum_should_match": 1, + "filter": + {"range": + {"grimoire_creation_date": + {"gte": from_date.strftime("%Y-%m-%d"), "lt": to_date.strftime("%Y-%m-%d")}}} + } + }]}}, + } + + if company: + query["query"]["bool"]["must"] = [{"bool": { + "should": [ + { + "simple_query_string": { + "query": company + "*", + "fields": [ + "author_domain" + ] + } + }], + "minimum_should_match": 1}}] + return query + + def get_updated_since_query(self, repos_list, date_field="grimoire_creation_date", order="desc", to_date=datetime_utcnow()): + query = { + "query": { + "bool": { + "should": [ + { + "match_phrase": { + "tag": repo + }} for repo in repos_list], + "minimum_should_match": 1, + "filter": { + "range": { + date_field: { + "lt": to_date.strftime("%Y-%m-%d") + } + } + } + } + }, + "sort": [ + { + date_field: {"order": order} + } + ] + } + return query + + def get_issue_closed_uuid_count(self, option, repos_list, field, from_date=str_to_datetime("1970-01-01"), to_date=datetime_utcnow()): + query = { + "size": 0, + "track_total_hits": True, + "aggs": { + "count_of_uuid": { + option: { + "field": field + } + } + }, + "query": { + "bool": { + "must": [{ + "bool": { + "should": [{ + "simple_query_string": { + "query": i, + "fields": ["tag"] + }}for i in repos_list], + "minimum_should_match": 1 + } + }], + "must_not": [ + {"term": {"state": "open"}}, + {"term": {"state": "progressing"}} + ], + "filter": { + "range": { + "closed_at": { + "gte": from_date.strftime("%Y-%m-%d"), + "lt": to_date.strftime("%Y-%m-%d") + } + } + } + } + } + } + + return query + + def get_pr_closed_uuid_count(self, option, repos_list, field, from_date=str_to_datetime("1970-01-01"), to_date=datetime_utcnow()): + query = { + "size": 0, + "track_total_hits": True, + "aggs": { + "count_of_uuid": { + option: { + "field": field + } + } + }, + "query": { + "bool": { + "must": [{ + "bool": { + "should": [{ + "simple_query_string": { + "query": i, + "fields": ["tag"] + }}for i in repos_list], + "minimum_should_match": 1 + } + }, + { + "match_phrase": { + "pull_request": "true" + } + } + ], + "must_not": [ + {"term": {"state": "open"}}, + {"term": {"state": "progressing"}} + ], + "filter": { + "range": { + "closed_at": { + "gte": from_date.strftime("%Y-%m-%d"), + "lt": to_date.strftime("%Y-%m-%d") + } + } + } + } + } + } + + return query + + def get_recent_releases_uuid_count(self, option, repos_list, field, from_date=str_to_datetime("1970-01-01"), to_date=datetime_utcnow()): + query = { + "size": 0, + "track_total_hits": True, + "aggs": { + "count_of_uuid": { + option: { + "field": field + '.keyword' + } + } + }, + "query": { + "bool": { + "must": [{ + "bool": { + "should": [{ + "simple_query_string": { + "query": i, + "fields": ["tag.keyword"] + }}for i in repos_list], + "minimum_should_match": 1 + } + } + ], + "filter": { + "range": { + "grimoire_creation_date": { + "gte": from_date.strftime("%Y-%m-%d"), + "lt": to_date.strftime("%Y-%m-%d") + } + } + } + } + } + } + + return query + + # name list of author_name in a index + def get_all_CX_contributors(self, repos_list, search_index, pr=False, issue=False, from_date=str_to_datetime("1970-01-01"), to_date=datetime_utcnow()): + query_CX_users = { + "aggs": { + "name": { + "terms": { + "field": "author_name", + "size": 100000 + }, "aggs": { + "date": { + "top_hits": { + "sort": [{ + "grimoire_creation_date": {"order": "asc"} + }], + "size": 1 + } + } + } + } + }, + "query": { + "bool": { + "should": [ + { + "simple_query_string": { + "query": i+"(*) OR " + i+"*", + "fields": [ + "tag" + ] + } + } for i in repos_list + ], + "minimum_should_match": 1, + "filter": { + "range": { + "grimoire_creation_date": { + "gte": from_date.strftime("%Y-%m-%d"), "lte": to_date.strftime("%Y-%m-%d") + } + } + } + } + }, + "size": 0, + "from": 0 + } + if pr: + query_CX_users["query"]["bool"]["must"] = { + "match_phrase": { + "pull_request": "true" + } + } + if issue: + query_CX_users["query"]["bool"]["must"] = { + "match_phrase": { + "pull_request": "false" + } + } + CX_contributors = self.es_in.search(index=search_index, body=query_CX_users)[ + "aggregations"]["name"]["buckets"] + return [i["date"]["hits"]["hits"][0]["_source"] for i in CX_contributors] + + def get_all_CX_comments_contributors(self, repos_list, search_index, pr=False, issue=False, from_date=str_to_datetime("1970-01-01"), to_date=datetime_utcnow()): + query_CX_users = { + "aggs": { + "name": { + "terms": { + "field": "author_name", + "size": 100000 + }, "aggs": { + "date": { + "top_hits": { + "sort": [{ + "grimoire_creation_date": {"order": "asc"} + }], + "size": 1 + } + } + } + } + }, + "query": { + "bool": { + "should": [ + { + "simple_query_string": { + "query": i+"(*) OR " + i+"*", + "fields": [ + "tag" + ] + } + } for i in repos_list + ], + "minimum_should_match": 1, + "filter": { + "range": { + "grimoire_creation_date": { + "gte": from_date.strftime("%Y-%m-%d"), "lte": to_date.strftime("%Y-%m-%d") + } + } + } + } + }, + "size": 1, + "from": 0 + } + if pr: + query_CX_users["query"]["bool"]["must"] = [ + { + "match_phrase": { + "item_type": "comment" + } + }] + # print(query_CX_users) + if issue: + query_CX_users["query"]["bool"]["must"] = [ + { + "match_phrase": { + "item_type": "comment" + } + }, { + "match_phrase": { + "issue_pull_request": "false" + } + }] + CX_contributors = self.es_in.search(index=search_index, body=query_CX_users)[ + "aggregations"]["name"]["buckets"] + all_contributors = [i["date"]["hits"]["hits"] + [0]["_source"] for i in CX_contributors] + return all_contributors + + def query_commit_contributor_list(self, index, repo, from_date, to_date, page_size=100, search_after=[]): + query = { + "size": page_size, + "query": { + "bool": { + "must": [ + { + "match_phrase": { + "repo_name.keyword": repo + } + } + ], + "filter": [ + { + "range": { + "code_commit_date_list": { + "gte": from_date.strftime("%Y-%m-%d"), + "lte": to_date.strftime("%Y-%m-%d") + } + } + } + ] + } + }, + "sort": [ + { + "_id": { + "order": "asc" + } + } + ] + } + if len(search_after) > 0: + query['search_after'] = search_after + results = self.es_in.search(index=index, body=query)["hits"]["hits"] + return results + + def get_commit_contributor_list(self, date, repos_list): + result_list = [] + for repo in repos_list: + search_after = [] + while True: + contributor_list = self.query_commit_contributor_list(self.contributors_index, repo, date - timedelta(days=90), date, 500, search_after) + if len(contributor_list) == 0: + break + search_after = contributor_list[len(contributor_list) - 1]["sort"] + result_list = result_list +[contributor["_source"] for contributor in contributor_list] + return result_list + + def org_count(self, date, contributor_list): + org_name_set = set() + from_date = (date - timedelta(days=90)).strftime("%Y-%m-%d") + to_date = date.strftime("%Y-%m-%d") + + for contributor in contributor_list: + for org in contributor["org_change_date_list"]: + if org.get("org_name") is not None and check_times_has_overlap(org["first_date"], org["last_date"], from_date, to_date): + org_name_set.add(org.get("org_name")) + return len(org_name_set) + diff --git a/metrics_model/statModel.py b/metrics_model/statModel.py new file mode 100644 index 0000000..6e8f1b1 --- /dev/null +++ b/metrics_model/statModel.py @@ -0,0 +1,198 @@ + +import logging + +from functools import reduce +from urllib.parse import urlparse + +from perceval.backend import uuid + +from grimoire_elk.elastic import ElasticSearch +from grimoirelab_toolkit.datetime import datetime_utcnow + +from elasticsearch import Elasticsearch, RequestsHttpConnection + +from .utils import (get_uuid, get_date_list) + +MAX_BULK_UPDATE_SIZE = 5000 + +logger = logging.getLogger(__name__) + +class statModel: + """ + MetricsSummary mainly designed to summarize the global data of MetricsModel. + :param metric_index: summarization target index name + :param from_date: summarization start date + :param end_date: summarization end date + :param out_index: summarization storage index name + """ + def __init__(self, metric_index, model_name, from_date, end_date, out_index): + self.from_date = from_date + self.end_date = end_date + self.out_index = out_index + self.model_name = model_name + self.metric_index = metric_index + self.summary_name = self.__class__.__name__ + + def base_stat_method(self, field): + query = { + f"{field}_mean": { + 'avg': { + 'field': field + } + }, + f"{field}_percent": { + 'percentiles': { + 'field': field, + 'percents': [10, 30, 50] + } + }, + f"{field}_min": { + 'min': { + 'field': field + } + }, + f"{field}_max": { + 'max': { + 'field': field + } + }, + } + return query + + def apply_stat_method(self, fields): + return reduce(lambda query, field: {**self.base_stat_method(field), **query}, fields, {}) + + def metrics_model_summary_query(self, date=None): + query = { + "size": 0, + "from": 0, + "query": { + "bool": { + "filter": [ + { + "range": { + "grimoire_creation_date": { + "lte": date.strftime("%Y-%m-%d"), + "gte": date.strftime("%Y-%m-%d") + } + } + }, + { + "term": { + "model_name.keyword": self.model_name + } + } + ] + } + }, + "aggs": self.apply_stat_method(self.summary_fields()) + } + body = self.es_in.search(index=self.metric_index, body=query) + return body + + def metrics_model_enrich(self, result, field): + result['res'] = { + **result['res'], + **{ + f"{field}_mean": result['aggs'][f"{field}_mean"]['value'], + f"{field}_10percent": result['aggs'][f"{field}_percent"]['values']['10.0'], + f"{field}_30percent": result['aggs'][f"{field}_percent"]['values']['30.0'], + f"{field}_50percent": result['aggs'][f"{field}_percent"]['values']['50.0'], + f"{field}_max": result['aggs'][f"{field}_max"]['value'], + f"{field}_min": result['aggs'][f"{field}_min"]['value'], + } + } + return result + + def metrics_model_after_query(self, response): + aggregations = response.get('aggregations') + return reduce(self.metrics_model_enrich, self.summary_fields(), {'aggs': aggregations, 'res': {}}) + + def metrics_model_statistic(self, elastic_url): + is_https = urlparse(elastic_url).scheme == 'https' + self.es_in = Elasticsearch( + elastic_url, use_ssl=is_https, verify_certs=False, connection_class=RequestsHttpConnection) + self.es_out = ElasticSearch(elastic_url, self.out_index) + date_list = get_date_list(self.from_date, self.end_date) + + item_datas = [] + for date in date_list: + print(str(date) + "--" + self.summary_name) + response = self.metrics_model_summary_query(date) + summary_data = self.metrics_model_after_query(response)['res'] + summary_meta = { + 'uuid': get_uuid(str(date), self.summary_name), + 'model_name': self.summary_name, + 'grimoire_creation_date': date.isoformat(), + 'metadata__enriched_on': datetime_utcnow().isoformat() + } + summary_item = {**summary_meta, **summary_data} + item_datas.append(summary_item) + if len(item_datas) > MAX_BULK_UPDATE_SIZE: + self.es_out.bulk_upload(item_datas, "uuid") + item_datas = [] + self.es_out.bulk_upload(item_datas, "uuid") + +class CodeDevActivityStatistic(statModel): + def summary_fields(self): + return [ + 'LOC_frequency', + 'contributor_count', + 'pr_count', + 'commit_frequency', + 'updated_issues_count', + 'is_maintained', + ] + +class CodeDevQualityStatistic(statModel): + def summary_fields(self): + return [ + 'code_review_ratio', + 'code_merge_ratio', + 'git_pr_linked_ratio', + 'pr_issue_linked_ratio', + 'pr_first_response_time_avg', + 'pr_first_response_time_mid', + 'pr_open_time_avg', + 'pr_open_time_mid', + 'issue_first_reponse_avg', + 'issue_first_reponse_mid', + 'issue_open_time_avg', + 'issue_open_time_mid', + 'comment_frequency', + ] + +class CodeSecurityStatistic(statModel): + def summary_fields(self): + return [ + 'bug_issue_open_time_avg', + 'bug_issue_open_time_mid', + 'vulnerability_count', + 'defect_count', + 'code_smell', + 'code_clone_percent', + 'code_cyclomatic_complexity', + 'licenses_include_percent' + ] + +class CommunityActivityStatistic(statModel): + def summary_fields(self): + return [ + 'contributors_number', + 'updated_at', + 'created_at' + ] +class HumanDiversityStatistic(statModel): + def summary_fields(self): + return [ + 'location_distribution', + 'organization_count', + 'bus_factor', + 'elephant_factor' + ] +class TechDiversityStatistic(statModel): + def summary_fields(self): + return [ + 'language_distribution', + 'license_distribution', + ] \ No newline at end of file diff --git a/metrics_model/summaryModel.py b/metrics_model/summaryModel.py new file mode 100644 index 0000000..4a018da --- /dev/null +++ b/metrics_model/summaryModel.py @@ -0,0 +1,283 @@ +from .metrics_model import MetricsModel + +from .utils import (get_all_repo, + newest_message, + check_times_has_overlap, + add_release_message, + get_release_index_mapping, + create_release_index, + get_all_project, + get_time_diff_months, + get_medium, + get_uuid, + get_date_list, + get_codeDevActicity_score, + get_codeDevQuality_score, + get_codeSecurity_score, + get_communityActivity_score, + get_humanDiversity_score, + get_techDiversity_score, + get_summary_score, + codeDevQuality_decay + ) + +import logging +from datetime import datetime, timedelta +logger = logging.getLogger(__name__) +from grimoirelab_toolkit.datetime import (datetime_utcnow, + str_to_datetime) +from grimoire_elk.enriched.utils import get_time_diff_days +MAX_BULK_UPDATE_SIZE = 500 + +class SummaryModel(MetricsModel): + def __init__(self, issue_index=None, pr_index=None, repo_index=None, json_file=None, git_index=None, colic_index=None, git_aoc_index=None, out_index=None, risk_index=None, git_branch=None, from_date=None, end_date=None, community=None, level=None, company=None, pr_comments_index=None): + super().__init__(json_file, from_date, end_date, out_index, risk_index, community, level) + self.issue_index = issue_index + self.git_index = git_index + self.model_name = 'summary' + self.company = None if company == None or company == 'None' else company + + def get_score_query(self, model_name, date, repos_list): + query = { + "query": { + "bool": { + "must": [ + {"match_phrase": {"model_name": model_name}}, + {"match": {"grimoire_creation_date": date}}, + { + "bool": { + "should": [ + [{ + "match_phrase": { + "label": i + }}for i in repos_list] + ] + } + } + ] + } + }, + "sort": [ + { "metadata__enriched_on": "asc" } + ] + } + return query + + def code_develop_activity_score(self, date, repos_list): + query = self.get_score_query("Code develop activity", date.isoformat(), repos_list) + data = self.es_in.search(index=self.out_index, body=query)["hits"]["hits"][-1]["_source"] + code_develop_activity_score = data["code_develop_activity_score"] + is_maintained = data["is_maintained"] + return code_develop_activity_score, is_maintained + + def code_develop_quality_score(self, date, repos_list): + query = self.get_score_query("Code develop Quality", date.isoformat(), repos_list) + data = self.es_in.search(index=self.out_index, body=query)["hits"]["hits"][-1]["_source"] + code_develop_quality_score = data["code_develop_quality_score"] + pr_first_response_time_avg = data["pr_first_response_time_avg"] + pr_open_time_avg = data["pr_open_time_avg"] + issue_first_reponse_avg = data["issue_first_reponse_avg"] + issue_open_time_avg = data["issue_open_time_avg"] + return code_develop_quality_score, pr_first_response_time_avg, pr_open_time_avg, issue_first_reponse_avg, issue_open_time_avg + + def code_security_score(self, date, repos_list): + query = self.get_score_query("Code security", date.isoformat(), repos_list) + data = self.es_in.search(index=self.out_index, body=query)["hits"]["hits"][-1]["_source"] + code_security_score = data["code_security_score"] + bug_issue_open_time_avg = data["bug_issue_open_time_avg"] + vulnerability_count = data["vulnerability_count"] + defect_count = data["defect_count"] + code_smell = data["code_smell"] + code_clone_percent = data["code_clone_percent"] + code_cyclomatic_complexity = data["code_cyclomatic_complexity"] + licenses_include_percent = data["licenses_include_percent"] + return code_security_score, bug_issue_open_time_avg, vulnerability_count, defect_count, code_smell, code_clone_percent, code_cyclomatic_complexity, licenses_include_percent + + def community_activity_score(self, date, repos_list): + query = self.get_score_query("community activity", date.isoformat(), repos_list) + community_activity_score = self.es_in.search(index=self.out_index, body=query)["hits"]["hits"][-1]["_source"]["community_activity_score"] + return community_activity_score + + def human_diversity_score(self, date, repos_list): + query = self.get_score_query("human Diversity", date.isoformat(), repos_list) + data = self.es_in.search(index=self.out_index, body=query)["hits"]["hits"][-1]["_source"] + human_diversity_score = data["human_diversity_score"] + bus_factor = data["bus_factor"] + elephant_factor = data["elephant_factor"] + return human_diversity_score, bus_factor, elephant_factor + + def tech_diversity_score(self, date, repos_list): + query = self.get_score_query("technology Diversity", date.isoformat(), repos_list) + data = self.es_in.search(index=self.out_index, body=query)["hits"]["hits"][-1]["_source"] + tech_diversity_score = data["tech_diversity_score"] + license_distribution = data["license_distribution"] + return tech_diversity_score, license_distribution + + def get_stat_query(self, model_name, date, repos_list): + query = { + "query": { + "bool": { + "must": [ + {"match_phrase": {"model_name": model_name}}, + {"match": {"grimoire_creation_date": date}} + ] + } + }, + "sort": [ + { "metadata__enriched_on": "asc" } + ] + } + return query + + def CodeDevActivityStatistic(self, date, repos_list): + query = self.get_stat_query("CodeDevActivityStatistic", date.isoformat(), repos_list) + data = self.es_in.search(index=self.out_index, body=query)["hits"]["hits"][-1]["_source"] + is_maintained_10percent = data["is_maintained_10percent"] + is_maintained_30percent = data["is_maintained_30percent"] + is_maintained_50percent = data["is_maintained_50percent"] + return is_maintained_10percent, is_maintained_30percent, is_maintained_50percent + + def CodeDevQualityStatistic(self, date, repos_list): + query = self.get_stat_query("CodeDevQualityStatistic", date.isoformat(), repos_list) + data = self.es_in.search(index=self.out_index, body=query)["hits"]["hits"][-1]["_source"] + pr_first_response_time_avg_10percent = data["pr_first_response_time_avg_10percent"] + pr_first_response_time_avg_30percent = data["pr_first_response_time_avg_30percent"] + pr_first_response_time_avg_50percent = data["pr_first_response_time_avg_50percent"] + pr_open_time_avg_10percent = data["pr_open_time_avg_10percent"] + pr_open_time_avg_30percent = data["pr_open_time_avg_30percent"] + pr_open_time_avg_50percent = data["pr_open_time_avg_50percent"] + issue_first_reponse_avg_10percent = data["issue_first_reponse_avg_10percent"] + issue_first_reponse_avg_30percent = data["issue_first_reponse_avg_30percent"] + issue_first_reponse_avg_50percent = data["issue_first_reponse_avg_50percent"] + issue_open_time_avg_10percent = data["issue_open_time_avg_10percent"] + issue_open_time_avg_30percent = data["issue_open_time_avg_30percent"] + issue_open_time_avg_50percent = data["issue_open_time_avg_50percent"] + return pr_first_response_time_avg_10percent, pr_first_response_time_avg_30percent, pr_first_response_time_avg_50percent, pr_open_time_avg_10percent, pr_open_time_avg_30percent, pr_open_time_avg_50percent, issue_first_reponse_avg_10percent,issue_first_reponse_avg_30percent, issue_first_reponse_avg_50percent, issue_open_time_avg_10percent, issue_open_time_avg_30percent, issue_open_time_avg_50percent + + def CodeSecurityStatistic(self, date, repos_list): + query = self.get_stat_query("CodeSecurityStatistic", date.isoformat(), repos_list) + data = self.es_in.search(index=self.out_index, body=query)["hits"]["hits"][-1]["_source"] + bug_issue_open_time_avg_10percent = data["bug_issue_open_time_avg_10percent"] + bug_issue_open_time_avg_30percent = data["bug_issue_open_time_avg_30percent"] + bug_issue_open_time_avg_50percent = data["bug_issue_open_time_avg_50percent"] + vulnerability_count_10percent = data["vulnerability_count_10percent"] + vulnerability_count_30percent = data["vulnerability_count_30percent"] + vulnerability_count_50percent = data["vulnerability_count_50percent"] + defect_count_10percent = data["defect_count_10percent"] + defect_count_30percent = data["defect_count_30percent"] + defect_count_50percent = data["defect_count_50percent"] + code_smell_10percent = data["code_smell_10percent"] + code_smell_30percent = data["code_smell_30percent"] + code_smell_50percent = data["code_smell_50percent"] + code_clone_percent_10percent = data["code_clone_percent_10percent"] + code_clone_percent_30percent = data["code_clone_percent_30percent"] + code_clone_percent_50percent = data["code_clone_percent_50percent"] + code_cyclomatic_complexity_10percent = data["code_cyclomatic_complexity_10percent"] + code_cyclomatic_complexity_30percent = data["code_cyclomatic_complexity_30percent"] + code_cyclomatic_complexity_50percent = data["code_cyclomatic_complexity_50percent"] + licenses_include_percent_10percent = data["licenses_include_percent_10percent"] + licenses_include_percent_30percent = data["licenses_include_percent_30percent"] + licenses_include_percent_50percent = data["licenses_include_percent_50percent"] + return bug_issue_open_time_avg_10percent, bug_issue_open_time_avg_30percent, bug_issue_open_time_avg_50percent, vulnerability_count_10percent, vulnerability_count_30percent, vulnerability_count_50percent, defect_count_10percent, defect_count_30percent, defect_count_50percent, code_smell_10percent, code_smell_30percent, code_smell_50percent, code_clone_percent_10percent, code_clone_percent_30percent, code_clone_percent_50percent, code_cyclomatic_complexity_10percent, code_cyclomatic_complexity_30percent, code_cyclomatic_complexity_50percent, licenses_include_percent_10percent, licenses_include_percent_30percent, licenses_include_percent_50percent + + def HumanDiversityStatistic(self, date, repos_list): + query = self.get_stat_query("HumanDiversityStatistic", date.isoformat(), repos_list) + data = self.es_in.search(index=self.out_index, body=query)["hits"]["hits"][-1]["_source"] + bus_factor_10percent = data["bus_factor_10percent"] + bus_factor_30percent = data["bus_factor_30percent"] + bus_factor_50percent = data["bus_factor_50percent"] + elephant_factor_10percent = data["elephant_factor_10percent"] + elephant_factor_30percent = data["elephant_factor_30percent"] + elephant_factor_50percent = data["elephant_factor_50percent"] + return bus_factor_10percent, bus_factor_30percent, bus_factor_50percent, elephant_factor_10percent, elephant_factor_30percent, elephant_factor_50percent + + def TechDiversityStatistic(self, date, repos_list): + query = self.get_stat_query("TechDiversityStatistic", date.isoformat(), repos_list) + data = self.es_in.search(index=self.out_index, body=query)["hits"]["hits"][-1]["_source"] + license_distribution_10percent = data["license_distribution_10percent"] + license_distribution_30percent = data["license_distribution_30percent"] + license_distribution_50percent = data["license_distribution_50percent"] + return license_distribution_10percent, license_distribution_30percent, license_distribution_50percent + + def get_risk_level(slef, data, data_10percent, data_30percent, data_50percent): + if data is None or data_10percent is None or data_30percent is None or data_50percent is None: + return "良好" + if data < data_10percent: + return "严重预警" + elif data < data_30percent: + return "中度预警" + elif data < data_50percent: + return "轻度预警" + else: + return "良好" + + def metrics_model_enrich(self, repos_list, label, type=None, level=None, date_list=None): + print("here") + level = level if level is not None else self.level + date_list = date_list if date_list is not None else self.date_list + item_datas = [] + last_metrics_data = {} + self.commit_message_dict = {} + for date in date_list: + print(str(date)+"--"+self.model_name+"--"+label) + created_since = self.created_since(date, repos_list) + if created_since is None: + continue + code_develop_activity_score, is_maintained = self.code_develop_activity_score(date, repos_list) + code_develop_quality_score, pr_first_response_time_avg, pr_open_time_avg, issue_first_reponse_avg, issue_open_time_avg = self.code_develop_quality_score(date, repos_list) + code_security_score, bug_issue_open_time_avg, vulnerability_count, defect_count, code_smell, code_clone_percent, code_cyclomatic_complexity, licenses_include_percent = self.code_security_score(date, repos_list) + community_activity_score = self.community_activity_score(date, repos_list) + human_diversity_score, bus_factor, elephant_factor = self.human_diversity_score(date, repos_list) + tech_diversity_score, license_distribution = self.tech_diversity_score(date, repos_list) + is_maintained_10percent, is_maintained_30percent, is_maintained_50percent = self.CodeDevActivityStatistic(date, repos_list) + pr_first_response_time_avg_10percent, pr_first_response_time_avg_30percent, pr_first_response_time_avg_50percent, pr_open_time_avg_10percent, pr_open_time_avg_30percent, pr_open_time_avg_50percent, issue_first_reponse_avg_10percent,issue_first_reponse_avg_30percent, issue_first_reponse_avg_50percent, issue_open_time_avg_10percent, issue_open_time_avg_30percent, issue_open_time_avg_50percent = self.CodeDevQualityStatistic(date, repos_list) + bug_issue_open_time_avg_10percent, bug_issue_open_time_avg_30percent, bug_issue_open_time_avg_50percent, vulnerability_count_10percent, vulnerability_count_30percent, vulnerability_count_50percent, defect_count_10percent, defect_count_30percent, defect_count_50percent, code_smell_10percent, code_smell_30percent, code_smell_50percent, code_clone_percent_10percent, code_clone_percent_30percent, code_clone_percent_50percent, code_cyclomatic_complexity_10percent, code_cyclomatic_complexity_30percent, code_cyclomatic_complexity_50percent, licenses_include_percent_10percent, licenses_include_percent_30percent, licenses_include_percent_50percent = self.CodeSecurityStatistic(date, repos_list) + bus_factor_10percent, bus_factor_30percent, bus_factor_50percent, elephant_factor_10percent, elephant_factor_30percent, elephant_factor_50percent = self.HumanDiversityStatistic(date, repos_list) + license_distribution_10percent, license_distribution_30percent, license_distribution_50percent = self.TechDiversityStatistic(date, repos_list) + metrics_data = { + 'uuid': get_uuid(str(date), self.community, level, label, self.model_name, type), + 'level': level, + 'type': type, + 'label': label, + 'model_name': self.model_name, + 'copy_code_develop_activity_score': code_develop_activity_score, + 'copy_code_develop_quality_score': code_develop_quality_score, + 'copy_code_security_score': code_security_score, + 'copy_community_activity_score': community_activity_score, + 'copy_human_diversity_score': human_diversity_score, + 'copy_tech_diversity_score' : tech_diversity_score, + 'grimoire_creation_date': date.isoformat(), + 'metadata__enriched_on': datetime_utcnow().isoformat() + } + score = get_summary_score(metrics_data, level) + + metrics_data["summary_score"] = score + + metrics_data["is_maintained_risk"] = self.get_risk_level(is_maintained, is_maintained_10percent, is_maintained_30percent,is_maintained_50percent) + metrics_data["pr_first_response_time_avg_risk"] = self.get_risk_level(pr_first_response_time_avg, pr_first_response_time_avg_10percent, pr_first_response_time_avg_30percent,pr_first_response_time_avg_50percent) + metrics_data["pr_open_time_avg_risk"] = self.get_risk_level(pr_open_time_avg, pr_open_time_avg_10percent, pr_open_time_avg_30percent,pr_open_time_avg_50percent) + metrics_data["issue_first_reponse_avg_risk"] = self.get_risk_level(issue_first_reponse_avg, issue_first_reponse_avg_10percent, issue_first_reponse_avg_30percent, issue_first_reponse_avg_50percent) + metrics_data["issue_open_time_avg_risk"] = self.get_risk_level(issue_open_time_avg, issue_open_time_avg_10percent, issue_open_time_avg_30percent, issue_open_time_avg_50percent) + # bug_issue_open_time_avg, vulnerability_count, defect_count, code_smell, code_clone_percent, code_cyclomatic_complexity, licenses_include_percent + metrics_data["bug_issue_open_time_avg_risk"] = self.get_risk_level(bug_issue_open_time_avg, bug_issue_open_time_avg_10percent, bug_issue_open_time_avg_30percent, bug_issue_open_time_avg_50percent) + metrics_data["vulnerability_count_risk"] = self.get_risk_level(vulnerability_count, vulnerability_count_10percent, vulnerability_count_30percent, vulnerability_count_50percent) + metrics_data["defect_count_risk"] = self.get_risk_level(defect_count, defect_count_10percent, defect_count_30percent, defect_count_50percent) + metrics_data["code_smell_risk"] = self.get_risk_level(code_smell, code_smell_10percent, code_smell_30percent, code_smell_50percent) + metrics_data["code_clone_percent_risk"] = self.get_risk_level(code_clone_percent, code_clone_percent_10percent, code_clone_percent_30percent, code_clone_percent_50percent) + metrics_data["code_cyclomatic_complexity_risk"] = self.get_risk_level(code_cyclomatic_complexity, code_cyclomatic_complexity_10percent, code_cyclomatic_complexity_30percent, code_cyclomatic_complexity_50percent) + metrics_data["licenses_include_percent_risk"] = self.get_risk_level(licenses_include_percent, licenses_include_percent_10percent, licenses_include_percent_30percent, licenses_include_percent_50percent) + # bus_factor, elephant_factor + metrics_data["bus_factor_risk"] = self.get_risk_level(bus_factor, bus_factor_10percent, bus_factor_30percent, bus_factor_50percent) + metrics_data["elephant_factor_risk"] = self.get_risk_level(elephant_factor, elephant_factor_10percent, elephant_factor_30percent, elephant_factor_50percent) + # license_distribution + metrics_data["license_distribution_risk"] = self.get_risk_level(license_distribution, license_distribution_10percent, license_distribution_30percent, license_distribution_50percent) + + item_datas.append(metrics_data) + # print(metrics_data) + if len(item_datas) > MAX_BULK_UPDATE_SIZE: + self.es_out.bulk_upload(item_datas, "uuid") + self.risk_out.bulk_upload(item_datas, "uuid") + item_datas = [] + self.es_out.bulk_upload(item_datas, "uuid") + self.risk_out.bulk_upload(item_datas, "uuid") + diff --git a/metrics_model/techDiversityModel.py b/metrics_model/techDiversityModel.py new file mode 100644 index 0000000..6e2ec4b --- /dev/null +++ b/metrics_model/techDiversityModel.py @@ -0,0 +1,124 @@ +from .metrics_model import MetricsModel + +from .utils import (get_all_repo, + newest_message, + check_times_has_overlap, + add_release_message, + get_release_index_mapping, + create_release_index, + get_all_project, + get_time_diff_months, + get_medium, + get_uuid, + get_date_list, + get_codeDevActicity_score, + get_codeDevQuality_score, + get_codeSecurity_score, + get_communityActivity_score, + get_humanDiversity_score, + get_techDiversity_score, + codeDevQuality_decay + ) + +import logging +from datetime import datetime, timedelta +logger = logging.getLogger(__name__) +from grimoirelab_toolkit.datetime import (datetime_utcnow, + str_to_datetime) +from grimoire_elk.enriched.utils import get_time_diff_days +MAX_BULK_UPDATE_SIZE = 500 + +class TechDiversityModel(MetricsModel): + def __init__(self, issue_index=None, pr_index=None, repo_index=None, json_file=None, git_index=None, colic_index=None, git_aoc_index=None, out_index=None, git_branch=None, from_date=None, end_date=None, community=None, level=None, company=None, pr_comments_index=None): + super().__init__(json_file, from_date, end_date, out_index, community, level) + self.git_index = git_index + self.issue_index = issue_index + self.repo_index = repo_index + self.git_branch = git_branch + self.pr_index = pr_index + self.pr_comments_index = pr_comments_index + self.git_aoc_index = git_aoc_index + self.colic_index = colic_index + self.model_name = 'technology Diversity' + self.company = None if company == None or company == 'None' else company + + def get_org_count_query(self, repos_list, field, from_date=str_to_datetime("1970-01-01"), to_date=datetime_utcnow()): + query = { + "size": 0, + "aggs": { + "count_of_orgs": { + "cardinality": { + "field": field + } + } + }, + "query": + {"bool": { + "must": [ + {"bool": + {"should": + [{"simple_query_string": + {"query": i + "*", + "fields": + ["origin"]}}for i in repos_list], + "minimum_should_match": 1, + "filter": + {"range": + + {"grimoire_creation_date": + {"gte": from_date.strftime("%Y-%m-%d"), "lt": to_date.strftime("%Y-%m-%d")}}} + } + }]}}, + } + return query + + def language_distribution(self, date, repos_list): + query = self.get_org_count_query(repos_list, "file_ext", from_date=(date - timedelta(days=90)), to_date=date) + # print("query", query) + language_count = self.es_in.search(index=self.git_aoc_index, body=query)[ + 'aggregations']["count_of_orgs"]['value'] + return language_count + + def license_distribution(self, date, repos_list): + query = self.get_org_count_query(repos_list, "license_name", from_date=(date - timedelta(days=90)), to_date=date) + # print("query", query) + language_count = self.es_in.search(index=self.colic_index, body=query)[ + 'aggregations']["count_of_orgs"]['value'] + return language_count + + + def metrics_model_enrich(self, repos_list, label, type=None, level=None, date_list=None): + level = level if level is not None else self.level + date_list = date_list if date_list is not None else self.date_list + item_datas = [] + last_metrics_data = {} + self.commit_message_dict = {} + for date in date_list: + print(str(date)+"--"+self.model_name+"--"+label) + created_since = self.created_since(date, repos_list) + if created_since is None: + continue + language_distribution = self.language_distribution(date, repos_list) + # print("language_distribution",language_distribution) + license_distribution = self.license_distribution(date, repos_list) + # print("license_distribution", license_distribution) + metrics_data = { + 'uuid': get_uuid(str(date), self.community, level, label, self.model_name, type), + 'level': level, + 'type': type, + 'label': label, + 'model_name': self.model_name, + 'language_distribution': language_distribution, + 'license_distribution': license_distribution, + 'grimoire_creation_date': date.isoformat(), + 'metadata__enriched_on': datetime_utcnow().isoformat() + } + score = get_techDiversity_score(metrics_data, level) + metrics_data["tech_diversity_score"] = score + print("tech_diversity_score", score) + item_datas.append(metrics_data) + if len(item_datas) > MAX_BULK_UPDATE_SIZE: + self.es_out.bulk_upload(item_datas, "uuid") + item_datas = [] + self.es_out.bulk_upload(item_datas, "uuid") + diff --git a/metrics_model/utils.py b/metrics_model/utils.py new file mode 100644 index 0000000..8d4a2d2 --- /dev/null +++ b/metrics_model/utils.py @@ -0,0 +1,620 @@ +import math +import pendulum +import pandas as pd + +from perceval.backend import uuid +from datetime import datetime, timedelta +from urllib.parse import urlparse +import json +import yaml +import logging +from grimoire_elk.enriched.utils import get_time_diff_days +from grimoirelab_toolkit.datetime import (datetime_utcnow, + datetime_to_utc, + str_to_datetime) +from elasticsearch import Elasticsearch, RequestsHttpConnection +from elasticsearch import helpers +from elasticsearch.exceptions import NotFoundError +from grimoire_elk.elastic import ElasticSearch + + +BACKOFF_FACTOR = 0.2 +MAX_RETRIES = 21 +MAX_RETRIES_ON_REDIRECT = 5 +MAX_RETRIES_ON_READ = 8 +MAX_RETRIES_ON_CONNECT = 21 +STATUS_FORCE_LIST = [408, 409, 429, 502, 503, 504] +METADATA_FILTER_RAW = 'metadata__filter_raw' +REPO_LABELS = 'repository_labels' + +######################### 代码开发活动 ############################################# +LOC_FREQUENCY_WEIGHT = 0.0729 +CONTRIBUTOR_COUNT_WEIGHT = 0.2517 +PR_COUNT_WEIGHT = 0.1582 +COMMIT_FREQUENCY_WEIGHT = 0.2033 +UPDATED_ISSUES_WEIGHT = 0.1426 +IS_MAINTAINED_WEIGHT = 0.1714 + +LOC_FREQUENCY_THRESHOLD = 300000 +CONTRIBUTOR_COUNT_THRESHOLD = 1000 +PR_COUNT_THRESHOLD = 10000 +COMMIT_FREQUENCY_THRESHOLD = 1000 +UPDATED_ISSUES_THRESHOLD = 2500 +IS_MAINTAINED_THRESHOLD = 1 + +LOC_FREQUENCY_MULTIPLE_THRESHOLD = 300000 +CONTRIBUTOR_COUNT_MULTIPLE_THRESHOLD = 1000 +PR_COUNT_MULTIPLE_THRESHOLD = 10000 +COMMIT_FREQUENCY_MULTIPLE_THRESHOLD = 1000 +UPDATED_ISSUES_MULTIPLE_THRESHOLD = 2500 +IS_MAINTAINED_MULTIPLE_THRESHOLD = 1 + +######################### 代码开发效率 ############################################# +CODE_REVIEW_RATIO_WEIGHT = 0.1028 +CODE_MERGE_RATIO_WEIGHT = 0.1028 +COMMIT_PR_LINKED_RATIO_WEIGHT = 0.1561 +PR_ISSUE_LINKED_WEIGHT = 0.1164 +PR_FIRST_RESPONSE_WEIGHT = -0.1164 +PR_OPEN_TIME_WEIGHT = -0.1028 +ISSUE_FIRST_RESPONSE_WEIGHT = -0.1164 +ISSUE_OPEN_TIME_WEIGHT = -0.1028 +COMMENT_FREQUENCY_WEIGHT = 0.0836 + +CODE_REVIEW_RATIO_THRESHOLD = 1 +CODE_MERGE_RATIO_THRESHOLD = 1 +COMMIT_PR_LINKED_RATIO_THRESHOLD = 1 +PR_ISSUE_LINKED_THRESHOLD = 1 +PR_FIRST_RESPONSE_THRESHOLD = 15 +PR_OPEN_TIME_THRESHOLD = 30 +ISSUE_FIRST_RESPONSE_THRESHOLD = 15 +ISSUE_OPEN_TIME_THRESHOLD = 30 +COMMENT_FREQUENCY_THRESHOLD = 10 + +CODE_REVIEW_RATIO_MULTIPLE_THRESHOLD = 1 +CODE_MERGE_RATIO_MULTIPLE_THRESHOLD = 1 +COMMIT_PR_LINKED_RATIO_MULTIPLE_THRESHOLD = 1 +PR_ISSUE_LINKED_MULTIPLE_THRESHOLD = 1 +PR_FIRST_RESPONSE_MULTIPLE_THRESHOLD = 15 +PR_OPEN_TIME_MULTIPLE_THRESHOLD = 30 +ISSUE_FIRST_RESPONSE_MULTIPLE_THRESHOLD = 15 +ISSUE_OPEN_TIME_MULTIPLE_THRESHOLD = 30 +COMMENT_FREQUENCY_MULTIPLE_THRESHOLD = 10 + +######################### 代码安全保障############################################# +BUG_ISSUE_OPEN_TIME_WEIGHT = -0.2469 +VULNERABILITY_COUNT_WEIGHT = -0.2469 +DEFECT_COUNT_WEIGHT = -0.1396 +CODE_SMELL_WEIGHT = -0.0756 +CODE_CLONE_PERCENT_WEIGHT = -0.0756 +CODE_CYCLOMATIC_COMPLEXITY_WEIGHT = -0.0756 +LICENSSE_INCLUDE_PERCENT_WEIGHT = 0.1396 + +BUG_ISSUE_OPEN_TIME_THRESHOLD = 60 +VULNERABILITY_COUNT_THRESHOLD = 60 +DEFECT_COUNT_THRESHOLD = 60 +CODE_SMELL_THRESHOLD = 60 +CODE_CLONE_PERCENT_THRESHOLD = 60 +CODE_CYCLOMATIC_COMPLEXITY_THRESHOLD = 60 +LICENSSE_INCLUDE_PERCENT_THRESHOLD = 1 + +BUG_ISSUE_OPEN_TIME_MULTIPLE_THRESHOLD = 60 +VULNERABILITY_COUNT_MULTIPLE_THRESHOLD = 60 +DEFECT_COUNT_MULTIPLE_THRESHOLD = 60 +CODE_SMELL_MULTIPLE_THRESHOLD = 60 +CODE_CLONE_PERCENT_MULTIPLE_THRESHOLD = 60 +CODE_CYCLOMATIC_COMPLEXITY_MULTIPLE_THRESHOLD = 60 +LICENSSE_INCLUDE_PERCENT_MULTIPLE_THRESHOLD = 1 + +######################### 社区活跃度 ############################################# +CONTRIBUTORS_NUMBER_WEIGHT = 0.5397 +UPDATED_AT_WEIGHT = -0.2970 +CREATED_AT_WEIGHT = 0.1634 + +CONTRIBUTORS_NUMBER_THRESHOLD = 2000 +UPDATED_AT_THRESHOLD = 60 +CREATED_AT_THRESHOLD = 1000 + +CONTRIBUTORS_NUMBER_MULTIPLE_THRESHOLD = 2000 +UPDATED_AT_MULTIPLE_THRESHOLD = 60 +CREATED_AT_MULTIPLE_THRESHOLD = 1000 + +######################### 人员多样性 ############################################# +LOCATION_DISTRIBUTION_WEIGHT = 0.1223 +ORGANIZATION_COUNT_WEIGHT = 0.2271 +BUS_FACTOR_WEIGHT = 0.4236 +ELEPHANT_FACTOR_WEIGHT = 0.2271 + +LOCATION_DISTRIBUTION_THRESHOLD = 24 +ORGANIZATION_COUNT_THRESHOLD = 50 +BUS_FACTOR_THRESHOLD = 50 +ELEPHANT_FACTOR_THRESHOLD = 50 + +LOCATION_DISTRIBUTION_MULTIPLE_THRESHOLD = 24 +ORGANIZATION_COUNT_MULTIPLE_THRESHOLD = 50 +BUS_FACTOR_MULTIPLE_THRESHOLD = 50 +ELEPHANT_FACTOR_MULTIPLE_THRESHOLD = 50 +######################### 技术多样性 ############################################# +LANGUAGE_DISTRIBUTION_WEIGHT = 0.5000 +LICENSE_DISTRIBUTION_WEIGHT = 0.5000 + +LANGUAGE_DISTRIBUTION_THRESHOLD = 50 +LICENSE_DISTRIBUTION_THRESHOLD = 20 + +LANGUAGE_DISTRIBUTION_MULTIPLE_THRESHOLD = 100 +LICENSE_DISTRIBUTION_MULTIPLE_THRESHOLD = 20 + +######################### 总结 ############################################# +CODE_DEVELOP_ACTIVITY_SCORE_WEIGHT = 0.1813 +CODE_DEVELOP_QUALITY_SCORE_WEIGHT = 0.1813 +CODE_SECURITY_SCORE_WEIGHT = 0.3209 +COMMUNITY_ACTIVITY_SCORE_WEIGHT = 0.0933 +HUMAN_DIVERSITY_SCORE_WEIGHT = 0.1297 +TECH_DIVERSITY_SCORE_WEIGHT = 0.0933 + +CODE_DEVELOP_ACTIVITY_SCORE_THRESHOLD = 100 +CODE_DEVELOP_QUALITY_SCORE_THRESHOLD = 100 +CODE_SECURITY_SCORE_THRESHOLD = 100 +COMMUNITY_ACTIVITY_SCORE_THRESHOLD = 100 +HUMAN_DIVERSITY_SCORE_THRESHOLD = 100 +TECH_DIVERSITY_SCORE_THRESHOLD = 100 + +################################################### +CODE_DEVELOP_ACTIVITY_SCORE_MIN = 0 +CODE_DEVELOP_QUALITY_SCORE_MIN = -3.5556 +CODE_SECURITY_SCORE_MIN = -0.0060 +COMMUNITY_ACTIVITY_SCORE_MIN = -0.4061 +HUMAN_DIVERSITY_SCORE_MIN = 0 +TECH_DIVERSITY_SCORE_MIN = 0 +SUMMARY_SCORE_MIN = 0.0444 + +CODE_DEVELOP_ACTIVITY_SCORE_MAX = 0.9712 +CODE_DEVELOP_QUALITY_SCORE_MAX = 1.5810 +CODE_SECURITY_SCORE_MAX = 0.7757 +COMMUNITY_ACTIVITY_SCORE_MAX = 1.5217 +HUMAN_DIVERSITY_SCORE_MAX = 0.6629 +TECH_DIVERSITY_SCORE_MAX = 1.0 +SUMMARY_SCORE_MAX = 0.2921 + + +DECAY_COEFFICIENT = 0.0027 + + +def get_all_repo(file, source): + '''Get all repo from json file''' + all_repo_json = json.load(open(file)) + all_repo = [] + origin = 'gitee' if 'gitee' in source else 'github' + for i in all_repo_json: + for j in all_repo_json[i][origin]: + all_repo.append(j) + return all_repo + +def newest_message(repo_url): + query = { + "query": { + "match": { + "tag": repo_url + } + }, + "sort": [ + { + "metadata__updated_on": {"order": "desc"} + } + ] + } + return query + +def check_times_has_overlap(dyna_start_time, dyna_end_time, fixed_start_time, fixed_end_time): + return not (dyna_end_time < fixed_start_time or dyna_start_time > fixed_end_time) + +def add_release_message(es_client, out_index, repo_url, releases,): + item_datas = [] + for item in releases: + release_data = { + "_index": out_index, + "_id": uuid(str(item["id"])), + "_source": { + "uuid": uuid(str(item["id"])), + "id": item["id"], + "tag": repo_url, + "tag_name": item["tag_name"], + "target_commitish": item["target_commitish"], + "prerelease": item["prerelease"], + "name": item["name"], + "author_login": item["author"]["login"], + "author_name": item["author"]["name"], + "grimoire_creation_date": item["created_at"], + 'metadata__enriched_on': datetime_utcnow().isoformat() + } + } + item_datas.append(release_data) + if len(item_datas) > MAX_BULK_UPDATE_SIZE: + helpers.bulk(client=es_client, actions=item_datas) + item_datas = [] + helpers.bulk(client=es_client, actions=item_datas) + + +def get_release_index_mapping(): + mapping = { + "mappings" : { + "properties" : { + "author_login" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "author_name" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "body" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "grimoire_creation_date" : { + "type" : "date" + }, + "id" : { + "type" : "long" + }, + "name" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "prerelease" : { + "type" : "boolean" + }, + "tag" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "tag_name" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "target_commitish" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + }, + "uuid" : { + "type" : "text", + "fields" : { + "keyword" : { + "type" : "keyword", + "ignore_above" : 256 + } + } + } + } + } + } + return mapping + + +def create_release_index(es_client, all_repo, repo_index, release_index): + es_exist = es_client.indices.exists(index=release_index) + if not es_exist: + res = es_client.indices.create(index=release_index, body=get_release_index_mapping()) + for repo_url in all_repo: + query = newest_message(repo_url) + query_hits = es_client.search(index=repo_index, body=query)["hits"]["hits"] + if len(query_hits) > 0 and query_hits[0]["_source"].get("releases"): + items = query_hits[0]["_source"]["releases"] + add_release_message(es_client, release_index, repo_url, items) + +def get_all_project(file): + '''Get all projects from json file''' + file_json = json.load(open(file)) + all_project = [] + for i in file_json: + all_project.append(i) + return all_project + + +def get_time_diff_months(start, end): + ''' Number of months between two dates in UTC format ''' + + if start is None or end is None: + return None + + if type(start) is not datetime: + start = str_to_datetime(start).replace(tzinfo=None) + if type(end) is not datetime: + end = str_to_datetime(end).replace(tzinfo=None) + + seconds_month = float(60 * 60 * 24 * 30) + diff_months = (end - start).total_seconds() / seconds_month + diff_months = float('%.2f' % diff_months) + + return diff_months + + +def get_medium(L): + L.sort() + n = len(L) + m = int(n/2) + if n == 0: + return None + elif n % 2 == 0: + return (L[m]+L[m-1])/2.0 + else: + return L[m] + + +def get_uuid(*args): + args_list = [] + for arg in args: + if arg is None or arg == '': + continue + args_list.append(arg) + return uuid(*args_list) + +def get_date_list(begin_date, end_date, freq='W-MON'): + '''Get date list from begin_date to end_date every Monday''' + date_list = [x for x in list(pd.date_range(freq=freq, start=datetime_to_utc( + str_to_datetime(begin_date)), end=datetime_to_utc(str_to_datetime(end_date))))] + return date_list + +def normalize(score, min_score, max_score): + return (score-min_score)/(max_score-min_score) + +def get_param_score(param, max_value, weight=1): + """Return paramater score given its current value, max value and + parameter weight.""" + if param <= 0: + return (math.log(1 - param) / math.log(1 + max(-param, max_value))) * -weight + else: + return (math.log(1 + param) / math.log(1 + max(param, max_value))) * weight + +def get_score_ahp(item, param_dict): + total_weight = 0 + total_param_score = 0 + for key, value in param_dict.items(): + total_weight += value[0] + param = 0 + if item[key] is None: + if value[0] < 0: + param = value[1] + else: + param = item[key] + result = get_param_score(param,value[1] ,value[0]) + total_param_score += result + try: + return round(total_param_score / total_weight, 5) + except ZeroDivisionError: + return 0.0 + +def get_codeDevActicity_score(item, level="repo"): + param_dict = {} + if level == "community" or level == "project": + param_dict = { + "LOC_frequency": [LOC_FREQUENCY_WEIGHT, LOC_FREQUENCY_MULTIPLE_THRESHOLD], + "contributor_count": [CONTRIBUTOR_COUNT_WEIGHT, CONTRIBUTOR_COUNT_MULTIPLE_THRESHOLD], + "pr_count": [PR_COUNT_WEIGHT, PR_COUNT_MULTIPLE_THRESHOLD], + "commit_frequency": [COMMIT_FREQUENCY_WEIGHT, COMMIT_FREQUENCY_MULTIPLE_THRESHOLD], + "updated_issues_count": [UPDATED_ISSUES_WEIGHT, UPDATED_ISSUES_MULTIPLE_THRESHOLD], + "is_maintained": [IS_MAINTAINED_WEIGHT, IS_MAINTAINED_MULTIPLE_THRESHOLD], + } + if level == "repo": + param_dict = { + "LOC_frequency":[LOC_FREQUENCY_WEIGHT, LOC_FREQUENCY_THRESHOLD], + "contributor_count":[CONTRIBUTOR_COUNT_WEIGHT, CONTRIBUTOR_COUNT_THRESHOLD], + "pr_count": [PR_COUNT_WEIGHT, PR_COUNT_THRESHOLD], + "commit_frequency": [COMMIT_FREQUENCY_WEIGHT, COMMIT_FREQUENCY_THRESHOLD], + "updated_issues_count": [UPDATED_ISSUES_WEIGHT, UPDATED_ISSUES_THRESHOLD], + "is_maintained": [IS_MAINTAINED_WEIGHT, IS_MAINTAINED_THRESHOLD], + } + return normalize(get_score_ahp(item, param_dict), CODE_DEVELOP_ACTIVITY_SCORE_MIN, CODE_DEVELOP_ACTIVITY_SCORE_MAX) + +def get_codeDevQuality_score(item, level='repo'): + param_dict = {} + if level == "community" or level == "project": + param_dict = { + "code_review_ratio": [CODE_REVIEW_RATIO_WEIGHT, CODE_REVIEW_RATIO_MULTIPLE_THRESHOLD], + "code_merge_ratio": [CODE_MERGE_RATIO_WEIGHT, CODE_MERGE_RATIO_MULTIPLE_THRESHOLD], + "git_pr_linked_ratio": [COMMIT_PR_LINKED_RATIO_WEIGHT, COMMIT_PR_LINKED_RATIO_MULTIPLE_THRESHOLD], + "pr_issue_linked_ratio": [PR_ISSUE_LINKED_WEIGHT, PR_ISSUE_LINKED_MULTIPLE_THRESHOLD], + "pr_first_response_time_avg":[PR_FIRST_RESPONSE_WEIGHT*0.5, PR_FIRST_RESPONSE_MULTIPLE_THRESHOLD], + "pr_first_response_time_mid":[PR_FIRST_RESPONSE_WEIGHT*0.5, PR_FIRST_RESPONSE_MULTIPLE_THRESHOLD], + "pr_open_time_avg": [PR_OPEN_TIME_WEIGHT * 0.5, PR_OPEN_TIME_MULTIPLE_THRESHOLD], + "pr_open_time_mid": [PR_OPEN_TIME_WEIGHT * 0.5, PR_OPEN_TIME_MULTIPLE_THRESHOLD], + "issue_first_reponse_avg": [ISSUE_FIRST_RESPONSE_WEIGHT * 0.5, ISSUE_FIRST_RESPONSE_MULTIPLE_THRESHOLD], + "issue_first_reponse_mid": [ISSUE_FIRST_RESPONSE_WEIGHT * 0.5, ISSUE_FIRST_RESPONSE_MULTIPLE_THRESHOLD], + "issue_open_time_avg": [ISSUE_OPEN_TIME_WEIGHT * 0.5, ISSUE_OPEN_TIME_MULTIPLE_THRESHOLD], + "issue_open_time_mid": [ISSUE_OPEN_TIME_WEIGHT * 0.5, ISSUE_OPEN_TIME_MULTIPLE_THRESHOLD], + "comment_frequency": [COMMENT_FREQUENCY_WEIGHT, COMMENT_FREQUENCY_MULTIPLE_THRESHOLD], + } + if level == "repo": + param_dict = { + "code_review_ratio":[CODE_REVIEW_RATIO_WEIGHT, CODE_REVIEW_RATIO_THRESHOLD], + "code_merge_ratio":[CODE_MERGE_RATIO_WEIGHT, CODE_MERGE_RATIO_THRESHOLD], + "git_pr_linked_ratio":[COMMIT_PR_LINKED_RATIO_WEIGHT, COMMIT_PR_LINKED_RATIO_THRESHOLD], + "pr_issue_linked_ratio":[PR_ISSUE_LINKED_WEIGHT, PR_ISSUE_LINKED_THRESHOLD], + "pr_first_response_time_avg":[PR_FIRST_RESPONSE_WEIGHT*0.5, PR_FIRST_RESPONSE_THRESHOLD], + "pr_first_response_time_avg":[PR_FIRST_RESPONSE_WEIGHT*0.5, PR_FIRST_RESPONSE_THRESHOLD], + "pr_open_time_avg":[PR_OPEN_TIME_WEIGHT*0.5, PR_OPEN_TIME_THRESHOLD], + "pr_open_time_mid":[PR_OPEN_TIME_WEIGHT*0.5, PR_OPEN_TIME_THRESHOLD], + "issue_first_reponse_avg":[ISSUE_FIRST_RESPONSE_WEIGHT*0.5, ISSUE_FIRST_RESPONSE_THRESHOLD], + "issue_first_reponse_mid":[ISSUE_FIRST_RESPONSE_WEIGHT*0.5, ISSUE_FIRST_RESPONSE_THRESHOLD], + "issue_open_time_avg":[ISSUE_OPEN_TIME_WEIGHT*0.5, ISSUE_OPEN_TIME_THRESHOLD], + "issue_open_time_mid":[ISSUE_OPEN_TIME_WEIGHT*0.5, ISSUE_OPEN_TIME_THRESHOLD], + "comment_frequency":[COMMENT_FREQUENCY_WEIGHT, COMMENT_FREQUENCY_THRESHOLD], + } + return normalize(get_score_ahp(item, param_dict), CODE_DEVELOP_QUALITY_SCORE_MIN, CODE_DEVELOP_QUALITY_SCORE_MAX) + +def get_codeSecurity_score(item, level='repo'): + param_dict = {} + if level == "community" or level == "project": + param_dict = { + "bug_issue_open_time_avg": [BUG_ISSUE_OPEN_TIME_WEIGHT * 0.5, BUG_ISSUE_OPEN_TIME_MULTIPLE_THRESHOLD], + "bug_issue_open_time_mid": [BUG_ISSUE_OPEN_TIME_WEIGHT * 0.5, BUG_ISSUE_OPEN_TIME_MULTIPLE_THRESHOLD], + "vulnerability_count": [VULNERABILITY_COUNT_WEIGHT, VULNERABILITY_COUNT_MULTIPLE_THRESHOLD], + "defect_count": [DEFECT_COUNT_WEIGHT, DEFECT_COUNT_MULTIPLE_THRESHOLD], + "code_smell": [CODE_SMELL_WEIGHT, CODE_CLONE_PERCENT_MULTIPLE_THRESHOLD], + "code_clone_percent": [CODE_CLONE_PERCENT_WEIGHT, CODE_CLONE_PERCENT_MULTIPLE_THRESHOLD], + "code_cyclomatic_complexity": [CODE_CYCLOMATIC_COMPLEXITY_WEIGHT, CODE_CLONE_PERCENT_MULTIPLE_THRESHOLD], + "licenses_include_percent": [LICENSSE_INCLUDE_PERCENT_WEIGHT, LICENSSE_INCLUDE_PERCENT_MULTIPLE_THRESHOLD] + } + if level == "repo": + param_dict = { + "bug_issue_open_time_avg":[BUG_ISSUE_OPEN_TIME_WEIGHT*0.5, BUG_ISSUE_OPEN_TIME_THRESHOLD], + "bug_issue_open_time_mid":[BUG_ISSUE_OPEN_TIME_WEIGHT*0.5, BUG_ISSUE_OPEN_TIME_THRESHOLD], + "vulnerability_count": [VULNERABILITY_COUNT_WEIGHT, VULNERABILITY_COUNT_THRESHOLD], + "defect_count": [DEFECT_COUNT_WEIGHT, DEFECT_COUNT_THRESHOLD], + "code_smell": [CODE_SMELL_WEIGHT, CODE_CLONE_PERCENT_THRESHOLD], + "code_clone_percent": [CODE_CLONE_PERCENT_WEIGHT, CODE_CLONE_PERCENT_THRESHOLD], + "code_cyclomatic_complexity": [CODE_CYCLOMATIC_COMPLEXITY_WEIGHT, CODE_CLONE_PERCENT_THRESHOLD], + "licenses_include_percent": [LICENSSE_INCLUDE_PERCENT_WEIGHT, LICENSSE_INCLUDE_PERCENT_THRESHOLD] + } + return normalize(get_score_ahp(item, param_dict), CODE_SECURITY_SCORE_MIN, CODE_SECURITY_SCORE_MAX) + +def get_communityActivity_score(item, level='repo'): + param_dict = {} + if level == "community" or level == "project": + param_dict = { + "contributors_number": [CONTRIBUTORS_NUMBER_WEIGHT, CONTRIBUTORS_NUMBER_MULTIPLE_THRESHOLD], + "updated_at": [UPDATED_AT_WEIGHT, UPDATED_AT_MULTIPLE_THRESHOLD], + "created_at": [CREATED_AT_WEIGHT, CREATED_AT_MULTIPLE_THRESHOLD] + } + if level == "repo": + param_dict = { + "contributors_number": [CONTRIBUTORS_NUMBER_WEIGHT, CONTRIBUTORS_NUMBER_THRESHOLD], + "updated_at": [UPDATED_AT_WEIGHT, UPDATED_AT_THRESHOLD], + "created_at": [CREATED_AT_WEIGHT, CREATED_AT_THRESHOLD] + } + return normalize(get_score_ahp(item, param_dict), COMMUNITY_ACTIVITY_SCORE_MIN, COMMUNITY_ACTIVITY_SCORE_MAX) + +def get_humanDiversity_score(item, level='repo'): + param_dict = {} + if level == "community" or level == "project": + param_dict = { + 'location_distribution': [LOCATION_DISTRIBUTION_WEIGHT, LOCATION_DISTRIBUTION_MULTIPLE_THRESHOLD], + 'organization_count': [ORGANIZATION_COUNT_WEIGHT, ORGANIZATION_COUNT_MULTIPLE_THRESHOLD], + # 'organization_developer_count': [ORGANIZATION_DEVELOPER_COUNT_WEIGHT, ORGANIZATION_DEVELOPER_COUNT_MULTIPLE_THRESHOLD], + 'bus_factor': [BUS_FACTOR_WEIGHT, BUS_FACTOR_MULTIPLE_THRESHOLD], + 'elephant_factor': [ELEPHANT_FACTOR_WEIGHT, ELEPHANT_FACTOR_MULTIPLE_THRESHOLD] + } + if level == "repo": + param_dict = { + 'location_distribution': [LOCATION_DISTRIBUTION_WEIGHT, LOCATION_DISTRIBUTION_THRESHOLD], + 'organization_count': [ORGANIZATION_COUNT_WEIGHT, ORGANIZATION_COUNT_THRESHOLD], + # 'organization_developer_count': [ORGANIZATION_DEVELOPER_COUNT_WEIGHT, ORGANIZATION_DEVELOPER_COUNT_THRESHOLD], + 'bus_factor': [BUS_FACTOR_WEIGHT, BUS_FACTOR_THRESHOLD], + 'elephant_factor': [ELEPHANT_FACTOR_WEIGHT, ELEPHANT_FACTOR_THRESHOLD] + } + return normalize(get_score_ahp(item, param_dict), HUMAN_DIVERSITY_SCORE_MIN, HUMAN_DIVERSITY_SCORE_MAX) + +def get_techDiversity_score(item, level='repo'): + param_dict = {} + if level == "community" or level == "project": + param_dict = { + 'language_distribution': [LANGUAGE_DISTRIBUTION_WEIGHT, LANGUAGE_DISTRIBUTION_MULTIPLE_THRESHOLD], + 'license_distribution': [LICENSE_DISTRIBUTION_WEIGHT, LICENSE_DISTRIBUTION_MULTIPLE_THRESHOLD] + } + if level == "repo": + param_dict = { + 'language_distribution': [LANGUAGE_DISTRIBUTION_WEIGHT, LANGUAGE_DISTRIBUTION_THRESHOLD], + 'license_distribution': [LICENSE_DISTRIBUTION_WEIGHT, LICENSE_DISTRIBUTION_THRESHOLD] + } + return normalize(get_score_ahp(item, param_dict), TECH_DIVERSITY_SCORE_MIN, TECH_DIVERSITY_SCORE_MAX) + +def get_summary_score(item, level='repo'): + param_dict = { + 'copy_code_develop_activity_score': [CODE_DEVELOP_ACTIVITY_SCORE_WEIGHT, CODE_DEVELOP_ACTIVITY_SCORE_WEIGHT], + 'copy_code_develop_quality_score': [CODE_DEVELOP_QUALITY_SCORE_WEIGHT, CODE_DEVELOP_QUALITY_SCORE_THRESHOLD], + 'copy_code_security_score': [CODE_SECURITY_SCORE_WEIGHT, CODE_SECURITY_SCORE_THRESHOLD], + 'copy_community_activity_score': [COMMUNITY_ACTIVITY_SCORE_WEIGHT, COMMUNITY_ACTIVITY_SCORE_THRESHOLD], + 'copy_human_diversity_score': [HUMAN_DIVERSITY_SCORE_WEIGHT, HUMAN_DIVERSITY_SCORE_THRESHOLD], + 'copy_tech_diversity_score': [TECH_DIVERSITY_SCORE_WEIGHT, TECH_DIVERSITY_SCORE_THRESHOLD] + } + return normalize(get_score_ahp(item, param_dict), SUMMARY_SCORE_MIN, SUMMARY_SCORE_MAX) + +def increment_decay(last_data, threshold, days): + return min(last_data + DECAY_COEFFICIENT * threshold * days, threshold) + +def decrease_decay(last_data, threshold, days): + return max(last_data - DECAY_COEFFICIENT * threshold * days, 0) + +def codeDevQuality_decay(item, last_data, level="repo"): + if last_data == None: + return item + decay_item = item.copy() + increment_decay_dict = {} + decrease_decay_dict = {} + if level == "community" or level == "project": + increment_decay_dict = { + "issue_first_reponse_avg": ISSUE_FIRST_RESPONSE_MULTIPLE_THRESHOLD, + "issue_first_reponse_mid": ISSUE_FIRST_RESPONSE_MULTIPLE_THRESHOLD, + "pr_open_time_avg": PR_OPEN_TIME_MULTIPLE_THRESHOLD, + "pr_open_time_mid": PR_OPEN_TIME_MULTIPLE_THRESHOLD, + "pr_first_response_time_avg": PR_FIRST_RESPONSE_MULTIPLE_THRESHOLD, + "pr_first_response_time_mid": PR_FIRST_RESPONSE_MULTIPLE_THRESHOLD, + + } + decrease_decay_dict = { + "code_merge_ratio": CODE_MERGE_RATIO_MULTIPLE_THRESHOLD, + "code_review_ratio": CODE_REVIEW_RATIO_MULTIPLE_THRESHOLD, + "pr_issue_linked_ratio": PR_ISSUE_LINKED_MULTIPLE_THRESHOLD, + "git_pr_linked_ratio": COMMIT_PR_LINKED_RATIO_MULTIPLE_THRESHOLD, + "comment_frequency": COMMENT_FREQUENCY_MULTIPLE_THRESHOLD, + } + if level == "repo": + increment_decay_dict = { + "issue_first_reponse_avg":ISSUE_FIRST_RESPONSE_THRESHOLD, + "issue_first_reponse_mid":ISSUE_FIRST_RESPONSE_THRESHOLD, + "pr_open_time_avg":PR_OPEN_TIME_THRESHOLD, + "pr_open_time_mid":PR_OPEN_TIME_THRESHOLD, + "pr_first_response_time_avg": PR_FIRST_RESPONSE_THRESHOLD, + "pr_first_response_time_mid": PR_FIRST_RESPONSE_THRESHOLD, + } + decrease_decay_dict = { + "code_merge_ratio": CODE_MERGE_RATIO_THRESHOLD, + "code_review_ratio":CODE_REVIEW_RATIO_THRESHOLD, + "pr_issue_linked_ratio":PR_ISSUE_LINKED_THRESHOLD, + "git_pr_linked_ratio":COMMIT_PR_LINKED_RATIO_THRESHOLD, + "comment_frequency":COMMENT_FREQUENCY_THRESHOLD, + } + + for key, value in increment_decay_dict.items(): + if item[key] == None and last_data.get(key) != None: + days = pendulum.parse(item['grimoire_creation_date']).diff(pendulum.parse(last_data[key][1])).days + decay_item[key] = round(increment_decay(last_data[key][0], value, days), 4) + for key, value in decrease_decay_dict.items(): + if item[key] == None and last_data.get(key) != None: + days = pendulum.parse(item['grimoire_creation_date']).diff(pendulum.parse(last_data[key][1])).days + decay_item[key] = round(decrease_decay(last_data[key][0], value, days), 4) + return decay_item \ No newline at end of file diff --git a/organizations.json b/organizations.json new file mode 100644 index 0000000..0b8f41e --- /dev/null +++ b/organizations.json @@ -0,0 +1,11459 @@ +{ + "blacklist": [], + "organizations": { + "2N Telekomunikace": [ + { + "domain": "2n.cz", + "is_top": true + } + ], + "2Scale": [ + { + "domain": "2scale.net", + "is_top": true + } + ], + "3ality Technica": [ + { + "domain": "3alitydigital.de", + "is_top": true + }, + { + "domain": "3alitytechnica.com", + "is_top": true + } + ], + "42on": [ + { + "domain": "42on.com", + "is_top": true + } + ], + "4pi": [ + { + "domain": "4pi.com", + "is_top": true + } + ], + "5e Technologies": [ + { + "domain": "5etech.eu", + "is_top": true + }, + { + "domain": "5etechnologies.com", + "is_top": true + } + ], + "6WIND": [ + { + "domain": "6wind.com", + "is_top": true + } + ], + "8D Technologies": [ + { + "domain": "8d.com", + "is_top": true + } + ], + "99cloud": [ + { + "domain": "99cloud.net", + "is_top": true + } + ], + "Aalto University": [ + { + "domain": "aalto.fi", + "is_top": true + } + ], + "A10": [ + { + "domain": "a10networks.com", + "is_top": true + } + ], + "ADDI-DATA GmbH": [ + { + "domain": "addi-data.com", + "is_top": true + } + ], + "ADLINK": [ + { + "domain": "adlinktech.com", + "is_top": true + } + ], + "AG Interactive": [ + { + "domain": "americangreetings.com", + "is_top": true + } + ], + "AGETO Service GmbH": [ + { + "domain": "ageto.de", + "is_top": true + } + ], + "AGIX Linux": [ + { + "domain": "agix.com.au", + "is_top": true + } + ], + "ALPHA-BIT": [ + { + "domain": "alpha-bit.de", + "is_top": true + } + ], + "ALT Linux, Ltd.": [ + { + "domain": "altlinux.com", + "is_top": true + }, + { + "domain": "altlinux.ru", + "is_top": true + } + ], + "ALi": [ + { + "domain": "alitech.com", + "is_top": true + } + ], + "AMD": [ + { + "domain": "amd.com", + "is_top": true + }, + { + "domain": "amd64.org", + "is_top": true + } + ], + "AMDOCS": [ + { + "domain": "amdocs.com", + "is_top": true + } + ], + "ANDURAS AG": [ + { + "domain": "anduras.de", + "is_top": true + } + ], + "APM": [ + { + "domain": "amcc.com", + "is_top": true + }, + { + "domain": "apm.com", + "is_top": true + } + ], + "ARM": [ + { + "domain": "arm.com", + "is_top": true + } + ], + "ARVOO Engineering": [ + { + "domain": "arvoo.com", + "is_top": true + }, + { + "domain": "arvoo.nl", + "is_top": true + } + ], + "ASIX Electronics Corporation": [ + { + "domain": "asix.com.tw", + "is_top": true + } + ], + "Association of Computing Machinery": [ + { + "domain": "acm.org", + "is_top": true + } + ], + "AT&T": [ + { + "domain": "att.com", + "is_top": true + }, + { + "domain": "attinteractive.com", + "is_top": true + } + ], + "ATRON electronic": [ + { + "domain": "atron.com", + "is_top": true + } + ], + "Abilis Systems": [ + { + "domain": "abilis.com", + "is_top": true + } + ], + "Absolut Bank": [ + { + "domain": "absolutbank.com", + "is_top": true + }, + { + "domain": "absolutbank.ru", + "is_top": true + } + ], + "AbsoluteValue Systems, Inc.": [ + { + "domain": "linux-wlan.com", + "is_top": true + } + ], + "Acaleph": [ + { + "domain": "acale.ph", + "is_top": true + } + ], + "Accenture": [ + { + "domain": "accenture.com", + "is_top": true + } + ], + "Acelio": [ + { + "domain": "acelio.com", + "is_top": true + } + ], + "Acision": [ + { + "domain": "acision.com", + "is_top": true + } + ], + "Acme Systems srl": [ + { + "domain": "acmesystems.it", + "is_top": true + } + ], + "Aconex": [ + { + "domain": "aconex.com", + "is_top": true + } + ], + "Acronis": [ + { + "domain": "acronis.com", + "is_top": true + } + ], + "Actuate Corporation": [ + { + "domain": "actuate.com", + "is_top": true + } + ], + "Aculab": [ + { + "domain": "aculab.com", + "is_top": true + } + ], + "AdRem Technologies": [ + { + "domain": "ademtechnologies.com", + "is_top": true + } + ], + "Adaptec": [ + { + "domain": "adaptec.com", + "is_top": true + } + ], + "Adaptive Computing": [ + { + "domain": "adaptivecomputing.com", + "is_top": true + } + ], + "Adeneo Embedded": [ + { + "domain": "adeneo-embedded.com", + "is_top": true + } + ], + "Adetel Group": [ + { + "domain": "adetelgroup.com", + "is_top": true + } + ], + "Adobe Systems, Inc.": [ + { + "domain": "adobe.com", + "is_top": true + } + ], + "AgileMesh": [ + { + "domain": "agilemesh.com", + "is_top": true + } + ], + "Agilent Technologies": [ + { + "domain": "agilent.com", + "is_top": true + } + ], + "AimValley": [ + { + "domain": "aimvalley.nl", + "is_top": true + } + ], + "AirGap IT": [ + { + "domain": "airgapit.com", + "is_top": true + } + ], + "Airbus Group": [ + { + "domain": "airbus.com", + "is_top": true + }, + { + "domain": "airbusgroup.com", + "is_top": true + }, + { + "domain": "casaespacio.com", + "is_top": true + }, + { + "domain": "eads.com", + "is_top": true + } + ], + "Airvana": [ + { + "domain": "airvana.com", + "is_top": true + } + ], + "Akamai Technologies": [ + { + "domain": "akamai.com", + "is_top": true + } + ], + "Akanda, Inc.": [ + { + "domain": "akanda.io", + "is_top": true + } + ], + "Alacritech": [ + { + "domain": "alacritech.com", + "is_top": true + } + ], + "Alcatel-Lucent": [ + { + "domain": "alcatel-lucent.com", + "is_top": true + }, + { + "domain": "alcatel-lucent.fr", + "is_top": true + }, + { + "domain": "alcatel.com", + "is_top": true + }, + { + "domain": "bell-labs.com", + "is_top": true + }, + { + "domain": "lucent.com", + "is_top": true + } + ], + "Alibaba": [ + { + "domain": "alibaba-inc.com", + "is_top": true + }, + { + "domain": "alibaba.com", + "is_top": true + } + ], + "Allegro": [ + { + "domain": "allegro.pl", + "is_top": true + }, + { + "domain": "allegrogroup.com", + "is_top": true + }, + { + "domain": "allegrogroup.hu", + "is_top": true + }, + { + "domain": "allegrogroup.ro", + "is_top": true + } + ], + "Allen Organ Company": [ + { + "domain": "allen-organ.com", + "is_top": true + }, + { + "domain": "allenorgan.com", + "is_top": true + } + ], + "Allied Telesis": [ + { + "domain": "alliedtelesis.co.nz", + "is_top": true + } + ], + "Alsatis": [ + { + "domain": "alsatis.com", + "is_top": true + } + ], + "Alter Way": [ + { + "domain": "alterway.fr", + "is_top": true + } + ], + "Altiscale": [ + { + "domain": "altiscale.com", + "is_top": true + } + ], + "Altran": [ + { + "domain": "altran.com", + "is_top": true + } + ], + "Alyseo": [ + { + "domain": "alyseo.com", + "is_top": true + } + ], + "Amadeus": [ + { + "domain": "amadeus.com", + "is_top": true + } + ], + "Amarula Solutions": [ + { + "domain": "amarulasolutions.com", + "is_top": true + } + ], + "Amazon.com": [ + { + "domain": "amazon.com", + "is_top": true + }, + { + "domain": "lab126.com", + "is_top": true + } + ], + "Ambarella": [ + { + "domain": "ambarella.com", + "is_top": true + } + ], + "American Microsystems, Ltd.": [ + { + "domain": "amltd.com", + "is_top": true + } + ], + "American University": [ + { + "domain": "american.edu", + "is_top": true + } + ], + "Ammeon": [ + { + "domain": "ammeon.com", + "is_top": true + } + ], + "Anachron BV": [ + { + "domain": "anachron.com", + "is_top": true + } + ], + "Antmicro": [ + { + "domain": "antmicro.com", + "is_top": true + } + ], + "Anagramm GmbH": [ + { + "domain": "anagramm.de", + "is_top": true + } + ], + "Analog Devices": [ + { + "domain": "analog.com", + "is_top": true + } + ], + "Anchor Hosting": [ + { + "domain": "anchor.com.au", + "is_top": true + } + ], + "Anevia": [ + { + "domain": "anevia-group.com", + "is_top": true + }, + { + "domain": "anevia.com", + "is_top": true + } + ], + "Ansible": [ + { + "domain": "ansible.com", + "is_top": true + } + ], + "Anso Labs": [ + { + "domain": "ansolabs.com", + "is_top": true + } + ], + "AnswerNet.Com": [ + { + "domain": "answernet.com", + "is_top": true + } + ], + "Antagonist B.V.": [ + { + "domain": "antagonist.nl", + "is_top": true + } + ], + "Apigee Corp": [ + { + "domain": "apigee.com", + "is_top": true + } + ], + "AppDynamics": [ + { + "domain": "appdynamics.com", + "is_top": true + } + ], + "Appear TV AS": [ + { + "domain": "appeartv.com", + "is_top": true + } + ], + "Apple": [ + { + "domain": "apple.com", + "is_top": true + } + ], + "Applied Micro Circuit Corporation": [], + "Aptana, Inc.": [ + { + "domain": "aptana.com", + "is_top": true + } + ], + "Aptira": [ + { + "domain": "aptira.com", + "is_top": true + } + ], + "Arastra, Inc.": [], + "Arcor lhr": [ + { + "domain": "arcor.de", + "is_top": true + } + ], + "Areca": [ + { + "domain": "areca.com.tw", + "is_top": true + } + ], + "Argonne National Laboratory": [ + { + "domain": "anl.gov", + "is_top": true + } + ], + "Arista Networks": [ + { + "domain": "arastra.com", + "is_top": true + }, + { + "domain": "arista.com", + "is_top": true + }, + { + "domain": "aristanetworks.com", + "is_top": true + } + ], + "Arkena": [ + { + "domain": "arkena.com", + "is_top": true + } + ], + "Arkoon": [ + { + "domain": "arkoon.com", + "is_top": true + } + ], + "Armadeus Systems": [ + { + "domain": "armadeus.com", + "is_top": true + } + ], + "Armory Technologies, Inc.": [ + { + "domain": "bitcoinarmory.com", + "is_top": true + } + ], + "Artec Design": [ + { + "domain": "artecdesign.ee", + "is_top": true + } + ], + "ArtiBit": [ + { + "domain": "artibit.com", + "is_top": true + } + ], + "Ascom": [ + { + "domain": "ascom.ch", + "is_top": true + } + ], + "Askbot": [ + { + "domain": "askbot.com", + "is_top": true + } + ], + "Astaro": [ + { + "domain": "astaro.com", + "is_top": true + } + ], + "Astek Corporation": [ + { + "domain": "astekcorp.com", + "is_top": true + } + ], + "Athabasca University": [ + { + "domain": "athabascau.ca", + "is_top": true + } + ], + "Atheros Communications": [ + { + "domain": "atheros.com", + "is_top": true + } + ], + "Athlone Institute of Technology": [ + { + "domain": "ait.ie", + "is_top": true + } + ], + "Atlassian": [ + { + "domain": "atlassian.com", + "is_top": true + } + ], + "Atmel": [ + { + "domain": "atmel.com", + "is_top": true + } + ], + "Atomia": [ + { + "domain": "atomia.com", + "is_top": true + } + ], + "Atomide": [ + { + "domain": "atomide.com", + "is_top": true + } + ], + "Atos Integration": [ + { + "domain": "atos.net", + "is_top": true + } + ], + "AudioScience, Inc.": [ + { + "domain": "audioscience.com", + "is_top": true + } + ], + "Auerswald": [ + { + "domain": "auerswald.de", + "is_top": true + } + ], + "AutoScout24 GmbH": [ + { + "domain": "autoscout24.com", + "is_top": true + } + ], + "Avago Technologies": [ + { + "domain": "avagotech.com", + "is_top": true + } + ], + "AvantSoft, Inc": [ + { + "domain": "avantos.com", + "is_top": true + } + ], + "Avi Networks": [ + { + "domain": "avinetworks.com", + "is_top": true + } + ], + "Avionic Design Development GmbH": [ + { + "domain": "avionic-design.de", + "is_top": true + } + ], + "Avocent": [ + { + "domain": "avocent.com", + "is_top": true + } + ], + "Avtrex": [ + { + "domain": "avtrex.com", + "is_top": true + } + ], + "Awcloud": [ + { + "domain": "awcloud.com", + "is_top": true + } + ], + "Axis Communications AB": [ + { + "domain": "axis.com", + "is_top": true + } + ], + "Axway": [ + { + "domain": "axway.com", + "is_top": true + } + ], + "Azingo, Inc.": [ + { + "domain": "azingo.com", + "is_top": true + } + ], + "B Labs": [ + { + "domain": "b-labs.co.uk", + "is_top": false + } + ], + "B1 Systems": [ + { + "domain": "b1-systems.de", + "is_top": true + } + ], + "BCI": [ + { + "domain": "bci.co.mz", + "is_top": true + } + ], + "BEA": [ + { + "domain": "Bea-solutions.com", + "is_top": true + } + ], + "BIGBANK": [ + { + "domain": "bigbank.at", + "is_top": true + }, + { + "domain": "bigbank.de", + "is_top": true + }, + { + "domain": "bigbank.ee", + "is_top": true + }, + { + "domain": "bigbank.es", + "is_top": true + }, + { + "domain": "bigbank.eu", + "is_top": true + }, + { + "domain": "bigbank.lt", + "is_top": true + } + ], + "BMC Software": [ + { + "domain": "bmc.com", + "is_top": true + } + ], + "BMW Group": [ + { + "domain": "bmwgroup.com", + "is_top": true + } + ], + "BREDEX GmbH": [ + { + "domain": "bredex.de", + "is_top": true + } + ], + "BSQUARE": [ + { + "domain": "bsquare.com", + "is_top": true + } + ], + "BTChip": [ + { + "domain": "btchip.com", + "is_top": true + } + ], + "BTicino": [ + { + "domain": "bticino.it", + "is_top": true + } + ], + "BVOX": [ + { + "domain": "bvox.net", + "is_top": true + } + ], + "Bacoosta IT Services": [ + { + "domain": "bacoosta.com", + "is_top": true + } + ], + "Baidu": [ + { + "domain": "baidu.com", + "is_top": true + } + ], + "BalaBit": [ + { + "domain": "balabit.com", + "is_top": true + }, + { + "domain": "balabit.hu", + "is_top": true + } + ], + "Banno, LLC": [ + { + "domain": "banno.com", + "is_top": true + } + ], + "Barbon Insurance Group": [ + { + "domain": "barbon.com", + "is_top": true + } + ], + "Barco": [ + { + "domain": "barco.com", + "is_top": true + } + ], + "Basler AG": [ + { + "domain": "baslerweb.com", + "is_top": true + } + ], + "Bay": [ + { + "domain": "bay.ws", + "is_top": false + } + ], + "Bayan": [ + { + "domain": "bayan.co.ir", + "is_top": true + } + ], + "Bazaarvoice": [ + { + "domain": "bazaarvoice.com", + "is_top": true + } + ], + "BBVA Data & Analytics": [ + { + "domain": "bbvadata.com", + "is_top": true + } + ], + "BDTi": [ + { + "domain": "bdti.com", + "is_top": true + } + ], + "Beamly": [ + { + "domain": "beamly.com", + "is_top": true + } + ], + "Beijing Rising Technology Co.": [ + { + "domain": "rising-global.com", + "is_top": true + }, + { + "domain": "rising.com.cn", + "is_top": true + } + ], + "Belden": [ + { + "domain": "belden.com", + "is_top": true + } + ], + "BestSolution": [ + { + "domain": "bestsolution.at", + "is_top": true + } + ], + "BetterLinux": [ + { + "domain": "betterlinux.com", + "is_top": true + } + ], + "Big Switch Networks": [ + { + "domain": "bigswitch.com", + "is_top": true + } + ], + "Bigfoot Networks": [ + { + "domain": "bigfootnetworks.com", + "is_top": true + } + ], + "Bigpoint": [ + { + "domain": "bigppoint.com", + "is_top": true + }, + { + "domain": "bigppoint.net", + "is_top": true + } + ], + "Bingham University": [ + { + "domain": "binghamuni.edu.ng", + "is_top": true + } + ], + "Bird": [ + { + "domain": "bird.co", + "is_top": true + } + ], + "Birst": [ + { + "domain": "birst.com", + "is_top": true + } + ], + "Bit-isle, Inc.": [ + { + "domain": "bit-isle.jp", + "is_top": true + } + ], + "BitBox, Ltd.": [ + { + "domain": "bitbox.co.uk", + "is_top": true + } + ], + "BitGo": [ + { + "domain": "bitgo.com", + "is_top": true + } + ], + "BitPay": [ + { + "domain": "bitpay.com", + "is_top": true + } + ], + "BitSim": [ + { + "domain": "bitsim.com", + "is_top": true + } + ], + "BitSource.org": [ + { + "domain": "bitsource.org", + "is_top": true + } + ], + "BitWagon Software": [ + { + "domain": "bitwagon.com", + "is_top": true + } + ], + "Bitcoin Foundation": [ + { + "domain": "bitcoin-contact.org", + "is_top": true + }, + { + "domain": "bitcoin.org.pl", + "is_top": true + } + ], + "Bitergia": [ + { + "domain": "bitergia.com", + "is_top": true + } + ], + "Bitfrost": [ + { + "domain": "bitfrost.no", + "is_top": true + } + ], + "Bitmer, Ltd.": [ + { + "domain": "bitmer.com", + "is_top": true + } + ], + "Bits Of Proof": [ + { + "domain": "bitsofproof.com", + "is_top": true + } + ], + "Bitwise": [ + { + "domain": "bitwise.io", + "is_top": true + } + ], + "Bivio Networks, Inc.": [ + { + "domain": "bivio.net", + "is_top": true + } + ], + "Black Pearl Systems": [ + { + "domain": "blackpearlsystems.com", + "is_top": true + } + ], + "BlackBerry": [ + { + "domain": "rim.com", + "is_top": true + } + ], + "BlackMesh": [ + { + "domain": "blackmesh.com", + "is_top": true + } + ], + "Blackberry Limited": [ + { + "domain": "blackberry.com", + "is_top": true + } + ], + "Blackboard": [ + { + "domain": "blackboard.com", + "is_top": true + } + ], + "BlankPage": [ + { + "domain": "blankpage.ch", + "is_top": true + } + ], + "Blue Box Group": [ + { + "domain": "bluebox.net", + "is_top": true + } + ], + "Blue Technix": [ + { + "domain": "bluetechnix.at", + "is_top": true + } + ], + "Bluecherry, LLC": [ + { + "domain": "bluecherry.net", + "is_top": true + } + ], + "Bluegiga": [ + { + "domain": "bluegiga.com", + "is_top": true + } + ], + "Bluehost": [ + { + "domain": "bluehost.com", + "is_top": true + } + ], + "Bluewater Systems": [ + { + "domain": "bluewatersys.com", + "is_top": true + } + ], + "Bodeco, Inc.": [ + { + "domain": "bodeco.io", + "is_top": true + } + ], + "Boeing": [ + { + "domain": "boeing.com", + "is_top": true + } + ], + "Bollor\u00e9 Telecom": [ + { + "domain": "bolloretelecom.eu", + "is_top": true + } + ], + "Borland Software Corp.": [ + { + "domain": "borland.com", + "is_top": true + } + ], + "Bosch": [ + { + "domain": "bosch-sensortec.com", + "is_top": true + }, + { + "domain": "bosch.com", + "is_top": true + } + ], + "Bose Corporation": [ + { + "domain": "bose.com", + "is_top": true + } + ], + "Boston Technologies, Inc.": [ + { + "domain": "bostontechnologies.com", + "is_top": true + } + ], + "Boundary Devices": [ + { + "domain": "boundarydevices.com", + "is_top": true + } + ], + "Brastel Telecom": [ + { + "domain": "brastel.co.jp", + "is_top": true + }, + { + "domain": "brastel.com", + "is_top": true + } + ], + "Bright Tag": [ + { + "domain": "thebrighttag.com", + "is_top": true + } + ], + "Brown University": [ + { + "domain": "brown.edu", + "is_top": true + } + ], + "Brightcove Inc": [], + "Brinkster": [ + { + "domain": "brinkster.com", + "is_top": true + } + ], + "Broadcom": [ + { + "domain": "broadcom.com", + "is_top": true + } + ], + "Brocade": [ + { + "domain": "brocade.com", + "is_top": true + } + ], + "Brontes Technologies": [ + { + "domain": "brontes3d.com", + "is_top": true + } + ], + "Bronto Software, Inc.": [ + { + "domain": "bronto.com", + "is_top": true + } + ], + "BrowserStack": [ + { + "domain": "browserstack.com", + "is_top": true + } + ], + "Budker Institute of Nuclear Physics": [ + { + "domain": "inp.nsk.su", + "is_top": true + } + ], + "Bull": [ + { + "domain": "bull.com", + "is_top": true + }, + { + "domain": "bull.es", + "is_top": true + }, + { + "domain": "bull.fr", + "is_top": true + }, + { + "domain": "bull.net", + "is_top": true + } + ], + "Buscap\u00e9 Company": [ + { + "domain": "buscape-inc.com", + "is_top": true + } + ], + "Business Systems Integration AG": [ + { + "domain": "bsi-software.com", + "is_top": true + } + ], + "C&C Technologies": [ + { + "domain": "cctechnol.com", + "is_top": true + } + ], + "CALAO Systems SAS": [ + { + "domain": "calao-systems.com", + "is_top": true + } + ], + "CBS Interactive, Inc.": [ + { + "domain": "cbsinteractive.com", + "is_top": true + } + ], + "CC Computer Consultants": [ + { + "domain": "computergmbh.de", + "is_top": true + } + ], + "CCM Benchmark": [ + { + "domain": "ccmbenchmark.com", + "is_top": true + } + ], + "CDI.CZ": [ + { + "domain": "cdi.cz", + "is_top": true + } + ], + "CE Linux Forum": [ + { + "domain": "celinuxforum.org", + "is_top": true + } + ], + "Cerebras": [ + { + "domain": "cerebras.net", + "is_top": true + } + ], + "CEVA DSP": [ + { + "domain": "ceva-dsp.com", + "is_top": true + } + ], + "CEA": [ + { + "domain": "cea.fr", + "is_top": true + } + ], + "CERN": [ + { + "domain": "cern.ch", + "is_top": true + } + ], + "Chongqing University": [ + { + "domain": "cqu.edu.cn", + "is_top": true + } + ], + "CGI Group": [ + { + "domain": "cgi.com", + "is_top": true + } + ], + "CIeNET Technologies": [ + { + "domain": "cienet.com.cn", + "is_top": true + } + ], + "CJSC NII STT": [ + { + "domain": "niistt.ru", + "is_top": true + } + ], + "Codespeaks": [ + { + "domain": "codespeaks.com", + "is_top": true + } + ], + "Cornell University": [ + { + "domain": "cornell.edu", + "is_top": true + } + ], + "CNR": [ + { + "domain": "cnr.it", + "is_top": true + } + ], + "CNRS": [ + { + "domain": "cnrs.fr", + "is_top": true + } + ], + "COIT": [ + { + "domain": "coit.es", + "is_top": true + } + ], + "CPTI": [ + { + "domain": "cpti.cetuc.puc-rio.br", + "is_top": true + } + ], + "CSAIL": [ + { + "domain": "csail.mit.edu", + "is_top": true + } + ], + "CSC": [ + { + "domain": "csc.com", + "is_top": true + } + ], + "CSR": [ + { + "domain": "csr.com", + "is_top": true + } + ], + "CSR4": [ + { + "domain": "crs4.it", + "is_top": true + } + ], + "CSS Corporation": [ + { + "domain": "csscorp.com", + "is_top": true + } + ], + "CTERA Networks": [ + { + "domain": "ctera.com", + "is_top": true + } + ], + "CadSoft Computer GmbH": [ + { + "domain": "cadsoft.de", + "is_top": true + } + ], + "Cadence Design Systems": [ + { + "domain": "cadence.com", + "is_top": true + }, + { + "domain": "ip.cadence.com", + "is_top": false + } + ], + "Calit2": [ + { + "domain": "calit2.net", + "is_top": true + }, + { + "domain": "calit2.uci.edu", + "is_top": true + } + ], + "Call Direct": [ + { + "domain": "call-direct.com.au", + "is_top": false + } + ], + "Calsoft, Inc.": [ + { + "domain": "calsoftinc.com", + "is_top": true + } + ], + "CalvaEDI": [ + { + "domain": "calva.com", + "is_top": true + }, + { + "domain": "calvaedi.com", + "is_top": true + } + ], + "Calxeda": [ + { + "domain": "calxeda.com", + "is_top": true + } + ], + "Calyptech Pty, Ltd.": [ + { + "domain": "calyptech.com", + "is_top": true + } + ], + "Canadian Bank Note Company": [ + { + "domain": "cbnco.com", + "is_top": true + } + ], + "Candela Technologies": [ + { + "domain": "candelatech.com", + "is_top": true + } + ], + "Canonical, Ltd.": [ + { + "domain": "canonical.com", + "is_top": true + }, + { + "domain": "ubuntu.com", + "is_top": true + } + ], + "Capgemini Consulting": [ + { + "domain": "capgemini.com", + "is_top": true + } + ], + "Capital One": [ + { + "domain": "capitalone.com", + "is_top": true + } + ], + "Capital Sales Group": [ + { + "domain": "capitalsalesgroup.com", + "is_top": true + } + ], + "Card Access": [ + { + "domain": "cardaccess-inc.com", + "is_top": true + } + ], + "CardSpring, Inc.": [ + { + "domain": "cardspring.com", + "is_top": true + } + ], + "CareerBuilder, LLC.": [ + { + "domain": "careerbuilder.com", + "is_top": true + } + ], + "Carnegie Mellon University": [ + { + "domain": "cmu.edu", + "is_top": true + } + ], + "CartoDB": [ + { + "domain": "cartodb.com", + "is_top": true + } + ], + "CastLabs": [ + { + "domain": "castlabs.com", + "is_top": true + } + ], + "Catalyst": [ + { + "domain": "catalyst.net.nz", + "is_top": true + } + ], + "Cavium": [ + { + "domain": "cavium.com", + "is_top": true + }, + { + "domain": "caviumnetworks.com", + "is_top": true + } + ], + "Celestrius": [ + { + "domain": "celestrius.com", + "is_top": true + } + ], + "Celunite, Inc.": [ + { + "domain": "celunite.com", + "is_top": true + } + ], + "Centaur Technology": [ + { + "domain": "centtech.com", + "is_top": true + } + ], + "Centrin": [ + { + "domain": "centrin.net.id", + "is_top": true + } + ], + "Cerner Corporation": [ + { + "domain": "cerner.com", + "is_top": true + } + ], + "Chaincode Labs": [ + { + "domain": "chaincode.com", + "is_top": true + } + ], + "Chair for Applied Software Engineering, TUM": [ + { + "domain": "tum.de", + "is_top": true + } + ], + "ChargeStorm AB": [ + { + "domain": "chargestorm.se", + "is_top": true + } + ], + "Check Point": [ + { + "domain": "checkpoint.com", + "is_top": true + } + ], + "Chef": [ + { + "domain": "chef.io", + "is_top": true + }, + { + "domain": "opscode.com", + "is_top": true + } + ], + "Chelsio Communications": [ + { + "domain": "chelsio.com", + "is_top": true + } + ], + "China Electronics Technology Group Corporation": [ + { + "domain": "cetc.com.cn", + "is_top": true + } + ], + "Choopa, LLC": [ + { + "domain": "choopa.com", + "is_top": true + } + ], + "Chumby Industries": [ + { + "domain": "chumby.com", + "is_top": true + } + ], + "Ciklum": [ + { + "domain": "ciklum.com", + "is_top": true + } + ], + "Cinterion Wireless Modules": [ + { + "domain": "cinterion.com", + "is_top": true + } + ], + "Circle Internet Financial": [ + { + "domain": "circle.com", + "is_top": true + } + ], + "Cirrax": [ + { + "domain": "cirrax.com", + "is_top": true + } + ], + "Cirrus Logic": [ + { + "domain": "cirrus.com", + "is_top": true + } + ], + "CirrusMio, Inc.": [ + { + "domain": "cirrusmio.com", + "is_top": true + } + ], + "Cisco": [ + { + "domain": "cisco.com", + "is_top": true + } + ], + "Citrix": [ + { + "domain": "citrix.com", + "is_top": true + }, + { + "domain": "cloud.com", + "is_top": true + }, + { + "domain": "xensource.com", + "is_top": true + } + ], + "City University London": [], + "City of Austin": [ + { + "domain": "austintexas.gov", + "is_top": true + } + ], + "City of Boston": [ + { + "domain": "boston.gov", + "is_top": true + } + ], + "City of Santa Monica": [ + { + "domain": "smgov.net", + "is_top": true + } + ], + "Clemson University": [ + { + "domain": "clemson.edu", + "is_top": true + } + ], + "CloudBees, Inc.": [ + { + "domain": "cloudbees.com", + "is_top": true + } + ], + "CloudPassage, Inc.": [ + { + "domain": "cloudpassage.com", + "is_top": true + } + ], + "CloudRunner.io, Inc.": [ + { + "domain": "cloudrunner.io", + "is_top": true + } + ], + "CloudVPS": [ + { + "domain": "cloudvps.com", + "is_top": true + }, + { + "domain": "cloudvps.nl", + "is_top": true + } + ], + "Cloudbase Solutions": [ + { + "domain": "cloudbase.it", + "is_top": true + }, + { + "domain": "cloudbasesolutions.com", + "is_top": true + } + ], + "Cloudbau": [ + { + "domain": "cloudbau.de", + "is_top": true + } + ], + "Cloudera, Inc.": [ + { + "domain": "cloudera.com", + "is_top": true + } + ], + "Cloudian, Inc.": [ + { + "domain": "cloudian.com", + "is_top": true + } + ], + "Cloudscaling": [ + { + "domain": "cloudscaling.com", + "is_top": true + } + ], + "Cloudsmith Inc.": [ + { + "domain": "cloudsmith.com", + "is_top": true + } + ], + "Cloudwatt": [ + { + "domain": "cloudwatt.com", + "is_top": true + } + ], + "Cloudzilla": [ + { + "domain": "cloudzilla.com", + "is_top": true + } + ], + "Cluster Computing": [ + { + "domain": "clustcom.com", + "is_top": true + } + ], + "Cluster File Systems, Inc.": [ + { + "domain": "clusterfs.com", + "is_top": true + } + ], + "ClusterHQ": [ + { + "domain": "clusterhq.com", + "is_top": true + } + ], + "Code Aurora Forum": [ + { + "domain": "codeaurora.org", + "is_top": true + } + ], + "Code Lemon": [ + { + "domain": "codelemon.com", + "is_top": true + } + ], + "CodeSourcery": [ + { + "domain": "codesourcery.com", + "is_top": true + } + ], + "Codefidence": [ + { + "domain": "codefidence.com", + "is_top": true + } + ], + "Codethink": [ + { + "domain": "codethink.co.uk", + "is_top": true + } + ], + "Codetrails": [ + { + "domain": "codetrails.com", + "is_top": true + } + ], + "Codewise": [ + { + "domain": "codewise.com", + "is_top": true + } + ], + "Cogent.co Pty Ltd": [ + { + "domain": "cogent.co", + "is_top": true + } + ], + "Cognitree Technologies": [ + { + "domain": "cognitree.com", + "is_top": true + } + ], + "CohortFS, LLC": [ + { + "domain": "cohortfs.com", + "is_top": true + } + ], + "Coinapult": [ + { + "domain": "coinapult.com", + "is_top": true + } + ], + "Coinbase": [ + { + "domain": "coinbase.com", + "is_top": true + } + ], + "Coinfy ApS.": [ + { + "domain": "bips.me", + "is_top": true + } + ], + "Collabora": [ + { + "domain": "collabora.co.uk", + "is_top": true + }, + { + "domain": "collabora.com", + "is_top": true + } + ], + "Collax": [ + { + "domain": "collax.com", + "is_top": true + } + ], + "Collective Idea": [ + { + "domain": "inchworm.io", + "is_top": true + } + ], + "Columbia University": [ + { + "domain": "columbia.edu", + "is_top": true + } + ], + "ComSleep": [ + { + "domain": "comsleep.com", + "is_top": true + } + ], + "ComX Networks": [ + { + "domain": "comx.dk", + "is_top": true + } + ], + "Comcast": [ + { + "domain": "cable.comcast.com", + "is_top": true + }, + { + "domain": "comcast.com", + "is_top": true + }, + { + "domain": "comcast.net", + "is_top": true + } + ], + "Comindware Inc.": [ + { + "domain": "comindware.com", + "is_top": true + } + ], + "Commerce Guys": [ + { + "domain": "commerceguys.com", + "is_top": true + } + ], + "Commerce Technologies, Inc.": [ + { + "domain": "commercehub.com", + "is_top": true + } + ], + "Commonwealth Bank of Australia": [ + { + "domain": "cba.com.au", + "is_top": true + } + ], + "CompuLab": [ + { + "domain": "compulab.co.il", + "is_top": true + } + ], + "Comrex Corporation": [ + { + "domain": "comrex.com", + "is_top": true + } + ], + "Comtrade": [ + { + "domain": "comtrade.com", + "is_top": true + } + ], + "Consensys": [ + { + "domain": "consensys.net", + "is_top": true + } + ], + "ConSentry Networks": [ + { + "domain": "consentry.com", + "is_top": true + } + ], + "Concentris Systems": [ + { + "domain": "concentris-systems.com", + "is_top": true + } + ], + "Concurrent Computer Corporation": [ + { + "domain": "ccur.com", + "is_top": true + } + ], + "Conductor": [ + { + "domain": "conductor.com", + "is_top": true + } + ], + "Conectiva, Inc.": [ + { + "domain": "conectiva.com.br", + "is_top": true + } + ], + "Conexant Systems, Inc.": [ + { + "domain": "conexant.com", + "is_top": true + } + ], + "Confluent": [ + { + "domain": "confluent.io", + "is_top": true + } + ], + "Connectifier": [ + { + "domain": "connectifier.com", + "is_top": true + } + ], + "Connectify": [ + { + "domain": "connectify.me", + "is_top": true + } + ], + "Contec Steuerungstechnik & Automation": [ + { + "domain": "contec.at", + "is_top": true + } + ], + "Coraid": [ + { + "domain": "coraid.com", + "is_top": true + } + ], + "CoreOS, Inc.": [ + { + "domain": "coreos.com", + "is_top": true + } + ], + "Corelatus AB": [ + { + "domain": "corelatus.se", + "is_top": true + } + ], + "Corgan Labs": [ + { + "domain": "corganlabs.com", + "is_top": true + } + ], + "Cornelius Consult": [ + { + "domain": "cornelius-consult.de", + "is_top": true + } + ], + "Corscience GmbH": [ + { + "domain": "corscience.de", + "is_top": true + } + ], + "Corvisa, LLC": [ + { + "domain": "corvisa.com", + "is_top": true + } + ], + "Cosmosbay~Vectis": [ + { + "domain": "cosmosbay.com", + "is_top": true + } + ], + "Coursera Inc.": [ + { + "domain": "coursera.org", + "is_top": true + } + ], + "Cray": [ + { + "domain": "cray.com", + "is_top": true + } + ], + "Cruise": [ + { + "domain": "getcruise.com", + "is_top": true + } + ], + "Creative Product Design": [ + { + "domain": "cpdesign.com.au", + "is_top": true + } + ], + "Creative Technology": [ + { + "domain": "creative.com", + "is_top": true + }, + { + "domain": "creativelabs.com", + "is_top": true + } + ], + "Credit Mutuel Arkea": [ + { + "domain": "arkea.com", + "is_top": true + } + ], + "Creytiv.com": [ + { + "domain": "creytiv.com", + "is_top": true + } + ], + "Critical Link": [ + { + "domain": "criticallink.com", + "is_top": true + } + ], + "Critical Links": [ + { + "domain": "critical-links.com", + "is_top": true + } + ], + "Crossing-Tech SA": [ + { + "domain": "crossing-tech.com", + "is_top": true + } + ], + "Crunchy Data Solutions": [ + { + "domain": "crunchydatasolutions.com", + "is_top": true + } + ], + "Crystalfontz": [ + { + "domain": "crystalfontz.com", + "is_top": true + } + ], + "Ctrip": [ + { + "domain": "Ctrip.com", + "is_top": true + } + ], + "Cumulus Networks": [ + { + "domain": "cumulusnetworks.com", + "is_top": true + } + ], + "Curve Dental": [ + { + "domain": "curvedental.com", + "is_top": true + } + ], + "CyberGuard": [ + { + "domain": "cyberguard.com", + "is_top": true + } + ], + "CyberSwitching": [ + { + "domain": "cyberswitching.com", + "is_top": true + } + ], + "Cybera, Inc.": [ + { + "domain": "cybera.com", + "is_top": true + }, + { + "domain": "cybera.net", + "is_top": true + } + ], + "Cybernetics": [ + { + "domain": "cybernetics.com", + "is_top": true + } + ], + "Cypress Semiconductor": [ + { + "domain": "cypress.com", + "is_top": true + } + ], + "Cytronics & Melware": [ + { + "domain": "melware.de", + "is_top": true + } + ], + "DAVE Embedded Systems": [ + { + "domain": "dave.eu", + "is_top": true + } + ], + "DEK Tech.": [ + { + "domain": "dektech.com.au", + "is_top": true + } + ], + "DEKA Research and Development Corporation": [ + { + "domain": "dekaresearch.com", + "is_top": true + } + ], + "DENX Computer Systems": [ + { + "domain": "denx-cs.de", + "is_top": true + } + ], + "DENX Software Engineering": [ + { + "domain": "denx.de", + "is_top": true + } + ], + "DFKI": [ + { + "domain": "dfki.de", + "is_top": true + } + ], + "DKRZ": [ + { + "domain": "dkrz.de", + "is_top": true + } + ], + "DMP Electronics, Inc.": [ + { + "domain": "dmp.com.tw", + "is_top": true + } + ], + "DMX": [ + { + "domain": "dmx.com", + "is_top": true + } + ], + "DResearch": [ + { + "domain": "dresearch-fe.de", + "is_top": true + }, + { + "domain": "dresearch.de", + "is_top": true + } + ], + "DSO National Laboratories": [ + { + "domain": "dso.org.sg", + "is_top": true + } + ], + "DSPECIALISTS": [ + { + "domain": "dspecialists.de", + "is_top": true + } + ], + "DTI2": [ + { + "domain": "dti2.net", + "is_top": true + } + ], + "Dassault Syst\u00e8mes": [ + { + "domain": "3ds.com", + "is_top": true + }, + { + "domain": "exalead.com", + "is_top": true + } + ], + "DataLab": [ + { + "domain": "datalab.es", + "is_top": true + } + ], + "Databricks": [ + { + "domain": "databricks.com", + "is_top": true + } + ], + "Dawning": [ + { + "domain": "sugon.com", + "is_top": true + } + ], + "Day By Day": [ + { + "domain": "daybyday.nl", + "is_top": true + } + ], + "Debian GNU/Linux": [ + { + "domain": "debian.org", + "is_top": true + } + ], + "Defora OS": [ + { + "domain": "defora.org", + "is_top": true + } + ], + "Dell": [ + { + "domain": "dell.com", + "is_top": true + }, + { + "domain": "software.dell.com", + "is_top": true + } + ], + "Delta Electronics, Inc.": [ + { + "domain": "deltaww.com", + "is_top": true + } + ], + "Denali Systems": [ + { + "domain": "denali-systems.com", + "is_top": true + } + ], + "Densan": [ + { + "domain": "densan.co.jp", + "is_top": true + } + ], + "Depository Trust & Clearing Corporation": [ + { + "domain": "dtcc.com", + "is_top": true + } + ], + "Despegar.com, Inc.": [ + { + "domain": "despegar.com", + "is_top": true + } + ], + "Deutsche Telekom": [ + { + "domain": "telekom.com", + "is_top": true + }, + { + "domain": "telekom.de", + "is_top": true + } + ], + "Develtech": [ + { + "domain": "develtech.com", + "is_top": true + } + ], + "Devicescape": [ + { + "domain": "devicescape.com", + "is_top": true + } + ], + "Devoteam Group": [ + { + "domain": "devoteam.com", + "is_top": true + }, + { + "domain": "devoteam.es", + "is_top": true + } + ], + "Dexels": [ + { + "domain": "dexels.com", + "is_top": true + } + ], + "DiBcom": [ + { + "domain": "dibcom.fr", + "is_top": true + } + ], + "Dialog Semiconductor": [ + { + "domain": "dialog-semiconductor.com", + "is_top": true + }, + { + "domain": "diasemi.com", + "is_top": true + } + ], + "Diamond Light Source": [ + { + "domain": "diamond.ac.uk", + "is_top": true + } + ], + "Digi International": [ + { + "domain": "digi.com", + "is_top": true + } + ], + "Digia Plc": [ + { + "domain": "digia.com", + "is_top": true + } + ], + "Digigram": [ + { + "domain": "digigram.com", + "is_top": true + } + ], + "Digital Asset Holdings, LLC": [ + { + "domain": "digitalasset.com", + "is_top": true + } + ], + "Digital Design Corporation": [ + { + "domain": "digidescorp.com", + "is_top": true + } + ], + "Digital Devices GmbH": [ + { + "domain": "digitaldevices.de", + "is_top": true + } + ], + "Digital River, Inc.": [ + { + "domain": "digitalriver.com", + "is_top": true + } + ], + "Digium, Inc.": [ + { + "domain": "digium.com", + "is_top": true + } + ], + "Docker, Inc.": [ + { + "domain": "docker.com", + "is_top": true + } + ], + "Domicilium": [ + { + "domain": "domicilium.com", + "is_top": true + } + ], + "DornerWorks": [ + { + "domain": "dornerworks.com", + "is_top": true + } + ], + "Dor\u00e9Development": [ + { + "domain": "doredevelopment.dk", + "is_top": true + } + ], + "Douban": [ + { + "domain": "douban.com", + "is_top": true + } + ], + "Dresden University of Technology": [ + { + "domain": "tu-dresden.de", + "is_top": true + } + ], + "DreamHost": [ + { + "domain": "dreamhost.com", + "is_top": true + }, + { + "domain": "newdream.net", + "is_top": true + } + ], + "Dreamwidth Studios": [ + { + "domain": "dreamwidth.org", + "is_top": true + } + ], + "Drillinginfo": [ + { + "domain": "drillinginfo.com", + "is_top": true + } + ], + "DSR Corporation": [ + { + "domain": "dsr-corporation.com", + "is_top": true + }, + { + "domain": "dsr-company.com", + "is_top": true + } + ], + "E.G.O.": [ + { + "domain": "egoproducts.com", + "is_top": true + } + ], + "ECI Telecom": [ + { + "domain": "ecitele.com", + "is_top": true + } + ], + "EF Education": [ + { + "domain": "ef.com", + "is_top": true + } + ], + "EFJohnson Technologies": [ + { + "domain": "efjohnson.com", + "is_top": true + } + ], + "EIA Electronics NV": [ + { + "domain": "eia.be", + "is_top": true + } + ], + "EKE Group": [ + { + "domain": "ebts.fi", + "is_top": true + }, + { + "domain": "eke.fi", + "is_top": true + } + ], + "ELAN Microelectronics Corporation": [ + { + "domain": "emc.com.tw", + "is_top": true + } + ], + "Ellis and Associates": [ + { + "domain": "ellis-and-associates.com", + "is_top": true + } + ], + "ELPA": [ + { + "domain": "elpa.it", + "is_top": true + } + ], + "EMA Tech": [ + { + "domain": "ematech.fr", + "is_top": true + } + ], + "EMC": [ + { + "domain": "emc.com", + "is_top": true + } + ], + "EMS Thomas Wuensche": [ + { + "domain": "ems-wuensche.com", + "is_top": true + } + ], + "ENAC": [ + { + "domain": "enac.fr", + "is_top": true + } + ], + "ENEA AB": [ + { + "domain": "enea.com", + "is_top": true + } + ], + "ENS de Lyon": [ + { + "domain": "ens-lyon.eu", + "is_top": true + } + ], + "ENSI de Bourges": [ + { + "domain": "ensi-bourges.fr", + "is_top": true + } + ], + "EPAM Systems": [ + { + "domain": "epam.com", + "is_top": true + } + ], + "EQWARE Engineering": [ + { + "domain": "eqware.net", + "is_top": true + } + ], + "ESCRYPT GmbH": [ + { + "domain": "escrypt.com", + "is_top": true + } + ], + "ESD Electronics": [ + { + "domain": "esd-electronics.com", + "is_top": true + }, + { + "domain": "esd.eu", + "is_top": true + } + ], + "ETH Zurich": [ + { + "domain": "ethz.ch", + "is_top": true + } + ], + "EZchip Semiconductor, Ltd.": [ + { + "domain": "ezchip.com", + "is_top": true + } + ], + "EasyESI": [ + { + "domain": "easyesi.com", + "is_top": true + } + ], + "EasyStack": [ + { + "domain": "easystack.cn", + "is_top": true + } + ], + "Eaternity": [ + { + "domain": "eaternity.ch", + "is_top": true + } + ], + "Eclipse Foundation": [ + { + "domain": "eclipse.org", + "is_top": true + } + ], + "EclipseSource (See Innoopract)": [ + { + "domain": "eclipsesource.com", + "is_top": true + } + ], + "Ecole Polytechnique de Montreal": [ + { + "domain": "polymtl.ca", + "is_top": true + } + ], + "Edesix, Ltd.": [ + { + "domain": "edesix.com", + "is_top": true + } + ], + "Edinburgh Centre for Robotics": [ + { + "domain": "edinburgh-robotics.org", + "is_top": true + } + ], + "EfficiOS": [ + { + "domain": "efficios.com", + "is_top": true + } + ], + "Elan Digital Systems": [ + { + "domain": "elandigitalsystems.com", + "is_top": true + } + ], + "Elance, Inc.": [ + { + "domain": "elance.com", + "is_top": true + } + ], + "Elastic": [ + { + "domain": "elastic.co", + "is_top": true + }, + { + "domain": "elasticsearch.com", + "is_top": true + } + ], + "Elastic Path Software, Inc.": [ + { + "domain": "elasticpath.com", + "is_top": true + } + ], + "ElasticHosts, Ltd.": [ + { + "domain": "elastichosts.co.uk", + "is_top": true + }, + { + "domain": "elastichosts.com", + "is_top": true + } + ], + "Elbrys Networks": [ + { + "domain": "elbrys.com", + "is_top": true + } + ], + "Electronic Arts, Inc.": [ + { + "domain": "ea.com", + "is_top": true + } + ], + "Elemedia S.p.A.": [ + { + "domain": "katamail.com", + "is_top": true + } + ], + "Eleven Musicproduction GbR": [], + "Elitecore Technologies": [ + { + "domain": "elitecore.com", + "is_top": true + } + ], + "Elliptic Technologies": [ + { + "domain": "elliptictech.com", + "is_top": true + } + ], + "EmCraft Systems": [ + { + "domain": "emcraft.com", + "is_top": true + } + ], + "Embarcadero Technologies Inc.": [ + { + "domain": "embarcadero.com", + "is_top": true + } + ], + "Embedded Alley Solutions, Inc.": [ + { + "domain": "embeddedalley.com", + "is_top": true + } + ], + "Embedded Machine Technology Co.": [ + { + "domain": "ema-tech.com", + "is_top": true + } + ], + "Embedded Solutions, Ltd.": [ + { + "domain": "embedded-sol.com", + "is_top": true + } + ], + "Ember JS": [ + { + "domain": "emberjs.com", + "is_top": true + } + ], + "Embrane": [ + { + "domain": "embrane.com", + "is_top": true + } + ], + "Emerson": [ + { + "domain": "emerson.com", + "is_top": true + } + ], + "Empirix": [ + { + "domain": "empirix.com", + "is_top": true + } + ], + "Empolis Information Management GmbH": [ + { + "domain": "empolis.com", + "is_top": true + } + ], + "Emulex": [ + { + "domain": "emulex.com", + "is_top": true + } + ], + "Endian": [ + { + "domain": "endian.com", + "is_top": true + } + ], + "Endian Technologies": [ + { + "domain": "endian.se", + "is_top": true + } + ], + "Endrelia": [ + { + "domain": "endrelia.com", + "is_top": true + }, + { + "domain": "watchdogone.com", + "is_top": true + } + ], + "Endurance Wind Power": [ + { + "domain": "endurancewindpower.com", + "is_top": true + } + ], + "Enter": [ + { + "domain": "enter.it", + "is_top": true + } + ], + "Entropy Wave": [ + { + "domain": "entropywave.com", + "is_top": true + } + ], + "Epsilou Corporation": [ + { + "domain": "epsilou.com", + "is_top": true + } + ], + "Ericsson": [ + { + "domain": "ericsson.com", + "is_top": true + } + ], + "Escient": [ + { + "domain": "escient.com", + "is_top": true + } + ], + "Essensium": [ + { + "domain": "essensium.com", + "is_top": true + } + ], + "Essensium - Mind": [ + { + "domain": "mind.be", + "is_top": true + } + ], + "Etched Pixels Digital Design": [ + { + "domain": "etchedpixels.co.uk", + "is_top": true + } + ], + "Etersoft": [ + { + "domain": "etersoft.ru", + "is_top": true + } + ], + "Ethereum Foundation": [ + { + "domain": "ethdev.com", + "is_top": true + }, + { + "domain": "ethereum.org", + "is_top": true + } + ], + "Etish Limited": [], + "Etna": [ + { + "domain": "etna-alternance.net", + "is_top": true + } + ], + "Eucalyptus Systems, Inc.": [ + { + "domain": "eucalyptus.com", + "is_top": true + } + ], + "Eukrea Electromatique": [ + { + "domain": "eukrea.com", + "is_top": true + } + ], + "Eurek Elettronica": [ + { + "domain": "eurek.it", + "is_top": true + } + ], + "Eurogiciel": [ + { + "domain": "eurogiciel.fr", + "is_top": true + } + ], + "Eurotech, Ltd.": [ + { + "domain": "eurotech-ltd.co.uk", + "is_top": true + }, + { + "domain": "eurotech.com", + "is_top": true + } + ], + "Even Technologies, Inc.": [ + { + "domain": "eventechnologiesinc.com", + "is_top": true + } + ], + "Everbread Limited": [ + { + "domain": "everbread.com", + "is_top": true + } + ], + "Everlaw": [ + { + "domain": "everlaw.com", + "is_top": true + } + ], + "EverteQ": [ + { + "domain": "everteq.com", + "is_top": true + } + ], + "Evidence Srl": [ + { + "domain": "evidence.eu.com", + "is_top": true + } + ], + "Exar Corporation": [ + { + "domain": "exar.com", + "is_top": true + } + ], + "Exist Global": [ + { + "domain": "exist.com", + "is_top": true + } + ], + "Exosec": [ + { + "domain": "exosec.fr", + "is_top": true + } + ], + "Extreme Engineering Solutions": [ + { + "domain": "xes-inc.com", + "is_top": true + } + ], + "Eyeview, Inc.": [ + { + "domain": "eyeviewdigital.com", + "is_top": true + } + ], + "FGAN": [ + { + "domain": "fgan.de", + "is_top": true + } + ], + "FINN.no AS": [ + { + "domain": "finn.no", + "is_top": true + } + ], + "FIT": [ + { + "domain": "fit-tecnologia.org.br", + "is_top": true + } + ], + "FZI Forschungszentrum Informatik": [ + { + "domain": "fzi.de", + "is_top": true + } + ], + "Facebook": [ + { + "domain": "fb.com", + "is_top": true + } + ], + "Factor-SPE": [ + { + "domain": "nppfactor.kiev.ua", + "is_top": true + } + ], + "Fairfax Media": [ + { + "domain": "fairfaxmedia.com.au", + "is_top": true + } + ], + "Faraday Technology Corporation": [ + { + "domain": "faraday-tech.com", + "is_top": true + } + ], + "FastMail.FM": [], + "Fastpath Research": [ + { + "domain": "fastpath.it", + "is_top": true + } + ], + "FathomDB": [ + { + "domain": "fathomdb.com", + "is_top": true + } + ], + "Federal University of Campina Grande": [ + { + "domain": "ufcg.edu.br", + "is_top": true + } + ], + "Fermilab": [ + { + "domain": "fnal.gov", + "is_top": true + } + ], + "Fixstars Technologies": [ + { + "domain": "fixstars.com", + "is_top": true + } + ], + "Flickerbox, Inc.": [ + { + "domain": "flickerbox.com", + "is_top": true + } + ], + "Flipboard": [ + { + "domain": "flipboard.com", + "is_top": true + } + ], + "Flipkart": [ + { + "domain": "flipkart.com", + "is_top": true + } + ], + "Fon": [ + { + "domain": "fon.com", + "is_top": true + } + ], + "FOSSA": [ + { + "domain": "fossa.com", + "is_top": true + }, + { + "domain": "fossa.io", + "is_top": true + } + ], + "Fox-IT": [ + { + "domain": "fox-it.com", + "is_top": true + } + ], + "FractureCode Corporation": [ + { + "domain": "fracturecode.com", + "is_top": true + } + ], + "Fragnetics": [ + { + "domain": "fragnetics.com", + "is_top": true + } + ], + "Fraunhofer": [ + { + "domain": "fraunhofer.de", + "is_top": true + } + ], + "Fraunhofer FHR": [ + { + "domain": "fhr.fraunhofer.de", + "is_top": true + } + ], + "Fraunhofer FKIE": [ + { + "domain": "fkie.fraunhofer.de", + "is_top": true + } + ], + "Fraunhofer FOKUS": [ + { + "domain": "fokus.fraunhofer.de", + "is_top": true + } + ], + "Free Electrons": [ + { + "domain": "free-electrons.com", + "is_top": true + } + ], + "Free Software Foundation": [ + { + "domain": "fsf.org", + "is_top": true + } + ], + "Freebox": [ + { + "domain": "freebox.fr", + "is_top": true + } + ], + "Freescale": [ + { + "domain": "freescale.com", + "is_top": true + } + ], + "Freescale Semiconductor": [], + "Freicoin": [], + "Frequentis AG": [ + { + "domain": "frequentis.com", + "is_top": true + } + ], + "Fujitsu": [ + { + "domain": "cn.fujitsu.com", + "is_top": false + }, + { + "domain": "fujitsu.com", + "is_top": true + }, + { + "domain": "jp.fujitsu.com", + "is_top": false + } + ], + "Fujitsu Siemens": [ + { + "domain": "fujitsu-siemens.com", + "is_top": true + } + ], + "FullContact": [ + { + "domain": "fullcontact.com", + "is_top": true + } + ], + "Fullsix Group": [ + { + "domain": "fullsix.com", + "is_top": true + } + ], + "Fusion-io": [ + { + "domain": "fusionio.com", + "is_top": true + } + ], + "Future Technology Devices International": [ + { + "domain": "ftdichip.com", + "is_top": true + } + ], + "G.T.S. Srl": [ + { + "domain": "gts.it", + "is_top": true + } + ], + "GAMIC mbH": [ + { + "domain": "gamic.com", + "is_top": true + } + ], + "GE Intelligent Platforms": [ + { + "domain": "geautomation.com", + "is_top": true + }, + { + "domain": "gefanuc.com", + "is_top": true + } + ], + "GNU": [ + { + "domain": "gnu.org", + "is_top": true + } + ], + "GPLHost": [ + { + "domain": "gplhost.com", + "is_top": true + } + ], + "GVS": [ + { + "domain": "gvs.co.yu", + "is_top": true + } + ], + "Gaisler Research": [ + { + "domain": "gaisler.com", + "is_top": true + } + ], + "Galvanix": [ + { + "domain": "galvanix.com", + "is_top": true + } + ], + "GameServers.com": [ + { + "domain": "gameservers.com", + "is_top": true + } + ], + "GeNUA": [ + { + "domain": "genua.de", + "is_top": true + } + ], + "Geeknet, Inc.": [ + { + "domain": "geek.net", + "is_top": true + } + ], + "Genband": [ + { + "domain": "genband.com", + "is_top": true + } + ], + "General Aviation Safety Network": [ + { + "domain": "ga-safety.net", + "is_top": true + } + ], + "General Electric": [ + { + "domain": "ge.com", + "is_top": true + } + ], + "Gentoo Linux": [ + { + "domain": "gentoo.org", + "is_top": true + } + ], + "Genuitec, LLC": [ + { + "domain": "genuitec.com", + "is_top": true + } + ], + "Geomatys": [ + { + "domain": "geomatys.fr", + "is_top": true + } + ], + "Geometrics": [ + { + "domain": "geometrics.com", + "is_top": true + } + ], + "Georgia Tech Research Institute": [ + { + "domain": "gtri.gatech.edu", + "is_top": true + } + ], + "Geotechnologies, Inc.": [ + { + "domain": "geoteq.com", + "is_top": true + } + ], + "Getup Cloud": [ + { + "domain": "getupcloud.com", + "is_top": true + } + ], + "GigaSpaces": [ + { + "domain": "gigaspaces.com", + "is_top": true + } + ], + "Gik": [ + { + "domain": "gik.de", + "is_top": true + } + ], + "Gini": [ + { + "domain": "gini.net", + "is_top": true + } + ], + "Github": [ + { + "domain": "github.com", + "is_top": false + } + ], + "GitLab": [ + { + "domain": "gitlab.com", + "is_top": false + } + ], + "Gitter": [ + { + "domain": "gitter.im", + "is_top": true + } + ], + "Glass Expansion": [ + { + "domain": "geicp.com", + "is_top": true + } + ], + "Glencoe Software, Inc.": [ + { + "domain": "glencoesoftware.com", + "is_top": true + } + ], + "GlobalLogic": [ + { + "domain": "globallogic.com", + "is_top": true + } + ], + "Gluster, Inc.": [ + { + "domain": "gluster.com", + "is_top": true + }, + { + "domain": "zresearch.com", + "is_top": true + } + ], + "Go Daddy": [ + { + "domain": "godaddy.com", + "is_top": true + } + ], + "GoPivotal, Inc.": [], + "Gocept GmbH & Co. KG": [ + { + "domain": "gocept.com", + "is_top": true + } + ], + "Gold Circle": [ + { + "domain": "goldcircle.co.za", + "is_top": true + } + ], + "GoodData": [ + { + "domain": "gooddata.com", + "is_top": true + } + ], + "Google, Inc.": [ + { + "domain": "android.com", + "is_top": true + }, + { + "domain": "chrome.com", + "is_top": true + }, + { + "domain": "chromium.org", + "is_top": true + }, + { + "domain": "google.com", + "is_top": true + }, + { + "domain": "tensorflow.org", + "is_top": true + } + ], + "Gorilla Logic": [ + { + "domain": "gorillalogic.com", + "is_top": true + } + ], + "Graphcore": [ + { + "domain": "graphcore.ai", + "is_top": true + } + ], + "Grammer": [ + { + "domain": "eia.grammer.com", + "is_top": false + }, + { + "domain": "grammer.com", + "is_top": true + } + ], + "Grass Valley": [ + { + "domain": "grassvalley.com", + "is_top": true + } + ], + "Green Energy Corp.": [ + { + "domain": "greenenergycorp.com", + "is_top": true + } + ], + "Green Turtles Technologies": [ + { + "domain": "greenturtles.in", + "is_top": true + } + ], + "GreenAddress greenaddress.": [], + "Grid Dynamics": [ + { + "domain": "griddynamics.com", + "is_top": true + } + ], + "Grid Net": [ + { + "domain": "grid-net.com", + "is_top": true + } + ], + "GridApp Systems": [ + { + "domain": "gridapp.com", + "is_top": true + } + ], + "GridCentric": [ + { + "domain": "gridcentric.ca", + "is_top": true + } + ], + "Griffin INet": [ + { + "domain": "griffin.net", + "is_top": true + } + ], + "Grml": [ + { + "domain": "grml.org", + "is_top": true + } + ], + "Grupa WP": [ + { + "domain": "wp.pl", + "is_top": true + } + ], + "Guntermann & Drunck GmbH": [ + { + "domain": "gdsys.de", + "is_top": true + } + ], + "H&D Wireless AB": [ + { + "domain": "hd-wireless.se", + "is_top": true + } + ], + "HALE electronic GmbH": [ + { + "domain": "hale.at", + "is_top": true + } + ], + "HAProxy Technologies": [ + { + "domain": "exceliance.fr", + "is_top": true + }, + { + "domain": "haproxy.com", + "is_top": true + } + ], + "HCL": [ + { + "domain": "hcl.com", + "is_top": true + }, + { + "domain": "hcl.in", + "is_top": true + }, + { + "domain": "hcltech.com", + "is_top": true + } + ], + "HCL Technologies": [], + "HERMES SoftLab": [ + { + "domain": "hermes-softlab.com", + "is_top": true + } + ], + "HES-SO Valais Wallis": [ + { + "domain": "hevs.ch", + "is_top": true + } + ], + "HGST": [ + { + "domain": "hgst.com", + "is_top": true + } + ], + "HHTech Co.": [ + { + "domain": "hhcn.com", + "is_top": true + } + ], + "HP": [ + { + "domain": "cpqcorp.net", + "is_top": true + }, + { + "domain": "hp.com", + "is_top": true + }, + { + "domain": "hp.es", + "is_top": true + }, + { + "domain": "palm.com", + "is_top": true + } + ], + "HPE": [ + { + "domain": "hpe.com *", + "is_top": false + } + ], + "HV Sistemas": [ + { + "domain": "hvsistemas.es", + "is_top": true + } + ], + "Halon Security": [ + { + "domain": "halon.se", + "is_top": true + } + ], + "Habana": [ + { + "domain": "habana.ai", + "is_top": true + } + ], + "Happiest Minds Technologies": [ + { + "domain": "happiestminds.com", + "is_top": true + } + ], + "Harman/Becker Automotive Systems": [ + { + "domain": "harbaum.org", + "is_top": true + }, + { + "domain": "mybecker.com", + "is_top": true + } + ], + "Harris Corporation": [ + { + "domain": "harris.com", + "is_top": true + } + ], + "Hastexo": [ + { + "domain": "hastexo.com", + "is_top": true + } + ], + "Hatsize Learning Corporation": [ + { + "domain": "hatsize.com", + "is_top": true + } + ], + "Hauppauge": [ + { + "domain": "hauppauge.com", + "is_top": true + } + ], + "Heinrich-Heine-Universitat Dusseldorf": [ + { + "domain": "uniklinik-duesseldorf.de", + "is_top": true + } + ], + "Heroku": [ + { + "domain": "heroku.com", + "is_top": true + } + ], + "Hibernate": [ + { + "domain": "hibernate.org", + "is_top": true + } + ], + "HighPoint Technologies": [ + { + "domain": "highpoint-tech.com", + "is_top": true + } + ], + "Hitachi": [ + { + "domain": "hitachi.co.jp", + "is_top": true + }, + { + "domain": "hitachi.com", + "is_top": true + }, + { + "domain": "hitachiconsulting.com", + "is_top": true + }, + { + "domain": "hitachisoft.jp", + "is_top": true + } + ], + "Hitachi Data Systems": [ + { + "domain": "hds.com", + "is_top": true + } + ], + "Holosc\u00f3pio Tecnologia Ltda.": [ + { + "domain": "holoscopio.com", + "is_top": true + } + ], + "Hortonworks": [ + { + "domain": "hortonworks.com", + "is_top": true + } + ], + "Hostplex": [ + { + "domain": "hostplex.net", + "is_top": true + } + ], + "Hostway": [ + { + "domain": "hostway.com", + "is_top": true + } + ], + "Huawei": [ + { + "domain": "huawei.com", + "is_top": true + }, + { + "domain": "huawei.com]", + "is_top": true + }, + { + "domain": "huawei.com”", + "is_top": true + }, + { + "domain": "7huawei.com", + "is_top": true + }, + { + "domain": "hauwei.com", + "is_top": true + }, + { + "domain": "h-partners.com", + "is_top": true + }, + { + "domain": "hisilicon.com", + "is_top": true + }, + { + "domain": "ohos.com.cn", + "is_top": true + }, + { + "domain": "huawei-partners.com", + "is_top": true + }, + { + "domain": "huawe.com", + "is_top": true + }, + { + "domain": "notesmail.huawei.com", + "is_top": true + }, + { + "domain": "华huaweii.com", + "is_top": true + }, + { + "domain": "china.huawei.com", + "is_top": true + }, + { + "domain": "hhuawei.com", + "is_top": true + }, + { + "domain": "huawei", + "is_top": true + } + ], + "HubSpot": [ + { + "domain": "hubspot.com", + "is_top": true + } + ], + "Huron Technologies": [ + { + "domain": "hurontech.com", + "is_top": true + } + ], + "IAN Investments": [], + "IAV": [ + { + "domain": "iav.com", + "is_top": true + } + ], + "IBH SYSTEMS GmbH": [ + { + "domain": "ibh-systems.com", + "is_top": true + } + ], + "IBM": [ + { + "domain": "au1.ibm.com", + "is_top": false + }, + { + "domain": "br.ibm.com", + "is_top": false + }, + { + "domain": "ca.ibm.com", + "is_top": false + }, + { + "domain": "cn.ibm.com", + "is_top": false + }, + { + "domain": "de.ibm.com", + "is_top": false + }, + { + "domain": "ibm.com", + "is_top": true + }, + { + "domain": "il.ibm.com", + "is_top": false + }, + { + "domain": "in.ibm.com", + "is_top": false + }, + { + "domain": "linux.vnet.ibm.com", + "is_top": false + }, + { + "domain": "ozlabs.org", + "is_top": true + }, + { + "domain": "platform.com", + "is_top": true + }, + { + "domain": "us.ibm.com", + "is_top": false + } + ], + "IC Plus": [ + { + "domain": "icplus.com.tw", + "is_top": true + } + ], + "IFM Electronic": [ + { + "domain": "ifm.com", + "is_top": true + } + ], + "IFS Institut fur Software": [ + { + "domain": "isst.fraunhofer.de", + "is_top": true + } + ], + "IMC": [ + { + "domain": "imc-chicago.com", + "is_top": true + } + ], + "IMS Nanofabrication AG": [ + { + "domain": "ims.co.at", + "is_top": true + } + ], + "IMS Networks": [ + { + "domain": "e-teleport.net", + "is_top": true + }, + { + "domain": "imsnetworks.com", + "is_top": true + }, + { + "domain": "intermediasud.com", + "is_top": false + } + ], + "INOV": [ + { + "domain": "inov.pt", + "is_top": true + } + ], + "INRIA": [ + { + "domain": "inria.fr", + "is_top": true + } + ], + "INdT": [ + { + "domain": "indt.org", + "is_top": true + }, + { + "domain": "indt.org.br", + "is_top": true + } + ], + "IPAX": [ + { + "domain": "ipax.at", + "is_top": true + } + ], + "IPINYOU": [ + { + "domain": "ipinyou.com", + "is_top": true + } + ], + "IRAM": [ + { + "domain": "iram-institute.org", + "is_top": true + }, + { + "domain": "iram.es", + "is_top": true + }, + { + "domain": "iram.fr", + "is_top": true + } + ], + "ISEE": [ + { + "domain": "isee.biz", + "is_top": true + }, + { + "domain": "iseebcn.com", + "is_top": true + } + ], + "ISI": [ + { + "domain": "isi.edu", + "is_top": true + } + ], + "ISTI-CNR": [ + { + "domain": "isti.cnr.it", + "is_top": true + } + ], + "IT Offshore": [ + { + "domain": "it-offshore.co.uk", + "is_top": true + } + ], + "IT Refined": [ + { + "domain": "itrefined.com", + "is_top": true + } + ], + "ITHAKA": [ + { + "domain": "ithaka.org", + "is_top": true + } + ], + "ITT Corporation": [ + { + "domain": "itt.com", + "is_top": true + } + ], + "ITpearls AG": [ + { + "domain": "itpearls.com", + "is_top": true + } + ], + "IVITERA a.s.": [ + { + "domain": "ivitera.com", + "is_top": true + } + ], + "Ibrix": [ + { + "domain": "ibrix.com", + "is_top": true + } + ], + "Igalia S.L.": [ + { + "domain": "igalia.com", + "is_top": true + } + ], + "Imagination Technologies": [ + { + "domain": "imgtec.com", + "is_top": true + } + ], + "Immobilien Scout GmbH": [ + { + "domain": "immobilienscout24.de", + "is_top": true + } + ], + "In-Store Broadcasting Network": [ + { + "domain": "ibnads.com", + "is_top": true + }, + { + "domain": "instoreaudionetwork.com", + "is_top": true + } + ], + "InHand Electronics": [ + { + "domain": "inhand.com", + "is_top": true + } + ], + "Indian Institute of Science": [ + { + "domain": "iisc.ac.in", + "is_top": true + } + ], + "Intelligent Software Research Center": [ + { + "domain": "isrc.iscas.ac.cn", + "is_top": true + } + ], + "Include7": [ + { + "domain": "include7.ch", + "is_top": false + } + ], + "Indesign, LLC": [ + { + "domain": "indesign-llc.com", + "is_top": true + } + ], + "Individual": [], + "Industrial TSI": [ + { + "domain": "industrial-tsi.com", + "is_top": true + } + ], + "Inepro BV": [ + { + "domain": "inepro.com", + "is_top": true + } + ], + "Infinity Tracking Ltd": [ + { + "domain": "infinity-tracking.net", + "is_top": true + } + ], + "InfoObjects": [ + { + "domain": "infoobjects.com", + "is_top": true + } + ], + "Infochimps": [ + { + "domain": "infochimps.com", + "is_top": true + } + ], + "Infor": [ + { + "domain": "infor.com", + "is_top": true + } + ], + "Ingate Systems": [ + { + "domain": "ingate.com", + "is_top": true + } + ], + "Inktank": [ + { + "domain": "inktank.com", + "is_top": true + } + ], + "Innominate Security Technologies": [ + { + "domain": "innominate.com", + "is_top": true + } + ], + "Innoopract GmbH": [ + { + "domain": "innoopract.com", + "is_top": true + } + ], + "Innovative Systems": [ + { + "domain": "innovsys.com", + "is_top": true + }, + { + "domain": "sinnovsys.com", + "is_top": true + } + ], + "Inpun, LLC": [ + { + "domain": "inpun.by", + "is_top": true + } + ], + "Insignal Co.": [ + { + "domain": "insignal.co.kr", + "is_top": true + } + ], + "Institut des Nanotechnologies de Lyon": [ + { + "domain": "inl.fr", + "is_top": true + } + ], + "Institute for System Programming Russian Academy of Sciences": [ + { + "domain": "ispras.ru", + "is_top": true + } + ], + "Instituto de Pesquisas Eldorado": [ + { + "domain": "eldorado.org.br", + "is_top": true + } + ], + "Instrumentation Technologies": [ + { + "domain": "i-tech.si", + "is_top": true + } + ], + "Intalio Inc.": [ + { + "domain": "intalio.com", + "is_top": true + } + ], + "Integrated Device Technology": [ + { + "domain": "idt.com", + "is_top": true + } + ], + "Intel": [ + { + "domain": "intel.com", + "is_top": true + } + ], + "IntelliTree Solutions": [ + { + "domain": "intellitree.com", + "is_top": true + } + ], + "Interactive Intelligence, Inc.": [ + { + "domain": "inin.com", + "is_top": true + } + ], + "Internap": [ + { + "domain": "internap.com", + "is_top": true + } + ], + "International Telematics, Ltd.": [ + { + "domain": "itelematic.com", + "is_top": true + } + ], + "Internet Brands, Inc.": [ + { + "domain": "internetbrands.com", + "is_top": true + } + ], + "Intra2net AG": [ + { + "domain": "intra2net.com", + "is_top": true + } + ], + "Inuits": [ + { + "domain": "inuits.eu", + "is_top": true + } + ], + "Invisible Things Lab": [ + { + "domain": "invisiblethingslab.com", + "is_top": true + } + ], + "Ion Beam Applications": [ + { + "domain": "iba-group.com", + "is_top": true + }, + { + "domain": "iba-worldwide.com", + "is_top": true + } + ], + "Iron Systems, Inc.": [ + { + "domain": "ironsystems.com", + "is_top": true + } + ], + "Iroquio Systems": [ + { + "domain": "iroquoisystems.com", + "is_top": true + } + ], + "It Technology": [ + { + "domain": "holik.at", + "is_top": true + } + ], + "Ixia": [ + { + "domain": "ixiacom.com", + "is_top": true + } + ], + "Ixonos": [ + { + "domain": "ixonos.com", + "is_top": true + } + ], + "IzelTech": [ + { + "domain": "izeltech.com", + "is_top": true + } + ], + "JCZ-Automatisering": [ + { + "domain": "jcz.nl", + "is_top": true + } + ], + "JDA Software Group, Inc.": [ + { + "domain": "jda.com", + "is_top": true + } + ], + "JFrog Ltd": [ + { + "domain": "jfrog.com", + "is_top": true + } + ], + "JHU APL": [ + { + "domain": "jhuapl.edu", + "is_top": true + } + ], + "JPBerlin": [ + { + "domain": "jpberlin.de", + "is_top": true + } + ], + "Jazkarta": [ + { + "domain": "jazkarta.com", + "is_top": true + } + ], + "JiangSu Lemote Corporation": [ + { + "domain": "lemote.com", + "is_top": true + } + ], + "Jina AI": [ + { + "domain": "jina.ai", + "is_top": true + } + ], + "Jive Software": [ + { + "domain": "jivesoftware.com", + "is_top": true + } + ], + "Johns Hopkins University": [ + { + "domain": "jhu.edu", + "is_top": true + } + ], + "Jonathan DEKHTIAR": [ + { + "domain": "jonathandekhtiar.eu", + "is_top": true + } + ], + "Jotron Phontech": [ + { + "domain": "jotron.com", + "is_top": true + } + ], + "Jumpnow": [ + { + "domain": "jumpnowtek.com", + "is_top": true + } + ], + "Jungo Connectivity, Ltd.": [ + { + "domain": "jungo.com", + "is_top": true + } + ], + "Juniper": [ + { + "domain": "juniper.net", + "is_top": true + } + ], + "K Computing": [ + { + "domain": "kcomputing.com", + "is_top": true + } + ], + "KDE e.V.": [ + { + "domain": "kdemail.net", + "is_top": true + } + ], + "KFKI": [ + { + "domain": "kfki.hu", + "is_top": true + } + ], + "KPIT Technologies, Ltd.": [ + { + "domain": "kpit.com", + "is_top": true + }, + { + "domain": "kpitcummins.com", + "is_top": true + } + ], + "KT Corporation": [ + { + "domain": "kt.com", + "is_top": true + } + ], + "KTH Royal Institute of Technology": [ + { + "domain": "kth.se", + "is_top": true + } + ], + "KVH": [ + { + "domain": "kvhasia.com", + "is_top": true + } + ], + "Ka-Ro electronics GmbH": [ + { + "domain": "karo-electronics.de", + "is_top": true + } + ], + "Karlsruhe Institute of Technology": [ + { + "domain": "kit.edu", + "is_top": true + }, + { + "domain": "lists.kit.edu", + "is_top": false + } + ], + "Katalix Systems": [ + { + "domain": "katalix.com", + "is_top": true + } + ], + "Kedacom": [ + { + "domain": "kedacom.co", + "is_top": true + } + ], + "Keeper Technology": [ + { + "domain": "keepertech.com", + "is_top": true + } + ], + "Kentrox": [ + { + "domain": "kentrox.com", + "is_top": true + } + ], + "Kerlabs": [ + { + "domain": "kerlabs.com", + "is_top": true + } + ], + "Kernel Concepts": [ + { + "domain": "kernelconcepts.de", + "is_top": true + } + ], + "Kernel Labs, Inc.": [ + { + "domain": "kernellabs.com", + "is_top": true + } + ], + "Keymile AG": [ + { + "domain": "keymile.com", + "is_top": true + } + ], + "Kionix, Inc.": [ + { + "domain": "kionix.com", + "is_top": true + } + ], + "Klocwork": [ + { + "domain": "klocwork.com", + "is_top": true + } + ], + "Kloud": [ + { + "domain": "kloud.com.au", + "is_top": true + } + ], + "Knewton": [ + { + "domain": "knewton.com", + "is_top": true + } + ], + "KnowledgeTree": [ + { + "domain": "knowledgetree.com", + "is_top": true + } + ], + "Kolab Systems AG": [ + { + "domain": "kolabsystems.com", + "is_top": true + } + ], + "Kontron": [ + { + "domain": "kontron.com", + "is_top": true + } + ], + "Ksplice, Inc.": [ + { + "domain": "ksplice.com", + "is_top": true + } + ], + "KylinCloud": [ + { + "domain": "kylin-cloud.com", + "is_top": true + } + ], + "Lacuna": [ + { + "domain": "lacuna.ai", + "is_top": true + } + ], + "Lanzhou University": [ + { + "domain": "lzu.edu.cn", + "is_top": true + } + ], + "L&T Infotech": [ + { + "domain": "lntinfotech.com", + "is_top": true + } + ], + "LD DIDACTIC GmbH": [ + { + "domain": "ld-didactic.de", + "is_top": true + } + ], + "LG": [ + { + "domain": "lg.com", + "is_top": true + }, + { + "domain": "lge.com", + "is_top": true + } + ], + "LINBIT": [ + { + "domain": "linbit.com", + "is_top": true + } + ], + "LSD": [ + { + "domain": "lsbd.ufc.br", + "is_top": true + }, + { + "domain": "lsd.ufcg.edu.br", + "is_top": true + } + ], + "LSE Leading Security Experts GmbH": [ + { + "domain": "lsexperts.de", + "is_top": true + } + ], + "LSI Logic": [ + { + "domain": "lsi.com", + "is_top": true + }, + { + "domain": "lsil.com", + "is_top": true + } + ], + "LWN.net": [ + { + "domain": "lwn.net", + "is_top": true + } + ], + "La Honda Research": [ + { + "domain": "lahondaresearch.org", + "is_top": true + } + ], + "LaCie": [ + { + "domain": "lacie.com", + "is_top": true + } + ], + "Lafayette College": [ + { + "domain": "lafayette.edu", + "is_top": true + } + ], + "Lantiq": [ + { + "domain": "lantiq.com", + "is_top": true + } + ], + "Laurel Networks": [ + { + "domain": "laurelnetworks.com", + "is_top": true + } + ], + "Lavabit": [ + { + "domain": "lavabit.com", + "is_top": true + } + ], + "Lawrence Livermore National Laboratory": [ + { + "domain": "llnl.gov", + "is_top": true + } + ], + "Le laboratoire dinformatique interactive": [ + { + "domain": "lii-enac.fr", + "is_top": true + } + ], + "Lebanon Evangelical School": [ + { + "domain": "lesbg.com", + "is_top": true + } + ], + "Letv": [ + { + "domain": "letv.com", + "is_top": true + } + ], + "Lenovo": [ + { + "domain": "Lenovo.com", + "is_top": true + } + ], + "LiPPERT Embedded Computers GmbH": [ + { + "domain": "lippert-at.de", + "is_top": true + }, + { + "domain": "lippertembedded.de", + "is_top": true + } + ], + "Liaison Technologies": [ + { + "domain": "liaison.com", + "is_top": true + } + ], + "Liewenthal Electronics": [ + { + "domain": "liewenthal.ee", + "is_top": true + } + ], + "LinSysSoft Technologies": [ + { + "domain": "linsyssoft.com", + "is_top": true + } + ], + "Linagora": [ + { + "domain": "linagora.com", + "is_top": true + } + ], + "Linaro": [ + { + "domain": "linaro.org", + "is_top": true + } + ], + "LinkedIn": [ + { + "domain": "linkedin.com", + "is_top": true + } + ], + "Linux Foundation": [ + { + "domain": "linux-foundation.org", + "is_top": true + }, + { + "domain": "linuxfoundation.org", + "is_top": true + }, + { + "domain": "osdl.org", + "is_top": true + } + ], + "Linux Networx, Inc.": [ + { + "domain": "lnxi.com", + "is_top": true + } + ], + "LinuxBox.cz": [ + { + "domain": "linuxbox.cz", + "is_top": true + } + ], + "Linuxant": [ + { + "domain": "linuxant.com", + "is_top": true + } + ], + "LiteStack, Inc.": [ + { + "domain": "litestack.com", + "is_top": true + } + ], + "Litecoin": [ + { + "domain": "litecoin.org", + "is_top": true + } + ], + "LiveRamp": [ + { + "domain": "liveramp.com", + "is_top": true + } + ], + "LizardQ": [ + { + "domain": "lizardq.de", + "is_top": true + } + ], + "Loadbalancer.org": [ + { + "domain": "loadbalancer.org", + "is_top": true + } + ], + "Locaweb": [ + { + "domain": "locaweb.com.br", + "is_top": true + } + ], + "Lodgens": [ + { + "domain": "lodgens.com", + "is_top": true + } + ], + "Logic Supply": [ + { + "domain": "logicsupply.com", + "is_top": true + } + ], + "Logitech": [ + { + "domain": "logitech.com", + "is_top": true + } + ], + "London Internet Exchange": [ + { + "domain": "linx.net", + "is_top": true + } + ], + "Lookout, Inc.": [ + { + "domain": "lookout.com", + "is_top": true + } + ], + "Los Alamos National Lab": [ + { + "domain": "lanl.gov", + "is_top": true + } + ], + "LucidWorks": [ + { + "domain": "lucidworks.com", + "is_top": true + } + ], + "Lunds Universitet": [ + { + "domain": "control.lth.se", + "is_top": false + }, + { + "domain": "lth.se", + "is_top": true + } + ], + "Lyft": [ + { + "domain": "lyft.com", + "is_top": true + } + ], + "Lyrtech": [ + { + "domain": "lyrtech.com", + "is_top": true + } + ], + "Lyve Minds, Inc.": [ + { + "domain": "lyveminds.com", + "is_top": true + } + ], + "M&N Solutions": [ + { + "domain": "mn-solutions.de", + "is_top": true + } + ], + "M2R": [ + { + "domain": "m2r.biz", + "is_top": true + } + ], + "MACOM": [ + { + "domain": "macom.com", + "is_top": true + } + ], + "MESUTRONIC Ger\u00e4tebau GmbH": [ + { + "domain": "mesutronic.de", + "is_top": true + } + ], + "MEV Limited": [ + { + "domain": "mev.co.uk", + "is_top": true + } + ], + "MIPS Technologies, Inc.": [ + { + "domain": "mips.com", + "is_top": true + } + ], + "MIT": [ + { + "domain": "mit.edu", + "is_top": true + } + ], + "MIT Lincoln Laboratory": [ + { + "domain": "ll.mit.edu", + "is_top": true + } + ], + "MJS Gadgets": [ + { + "domain": "mjsgadgets.com", + "is_top": true + } + ], + "MM Solutions AD": [ + { + "domain": "mm-sol.com", + "is_top": true + } + ], + "MOD Systems": [ + { + "domain": "modsystems.com", + "is_top": true + } + ], + "MPC Data, Ltd.": [ + { + "domain": "mpc-data.co.uk", + "is_top": true + }, + { + "domain": "mpcdata.com", + "is_top": true + } + ], + "MRV Communications": [ + { + "domain": "mrv.com", + "is_top": true + } + ], + "MSC Open Source AB": [ + { + "domain": "mscopensource.se", + "is_top": true + } + ], + "MSC Technologies": [ + { + "domain": "exm32.com", + "is_top": true + }, + { + "domain": "msc-ge.com", + "is_top": true + }, + { + "domain": "msc-technologies.eu", + "is_top": true + } + ], + "MSys Technologies": [ + { + "domain": "msystechnologies.com", + "is_top": true + } + ], + "Macq Electronique": [ + { + "domain": "macqel.be", + "is_top": true + }, + { + "domain": "macqel.com", + "is_top": true + } + ], + "Magento Development": [ + { + "domain": "magento-development.com", + "is_top": true + } + ], + "Maginatics": [ + { + "domain": "maginatics.com", + "is_top": true + } + ], + "Mainpine": [ + { + "domain": "mainpine.com", + "is_top": true + } + ], + "Majitek": [ + { + "domain": "majitek.com", + "is_top": true + } + ], + "Managed IT": [ + { + "domain": "managedit.ie", + "is_top": true + } + ], + "Managed Security Services GmbH": [ + { + "domain": "mssgmbh.com", + "is_top": true + } + ], + "Mandriva": [ + { + "domain": "mandriva.com", + "is_top": true + }, + { + "domain": "mandriva.com.br", + "is_top": true + }, + { + "domain": "mandriva.org", + "is_top": true + } + ], + "MapR Technologies": [ + { + "domain": "maprtech.com", + "is_top": true + } + ], + "Marine Bridge & Navigation Systems": [ + { + "domain": "mns.spb.ru", + "is_top": true + } + ], + "Martinsson Elektronik AB": [ + { + "domain": "martinsson.se", + "is_top": true + } + ], + "Marvell": [ + { + "domain": "marvell.com", + "is_top": true + } + ], + "Matriks": [ + { + "domain": "matriksdata.com", + "is_top": true + } + ], + "Matrix Orbital": [ + { + "domain": "matrixorbital.ca", + "is_top": true + } + ], + "Matrix Vision": [ + { + "domain": "matrix-vision.com", + "is_top": true + }, + { + "domain": "matrix-vision.de", + "is_top": true + } + ], + "Matrox Graphics": [ + { + "domain": "matrox.com", + "is_top": true + } + ], + "Max-Planck-Institut for Astrophysics": [ + { + "domain": "mpg.de", + "is_top": true + } + ], + "MaxLinear": [ + { + "domain": "maxlinear.com", + "is_top": true + } + ], + "Maxim Integrated Products": [ + { + "domain": "maxim-ic.com", + "is_top": true + } + ], + "Maxtrack Industrial": [ + { + "domain": "maxtrack.com.br", + "is_top": true + } + ], + "McAfee": [ + { + "domain": "mcafee.com", + "is_top": true + }, + { + "domain": "snapgear.com", + "is_top": true + } + ], + "Medhost Inc.": [ + { + "domain": "medhost.com", + "is_top": true + } + ], + "Media Lab, Inc.": [ + { + "domain": "mlb.co.jp", + "is_top": true + } + ], + "MediaTek, Inc.": [ + { + "domain": "mediatek.com", + "is_top": true + } + ], + "Mediabistro Inc.": [ + { + "domain": "mediabistro.com", + "is_top": true + } + ], + "Mediana Technologies": [ + { + "domain": "medianatech.com", + "is_top": true + } + ], + "Medidata Solutions, Inc.": [ + { + "domain": "mdsol.com", + "is_top": true + } + ], + "Melexis NV": [ + { + "domain": "melexis.com", + "is_top": true + } + ], + "Mellanox Technologies": [ + { + "domain": "mellanox.co.il", + "is_top": true + }, + { + "domain": "mellanox.com", + "is_top": true + } + ], + "Memset": [ + { + "domain": "memset.com", + "is_top": true + } + ], + "Mentor Graphics": [ + { + "domain": "mentor.com", + "is_top": true + } + ], + "Mercury Development": [ + { + "domain": "mercdev.com", + "is_top": true + } + ], + "Mercury HMI, Ltd.": [ + { + "domain": "mercuryhmi.co.uk", + "is_top": true + }, + { + "domain": "mimc.co.uk", + "is_top": true + } + ], + "Meruvian": [ + { + "domain": "meruvian.com", + "is_top": true + } + ], + "MessageNet Systems": [ + { + "domain": "messagenetcommunicationsystems.com", + "is_top": true + }, + { + "domain": "messagenetsystems.com", + "is_top": true + } + ], + "Metacloud": [ + { + "domain": "metacloud.com", + "is_top": true + } + ], + "Metamarkets Group": [ + { + "domain": "metamarkets.com", + "is_top": true + } + ], + "Meteor": [ + { + "domain": "meteor.ie", + "is_top": true + } + ], + "Meteor Development Group": [ + { + "domain": "meteor.com", + "is_top": true + } + ], + "Metzler Brothers Systementwicklung GbR": [ + { + "domain": "metzlerbros.de", + "is_top": true + } + ], + "MiTAC": [ + { + "domain": "mitac.com", + "is_top": true + } + ], + "Micrel, Inc.": [ + { + "domain": "micrel.com", + "is_top": true + } + ], + "Micro-Star International": [ + { + "domain": "msi.com", + "is_top": true + }, + { + "domain": "msi.com.tw", + "is_top": true + } + ], + "MicroGate Systems": [ + { + "domain": "microgate.com", + "is_top": true + } + ], + "Microbit": [ + { + "domain": "microbit.se", + "is_top": true + } + ], + "Microchip Technology, Inc.": [ + { + "domain": "microchip.com", + "is_top": true + } + ], + "Micromodicom": [ + { + "domain": "micromodi.com", + "is_top": true + } + ], + "Micron": [ + { + "domain": "micron.com", + "is_top": true + } + ], + "Microsoft": [ + { + "domain": "microsoft.com", + "is_top": true + } + ], + "Midokura": [ + { + "domain": "midokura.com", + "is_top": true + }, + { + "domain": "midokura.jp", + "is_top": true + } + ], + "MikroTik": [ + { + "domain": "mikrotik.com", + "is_top": true + } + ], + "Millicom": [ + { + "domain": "millicom.com", + "is_top": true + } + ], + "Mindbit": [ + { + "domain": "mindbit.ro", + "is_top": true + } + ], + "Mindspeed Technologies": [ + { + "domain": "mindspeed.com", + "is_top": true + } + ], + "Miracle Linux": [ + { + "domain": "miraclelinux.com", + "is_top": true + } + ], + "Mirantis": [ + { + "domain": "mirantis.com", + "is_top": true + } + ], + "Miromico": [ + { + "domain": "miromico.ch", + "is_top": true + } + ], + "Missing Link Electronics": [ + { + "domain": "missinglinkelectronics.com", + "is_top": true + } + ], + "Mistral Solutions": [ + { + "domain": "mistralsolutions.com", + "is_top": true + } + ], + "Mitel": [ + { + "domain": "es.mitel.com", + "is_top": false + }, + { + "domain": "mitel.com", + "is_top": true + } + ], + "Mobile Devices Ingenierie": [ + { + "domain": "mobile-devices.com", + "is_top": true + } + ], + "Mocean Labs": [ + { + "domain": "mocean-labs.com", + "is_top": true + } + ], + "Modern Technologies Inc.": [ + { + "domain": "mti.ag", + "is_top": true + } + ], + "ModpoW": [ + { + "domain": "modpow.es", + "is_top": true + } + ], + "Mojain": [ + { + "domain": "mojain.com", + "is_top": true + } + ], + "Molecular Discovery, Ltd.": [ + { + "domain": "moldiscovery.com", + "is_top": true + } + ], + "MomentumSI": [ + { + "domain": "momentumsi.com", + "is_top": true + } + ], + "Monax": [ + { + "domain": "monax.io", + "is_top": true + } + ], + "MontaVista": [ + { + "domain": "mvista.com", + "is_top": true + } + ], + "Montages AG": [ + { + "domain": "montages.com", + "is_top": true + } + ], + "Morphlabs": [ + { + "domain": "morphlabs.com", + "is_top": true + } + ], + "Mortar": [ + { + "domain": "mortardata.com", + "is_top": true + } + ], + "Motorola": [ + { + "domain": "motorola.com", + "is_top": true + } + ], + "Movial": [ + { + "domain": "movial.com", + "is_top": true + }, + { + "domain": "movial.fi", + "is_top": true + } + ], + "Mozilla Corporation": [ + { + "domain": "mozilla.org", + "is_top": true + }, + { + "domain": "mozilla.com", + "is_top": true + } + ], + "MtekVision Corporation": [ + { + "domain": "mtekvision.com", + "is_top": true + } + ], + "MuleSoft, Inc.": [ + { + "domain": "mulesoft.com", + "is_top": true + } + ], + "MyNET": [ + { + "domain": "mynet.at", + "is_top": true + } + ], + "Myricom": [ + { + "domain": "myri.com", + "is_top": true + } + ], + "NASA": [ + { + "domain": "nasa.gov", + "is_top": true + } + ], + "Nankai University": [ + { + "domain": "mail.nankai.edu.cn", + "is_top": true + } + ], + "NEC": [ + { + "domain": "az.jp.nec.com", + "is_top": false + }, + { + "domain": "bu.jp.nec.com", + "is_top": false + }, + { + "domain": "cq.jp.nec.com", + "is_top": false + }, + { + "domain": "da.jp.nec.com", + "is_top": false + }, + { + "domain": "mxk.nes.nec.co.jp", + "is_top": false + }, + { + "domain": "mxs.nes.nec.co.jp", + "is_top": false + }, + { + "domain": "nec-labs.com", + "is_top": false + }, + { + "domain": "nec.co.jp", + "is_top": true + }, + { + "domain": "nec.com", + "is_top": true + }, + { + "domain": "necel.com", + "is_top": true + }, + { + "domain": "necst.nec.co.jp", + "is_top": false + }, + { + "domain": "nectechnologies.in", + "is_top": true + } + ], + "NETASQ": [ + { + "domain": "netasq.com", + "is_top": true + } + ], + "NIIF Institute": [ + { + "domain": "niif.hu", + "is_top": true + } + ], + "Ningbo University": [ + { + "domain": "nbu.edu.cn", + "is_top": true + } + ], + "Nicolas Hug": [ + { + "domain": "nicolas-hug.com", + "is_top": true + } + ], + "NIISI RAS": [ + { + "domain": "niisi.ru", + "is_top": true + } + ], + "NIST": [ + { + "domain": "nist.gov", + "is_top": true + } + ], + "NPR": [ + { + "domain": "npr.org", + "is_top": true + } + ], + "NREL": [ + { + "domain": "nrel.gov", + "is_top": true + } + ], + "NTT": [ + { + "domain": "intellilink.co.jp", + "is_top": true + }, + { + "domain": "lab.ntt.co.jp", + "is_top": false + }, + { + "domain": "ntt.co.jp", + "is_top": true + }, + { + "domain": "ntt.com", + "is_top": true + }, + { + "domain": "nttmcl.com", + "is_top": true + }, + { + "domain": "ntts.co.jp", + "is_top": true + }, + { + "domain": "po.ntts.co.jp", + "is_top": false + }, + { + "domain": "vertex.co.in", + "is_top": true + } + ], + "NTT Data": [ + { + "domain": "nttdata.co.jp", + "is_top": true + }, + { + "domain": "nttdata.com", + "is_top": true + } + ], + "NUXEO": [ + { + "domain": "nuxeo.com", + "is_top": true + } + ], + "NVidia": [ + { + "domain": "nvidia.com", + "is_top": true + } + ], + "NXP": [ + { + "domain": "nxp.com", + "is_top": true + } + ], + "Nagravision": [ + { + "domain": "dtv.nagra.com", + "is_top": false + }, + { + "domain": "nagra.com", + "is_top": true + } + ], + "NameSys": [ + { + "domain": "namesys.com", + "is_top": true + } + ], + "Nanometrics": [ + { + "domain": "nanometrics.ca", + "is_top": true + } + ], + "National Center for Biotechnology Information": [ + { + "domain": "ncbi.nlm.nih.gov", + "is_top": true + } + ], + "National Electronics and Computer Technology Center": [ + { + "domain": "nectec.or.th", + "is_top": true + } + ], + "National ICT Australia": [ + { + "domain": "nicta.com.au", + "is_top": true + } + ], + "National Institute of Advanced Industrial Science and Technology": [ + { + "domain": "aist.go.jp", + "is_top": true + } + ], + "National Instruments": [ + { + "domain": "ni.com", + "is_top": true + } + ], + "National University of Defense Technology": [ + { + "domain": "nudt.edu.cn", + "is_top": true + } + ], + "Navman Wireless": [ + { + "domain": "navmanwireless.com", + "is_top": true + } + ], + "NeCTAR": [ + { + "domain": "nectar.org.au", + "is_top": true + } + ], + "Nebula, Inc.": [ + { + "domain": "nebula.com", + "is_top": true + } + ], + "Neotion": [ + { + "domain": "neotion.com", + "is_top": true + } + ], + "New York University": [ + { + "domain": "nyu.edu", + "is_top": true + } + ], + "Neratec Solutions": [ + { + "domain": "neratec.com", + "is_top": true + } + ], + "NerdKits": [ + { + "domain": "nerdkits.com", + "is_top": true + } + ], + "Net Insight": [ + { + "domain": "netinsight.net", + "is_top": true + } + ], + "NetApp": [ + { + "domain": "netapp.com", + "is_top": true + } + ], + "NetBSD Foundation, Inc.": [ + { + "domain": "netbsd.org", + "is_top": true + } + ], + "NetEase": [ + { + "domain": "corp.netease.com", + "is_top": false + }, + { + "domain": "netease.com", + "is_top": true + } + ], + "NetEffects, Inc.": [ + { + "domain": "neteffects.com", + "is_top": true + } + ], + "NetLogic Microsystems": [ + { + "domain": "netlogicmicro.com", + "is_top": true + } + ], + "NetOne": [ + { + "domain": "etone.co.jp", + "is_top": true + } + ], + "NetSpectrum": [ + { + "domain": "netspectrum.ca", + "is_top": true + }, + { + "domain": "netspectrum.com", + "is_top": true + } + ], + "NetUP": [ + { + "domain": "netup.ru", + "is_top": true + } + ], + "NetXen": [ + { + "domain": "netxen.com", + "is_top": true + } + ], + "Neterion": [ + { + "domain": "neterion.com", + "is_top": true + } + ], + "Neterra": [ + { + "domain": "neterra.net", + "is_top": true + }, + { + "domain": "neterra.tv", + "is_top": true + } + ], + "Netflix": [ + { + "domain": "corp.netflix.com", + "is_top": false + }, + { + "domain": "netflix.com", + "is_top": true + } + ], + "Netronome Systems": [ + { + "domain": "netronome.com", + "is_top": true + } + ], + "Netservers, Ltd.": [ + { + "domain": "netservers.co.uk", + "is_top": true + } + ], + "Netstal-Maschinen AG": [ + { + "domain": "netstal.com", + "is_top": true + } + ], + "Nexenta": [ + { + "domain": "nexenta.com", + "is_top": false + } + ], + "Nexeya": [ + { + "domain": "nexeya.com", + "is_top": true + }, + { + "domain": "nexeya.fr", + "is_top": true + } + ], + "Nexor Limited": [ + { + "domain": "nexor.com", + "is_top": true + } + ], + "NextIO": [ + { + "domain": "nextio.com", + "is_top": true + } + ], + "Nexus": [ + { + "domain": "nexusis.com", + "is_top": true + } + ], + "Nias Digital": [ + { + "domain": "niasdigital.com", + "is_top": true + } + ], + "Nicira": [ + { + "domain": "nicira.com", + "is_top": true + } + ], + "Nike, Inc.": [ + { + "domain": "nike.com", + "is_top": true + } + ], + "Nimag Networks": [ + { + "domain": "nimag.net", + "is_top": true + } + ], + "Nimbis Services": [ + { + "domain": "nimbisservices.com", + "is_top": true + } + ], + "NimbleStorage": [ + { + "domain": "nimblestorage.com", + "is_top": true + } + ], + "Ninki": [ + { + "domain": "ninkip2p.com", + "is_top": true + } + ], + "Nokia": [ + { + "domain": "nokia.com", + "is_top": true + } + ], + "Nokia Networks": [ + { + "domain": "networks.nokia.com", + "is_top": true + }, + { + "domain": "nsn.com", + "is_top": true + } + ], + "Nomad Global Communication Solutions": [ + { + "domain": "nomadgcs.com", + "is_top": true + }, + { + "domain": "nomadgs.com", + "is_top": true + } + ], + "Nomadio": [ + { + "domain": "nomadio.net", + "is_top": true + } + ], + "Nomovok, Ltd.": [ + { + "domain": "nomovok.com", + "is_top": true + } + ], + "Norbit": [ + { + "domain": "norbit.no", + "is_top": true + } + ], + "Nortel": [ + { + "domain": "nortel.com", + "is_top": true + } + ], + "North University of China": [ + { + "domain": "nuc.edu.cn", + "is_top": true + } + ], + "Northern Digital, Inc.": [ + { + "domain": "ndigital.com", + "is_top": true + } + ], + "Norwegian Air Shuttle ASA": [ + { + "domain": "norwegian.no", + "is_top": true + } + ], + "Notal Vision, Inc.": [ + { + "domain": "foreseehome.com", + "is_top": true + }, + { + "domain": "notalvision.com", + "is_top": true + } + ], + "Nouva Systems": [ + { + "domain": "nuovasystems.com", + "is_top": true + } + ], + "Novatel Wireless": [ + { + "domain": "nvtl.com", + "is_top": true + } + ], + "Novell": [ + { + "domain": "novell.com", + "is_top": true + } + ], + "Nuage Networks": [ + { + "domain": "nuagenetworks.net", + "is_top": true + } + ], + "Numascale": [ + { + "domain": "numascale.com", + "is_top": true + } + ], + "Numergy": [ + { + "domain": "numergy.com", + "is_top": true + } + ], + "Numlog": [ + { + "domain": "numlog.fr", + "is_top": true + } + ], + "Nuovations": [ + { + "domain": "nuovations.com", + "is_top": true + } + ], + "Nutaq": [ + { + "domain": "nutaq.com", + "is_top": true + } + ], + "Nuvoton Technology": [ + { + "domain": "nuvoton.com", + "is_top": true + } + ], + "O.S. Systems": [ + { + "domain": "ossystems.com.br", + "is_top": true + } + ], + "OBEO": [ + { + "domain": "obeo.fr", + "is_top": true + } + ], + "OCTO Technology": [ + { + "domain": "octo.com", + "is_top": true + } + ], + "OKTET Labs": [ + { + "domain": "oktetlabs.ru", + "is_top": true + } + ], + "OLPC": [ + { + "domain": "laptop.org", + "is_top": true + } + ], + "OMICRON Electronics": [ + { + "domain": "omicron.at", + "is_top": true + } + ], + "ONELAN": [ + { + "domain": "onelan.co.uk", + "is_top": true + }, + { + "domain": "onelan.com", + "is_top": true + } + ], + "ONERA": [ + { + "domain": "onera.fr", + "is_top": true + } + ], + "ONstor": [ + { + "domain": "onstor.com", + "is_top": true + } + ], + "OODrive": [ + { + "domain": "oodrive.com", + "is_top": true + } + ], + "ORSoC": [ + { + "domain": "orsoc.se", + "is_top": true + } + ], + "OSADL": [ + { + "domain": "osadl.org", + "is_top": true + } + ], + "OSDN": [ + { + "domain": "osdn.jp", + "is_top": true + } + ], + "OVH": [ + { + "domain": "ovh.net", + "is_top": true + } + ], + "Oak Ridge National Laboratory": [ + { + "domain": "ornl.gov", + "is_top": true + } + ], + "Oberthur Technologies": [ + { + "domain": "oberthur.com", + "is_top": true + } + ], + "Objectif-libre": [ + { + "domain": "objectif-libre.com", + "is_top": true + } + ], + "Observision": [ + { + "domain": "observision.com", + "is_top": true + } + ], + "Obsidian Research": [ + { + "domain": "obsidianresearch.com", + "is_top": true + } + ], + "Ocado": [ + { + "domain": "ocado.com", + "is_top": true + } + ], + "Oculus": [ + { + "domain": "oculus.com", + "is_top": true + } + ], + "Octant Informatique": [ + { + "domain": "octant-fr.com", + "is_top": false + }, + { + "domain": "octant.org", + "is_top": true + } + ], + "Octasic Semiconductor": [ + { + "domain": "octasic.com", + "is_top": true + } + ], + "Oc\u00e9 Technologies": [ + { + "domain": "oce.com", + "is_top": true + } + ], + "Oki Semiconductor": [ + { + "domain": "okisemi.com", + "is_top": true + } + ], + "Oklahoma State University": [ + { + "domain": "okstate.edu", + "is_top": true + } + ], + "OnLive": [ + { + "domain": "onlive.com", + "is_top": true + } + ], + "OnTheNet Pty, Ltd.": [ + { + "domain": "onthe.net.au", + "is_top": true + } + ], + "One Technologies, L.P.": [ + { + "domain": "onetechnologies.net", + "is_top": true + } + ], + "One.com": [ + { + "domain": "one.com", + "is_top": true + } + ], + "OneScreen Inc": [ + { + "domain": "onescreen.com", + "is_top": true + } + ], + "Onyx Neon": [ + { + "domain": "onyxneon.com", + "is_top": true + } + ], + "Onyx Point, Inc.": [ + { + "domain": "onyxpoint.com", + "is_top": true + } + ], + "Ooyala, Inc.": [ + { + "domain": "ooyala.com", + "is_top": true + } + ], + "OpCoach": [ + { + "domain": "opcoach.com", + "is_top": true + } + ], + "Open Grid Computing": [ + { + "domain": "ogc.us", + "is_top": true + }, + { + "domain": "opengridcomputing.com", + "is_top": true + } + ], + "Open Nandra": [ + { + "domain": "open-nandra.com", + "is_top": true + } + ], + "OpenBOSSA": [ + { + "domain": "openbossa.org", + "is_top": true + } + ], + "OpenBSD": [ + { + "domain": "openbsd.org", + "is_top": true + } + ], + "OpenNebula Systems S.L.": [ + { + "domain": "c12g.com", + "is_top": true + }, + { + "domain": "opennebula.systems", + "is_top": true + } + ], + "OpenStack Foundation": [ + { + "domain": "openstack.org", + "is_top": true + } + ], + "OpenedHand": [ + { + "domain": "openedhand.com", + "is_top": true + } + ], + "Openwall": [ + { + "domain": "openwall.com", + "is_top": true + } + ], + "Opower": [ + { + "domain": "opower.com", + "is_top": true + } + ], + "Optiflows": [ + { + "domain": "optiflows.com", + "is_top": true + } + ], + "Option Wireless Technology": [ + { + "domain": "option.com", + "is_top": true + } + ], + "Optiver": [ + { + "domain": "optiver.com", + "is_top": true + } + ], + "Oracle": [ + { + "domain": "oracle.com", + "is_top": true + } + ], + "Orange": [ + { + "domain": "orange.com", + "is_top": true + } + ], + "Orbitz, LLC": [ + { + "domain": "orbitz.com", + "is_top": true + } + ], + "Osones": [ + { + "domain": "osones.com", + "is_top": true + } + ], + "Outpost Embedded": [ + { + "domain": "outpostembedded.com", + "is_top": true + }, + { + "domain": "rapidrollout.com", + "is_top": true + } + ], + "Overstock": [ + { + "domain": "overstock.com", + "is_top": true + } + ], + "Oxilion": [ + { + "domain": "oxilion.nl", + "is_top": true + } + ], + "PA Semi Corporation": [ + { + "domain": "pasemi.com", + "is_top": true + } + ], + "PCS Systemtechnik": [ + { + "domain": "pcs.com", + "is_top": true + }, + { + "domain": "pcs.de", + "is_top": true + } + ], + "PCSol": [ + { + "domain": "pcsol.be", + "is_top": true + } + ], + "PHYTEC Messtechnik GmbH": [ + { + "domain": "phytec.de", + "is_top": true + } + ], + "PIAP": [ + { + "domain": "piap.pl", + "is_top": true + } + ], + "PIKA Technologies": [ + { + "domain": "pikatech.com", + "is_top": true + } + ], + "PLUMgrid": [ + { + "domain": "plumgrid.com", + "is_top": true + } + ], + "PLX Technology, Inc.": [ + { + "domain": "plxtech.com", + "is_top": true + } + ], + "PMC-Sierra": [ + { + "domain": "pmc-sierra.com", + "is_top": true + } + ], + "PRESENSE Technologies": [ + { + "domain": "pre-sense.de", + "is_top": true + } + ], + "PROMISE Technology, Inc.": [ + { + "domain": "promise.com", + "is_top": true + } + ], + "PROS, Inc.": [ + { + "domain": "pros.com", + "is_top": true + } + ], + "PWC Avis": [ + { + "domain": "pwcavis.sk", + "is_top": true + } + ], + "PWI North": [ + { + "domain": "pwienterprises.com", + "is_top": true + } + ], + "Pacific Northwest National Laboratory": [ + { + "domain": "pnl.gov", + "is_top": true + }, + { + "domain": "pnnl.gov", + "is_top": true + } + ], + "Pagero AB": [ + { + "domain": "pagero.com", + "is_top": true + } + ], + "Palantir Technologies": [ + { + "domain": "palantir.com", + "is_top": true + } + ], + "Panasas": [ + { + "domain": "panasas.com", + "is_top": true + } + ], + "Panasonic": [ + { + "domain": "panasonic.com", + "is_top": true + } + ], + "PaperCut Software": [ + { + "domain": "papercut.biz", + "is_top": true + }, + { + "domain": "papercut.com", + "is_top": true + } + ], + "Parallels": [ + { + "domain": "openvz.org", + "is_top": true + }, + { + "domain": "parallels.com", + "is_top": true + }, + { + "domain": "sw.ru", + "is_top": true + }, + { + "domain": "swsoft.com", + "is_top": true + } + ], + "Pardus": [ + { + "domain": "pardus.org.tr", + "is_top": true + } + ], + "Parkeon": [ + { + "domain": "parkeon.com", + "is_top": true + } + ], + "Parrot SA": [ + { + "domain": "parrot.com", + "is_top": true + } + ], + "Pavlinux, Inc.": [ + { + "domain": "pavlinux.ru", + "is_top": true + } + ], + "PayPal": [ + { + "domain": "paypal.com", + "is_top": true + } + ], + "Pearson Education, Inc.": [ + { + "domain": "ecollege.com", + "is_top": true + } + ], + "Pengcheng Laboratory": [ + { + "domain": "pcl.ac.cn", + "is_top": true + } + ], + "Peking University Microprocessor R&D Center": [ + { + "domain": "mprc.pku.edu.cn", + "is_top": true + } + ], + "Pelagicore AB": [ + { + "domain": "pelagicore.com", + "is_top": true + } + ], + "Pengutronix": [ + { + "domain": "pengutronix.de", + "is_top": true + } + ], + "Percona": [ + { + "domain": "percona.com", + "is_top": true + } + ], + "Persistent": [ + { + "domain": "persistent.co.in", + "is_top": true + } + ], + "PetaLogix": [ + { + "domain": "petalogix.com", + "is_top": true + } + ], + "Phase2": [ + { + "domain": "phase2technology.com", + "is_top": true + } + ], + "Philipps-Universit\u00e4t Marburg": [ + { + "domain": "mathematik.uni-marburg.de", + "is_top": false + }, + { + "domain": "uni-marburg.de", + "is_top": true + } + ], + "Philosys Software": [ + { + "domain": "philosys.de", + "is_top": true + } + ], + "Phoenix Technologies": [ + { + "domain": "phoenix.com", + "is_top": true + } + ], + "Photobucket, Inc.": [ + { + "domain": "photobucket.com", + "is_top": true + } + ], + "PiKRON s.r.o": [ + { + "domain": "pikron.com", + "is_top": true + } + ], + "Piston Cloud Computing": [ + { + "domain": "pistoncloud.com", + "is_top": true + } + ], + "Pitney Bowes": [ + { + "domain": "pitneybowes.com", + "is_top": true + } + ], + "Pivotal": [ + { + "domain": "gopivotal.com", + "is_top": true + }, + { + "domain": "pivotal.io", + "is_top": true + } + ], + "Pixart SRL": [ + { + "domain": "pixartargentina.com.ar", + "is_top": true + } + ], + "PingCAP": [ + { + "domain": "pingcap.com", + "is_top": true + } + ], + "Plan Group": [ + { + "domain": "plan-group.com", + "is_top": true + } + ], + "Planet Labs": [ + { + "domain": "planet.com", + "is_top": true + } + ], + "Planon": [ + { + "domain": "planonsoftware.com", + "is_top": true + } + ], + "Plugable Technologies": [ + { + "domain": "plugable.com", + "is_top": true + } + ], + "Pogoapp": [ + { + "domain": "pogoapp.com", + "is_top": true + } + ], + "Politecnico di Milano": [ + { + "domain": "mail.polimi.it", + "is_top": true + } + ], + "Posteo": [ + { + "domain": "posteo.de", + "is_top": true + } + ], + "PolyBeacon, Inc.": [ + { + "domain": "polybeacon.com", + "is_top": true + } + ], + "Polycom": [ + { + "domain": "polycom.com", + "is_top": true + } + ], + "Preferred Networks": [ + { + "domain": "preferred.jp", + "is_top": true + } + ], + "Prevas": [ + { + "domain": "prevas.dk", + "is_top": true + } + ], + "Prezi, Inc.": [ + { + "domain": "prezi.com", + "is_top": true + } + ], + "Primary Data, Inc.": [ + { + "domain": "primarydata.com", + "is_top": true + } + ], + "Princeton University": [ + { + "domain": "princeton.edu", + "is_top": true + } + ], + "ProFUSION Embedded Systems": [ + { + "domain": "profusion.mobi", + "is_top": true + } + ], + "Profihost AG": [ + { + "domain": "profihost.com", + "is_top": true + } + ], + "Proformatique": [ + { + "domain": "proformatique.com", + "is_top": true + } + ], + "Profusion": [ + { + "domain": "profusion.com", + "is_top": true + } + ], + "Progress Software Corporation": [ + { + "domain": "progress.com", + "is_top": true + } + ], + "Project Management Institute, Inc.": [ + { + "domain": "pmi.org", + "is_top": true + } + ], + "Prolan Zrt.": [ + { + "domain": "prolan.hu", + "is_top": true + } + ], + "Promwad": [ + { + "domain": "promwad.com", + "is_top": true + } + ], + "ProphetStor": [ + { + "domain": "prophetstor.com", + "is_top": true + } + ], + "Prosyst Software": [ + { + "domain": "prosyst.com", + "is_top": true + } + ], + "Protei, Ltd.": [ + { + "domain": "protei.ru", + "is_top": true + } + ], + "Protocol Labs": [ + { + "domain": "protocollabs.com", + "is_top": true + } + ], + "Protos Software GmbH": [ + { + "domain": "protos.de", + "is_top": true + } + ], + "PublicRelay": [ + { + "domain": "publicrelay.com", + "is_top": true + } + ], + "Puppet Labs": [ + { + "domain": "puppetlabs.com", + "is_top": true + } + ], + "Pure Storage": [ + { + "domain": "purestorage.com", + "is_top": true + } + ], + "Puzzle ITC": [ + { + "domain": "puzzle.ch", + "is_top": true + } + ], + "QLogic": [ + { + "domain": "ir.qlogic.com", + "is_top": false + }, + { + "domain": "qlogic.com", + "is_top": true + } + ], + "QNX Software Systems Co.": [ + { + "domain": "qnx.com", + "is_top": true + } + ], + "QUALITANCE": [ + { + "domain": "qualitance.com", + "is_top": true + } + ], + "Qihoo 360 Technology Co., Ltd.": [ + { + "domain": "360.cn", + "is_top": true + } + ], + "Qisda": [ + { + "domain": "qisda.com", + "is_top": true + } + ], + "Qt Company": [ + { + "domain": "qt.io", + "is_top": true + } + ], + "Qualcomm": [ + { + "domain": "qualcomm.com", + "is_top": true + }, + { + "domain": "quicinc.com", + "is_top": true + } + ], + "Qualcomm Atheros": [ + { + "domain": "qca.qualcomm.com", + "is_top": true + } + ], + "Quanta Computer, Inc.": [ + { + "domain": "quantatw.com", + "is_top": true + } + ], + "Quantum Controls BV": [ + { + "domain": "quantumcontrols.nl", + "is_top": true + } + ], + "Qubit": [ + { + "domain": "qubitdigital.com", + "is_top": true + } + ], + "Quixey, Inc.": [ + { + "domain": "quixey.com", + "is_top": true + } + ], + "Qumranet, Inc.": [ + { + "domain": "qumranet.com", + "is_top": true + } + ], + "Qunar": [ + { + "domain": "qunar.com", + "is_top": true + } + ], + "Quobyte": [ + { + "domain": "quobyte.com", + "is_top": true + } + ], + "Quansight": [ + { + "domain": "quansight.com", + "is_top": true + } + ], + "R-S-I Elektrotechnik GmbH": [ + { + "domain": "rsi-elektrotechnik.de", + "is_top": true + } + ], + "RAPICORP": [ + { + "domain": "rapicorp.com", + "is_top": true + } + ], + "RCP Vision": [ + { + "domain": "rcp-vision.com", + "is_top": true + } + ], + "RDC Semiconductor Co., Ltd.": [ + { + "domain": "rdc.com.tw", + "is_top": true + } + ], + "REA Elektronik GmbH": [ + { + "domain": "rea-elektronik.net", + "is_top": true + } + ], + "RGM Advisors": [ + { + "domain": "rgmadvisors.com", + "is_top": true + } + ], + "RGen Solutions": [ + { + "domain": "rgensolutions.com", + "is_top": true + } + ], + "RISC Software GmbH": [ + { + "domain": "risc-software.at", + "is_top": true + } + ], + "RISE Security": [ + { + "domain": "risesecurity.org", + "is_top": true + } + ], + "ROAD": [ + { + "domain": "road.de", + "is_top": true + } + ], + "Racelogic": [ + { + "domain": "racelogic.co.uk", + "is_top": true + } + ], + "Rackspace": [ + { + "domain": "rackspace.co.uk", + "is_top": true + }, + { + "domain": "rackspace.com", + "is_top": true + } + ], + "Radware": [ + { + "domain": "radware.com", + "is_top": true + } + ], + "Rajant": [ + { + "domain": "rajant.com", + "is_top": true + } + ], + "Rakuten": [ + { + "domain": "mail.rakuten.com", + "is_top": true + } + ], + "Ralink Technology": [ + { + "domain": "ralinktech.com", + "is_top": true + } + ], + "Rally Software": [ + { + "domain": "rallydev.com", + "is_top": true + } + ], + "Rapid7": [ + { + "domain": "rapid7.com", + "is_top": true + } + ], + "Raumfeld GmbH": [ + { + "domain": "raumfeld.com", + "is_top": true + } + ], + "Ravello Systems": [ + { + "domain": "ravellosystems.com", + "is_top": true + } + ], + "Raytheon": [ + { + "domain": "raytheon.com", + "is_top": true + } + ], + "Razorblue, Ltd.": [ + { + "domain": "razorblue.com", + "is_top": true + } + ], + "Reaktor": [ + { + "domain": "reaktor.fi", + "is_top": true + } + ], + "Real-Time Remedies, Inc.": [ + { + "domain": "rtr.ca", + "is_top": true + } + ], + "RealVNC": [ + { + "domain": "realvnc.com", + "is_top": true + } + ], + "Realsil Microelectronics": [ + { + "domain": "realsil.com.cn", + "is_top": true + } + ], + "Realtek": [ + { + "domain": "realtek.com", + "is_top": true + }, + { + "domain": "realtek.com.tw", + "is_top": true + } + ], + "Red Flag Software": [ + { + "domain": "redflag-linux.com", + "is_top": true + } + ], + "Red Hat": [ + { + "domain": "fedoraproject.org", + "is_top": true + }, + { + "domain": "redhat.com", + "is_top": true + }, + { + "domain": "weilnetz.de", + "is_top": true + } + ], + "Red Hat, Inc.": [], + "Redbrick Health": [ + { + "domain": "redbrickhealth.com", + "is_top": true + } + ], + "Redpill Linpro": [ + { + "domain": "redpill-linpro.com", + "is_top": false + } + ], + "Reflex Systems": [ + { + "domain": "reflexsystems.co.uk", + "is_top": true + } + ], + "Reliance Jio Infocomm, Ltd.": [ + { + "domain": "ril.com", + "is_top": true + } + ], + "Remix": [ + { + "domain": "remix.com", + "is_top": true + } + ], + "Renesas Electronics Corporation": [ + { + "domain": "renesas.com", + "is_top": true + }, + { + "domain": "renesas.eu", + "is_top": true + } + ], + "ReportLab, Inc.": [ + { + "domain": "reportlab.com", + "is_top": true + } + ], + "Restorepoint Ltd.": [ + { + "domain": "restorepoint.com", + "is_top": true + } + ], + "Rheinmetall Canada": [ + { + "domain": "rheinmetall.ca", + "is_top": true + } + ], + "Rheinmetall Defence Electronics": [ + { + "domain": "rheinmetall-de.com", + "is_top": true + }, + { + "domain": "rheinmetall-defence.com", + "is_top": true + } + ], + "RidgeRun, LLC": [ + { + "domain": "ridgerun.com", + "is_top": true + } + ], + "Riedel Communications": [ + { + "domain": "riedel.net", + "is_top": true + } + ], + "RightScale, Inc.": [ + { + "domain": "rightscale.com", + "is_top": true + } + ], + "Riot Games, Inc.": [ + { + "domain": "riotgames.com", + "is_top": true + } + ], + "RisingTide Systems": [ + { + "domain": "risingtidesystems.com", + "is_top": true + } + ], + "Risk Management Solutions": [ + { + "domain": "rms.com", + "is_top": true + } + ], + "Riskive": [ + { + "domain": "riskive.com", + "is_top": true + } + ], + "Riverbed Technology": [ + { + "domain": "riverbed.com", + "is_top": true + } + ], + "Roald van Loon Consultancy": [ + { + "domain": "roaldvanloon.nl", + "is_top": true + } + ], + "Robert Bosch GmbH": [], + "Rocket Internet SE": [ + { + "domain": "rocket-internet.de", + "is_top": true + } + ], + "Rockwell Automation, Inc.": [ + { + "domain": "rockwell.com", + "is_top": true + }, + { + "domain": "rockwellautomation.com", + "is_top": true + } + ], + "Rockwell Collins": [ + { + "domain": "rockwellcollins.com", + "is_top": true + } + ], + "Roesch & Walter Industrie-Elektronik": [ + { + "domain": "rw-gmbh.de", + "is_top": true + } + ], + "Roku": [ + { + "domain": "roku.com", + "is_top": true + } + ], + "Rowland Institute, Harvard": [ + { + "domain": "rowland.harvard.edu", + "is_top": true + } + ], + "RuggedCom, Inc.": [ + { + "domain": "ruggedcom.com", + "is_top": true + } + ], + "Ruijie Networks Co., Ltd.": [ + { + "domain": "ruijie.com.cn", + "is_top": true + }, + { + "domain": "ruijienetworks.com", + "is_top": true + } + ], + "Rutgers University": [ + { + "domain": "rutgers.edu", + "is_top": true + } + ], + "R\u00e9volution Linux": [ + { + "domain": "revolutionlinux.com", + "is_top": true + } + ], + "SANPeople": [ + { + "domain": "sanpeople.com", + "is_top": true + } + ], + "SAP": [ + { + "domain": "sap.com", + "is_top": true + } + ], + "SAP AG": [], + "SAS": [ + { + "domain": "sas.com", + "is_top": true + } + ], + "SC5": [ + { + "domain": "sc5.io", + "is_top": true + } + ], + "SDG Systems": [ + { + "domain": "sdgsystems.com", + "is_top": true + } + ], + "SES TechCom": [ + { + "domain": "ses-astra.com", + "is_top": true + }, + { + "domain": "ses.com", + "is_top": true + } + ], + "SFR": [ + { + "domain": "neufcegetel.fr", + "is_top": true + }, + { + "domain": "sfr.fr", + "is_top": true + } + ], + "SGI": [ + { + "domain": "sgi.com", + "is_top": true + } + ], + "SICE S.A": [ + { + "domain": "sice.com", + "is_top": true + } + ], + "SIGMA Chemnitz": [ + { + "domain": "sigma-chemnitz.de", + "is_top": true + } + ], + "SIOS Technology Corporation": [ + { + "domain": "sios.com", + "is_top": true + }, + { + "domain": "us.sios.com", + "is_top": false + } + ], + "SMARTX": [ + { + "domain": "smartx-cn.com", + "is_top": true + }, + { + "domain": "zelin.io", + "is_top": true + } + ], + "SMSC": [ + { + "domain": "smsc.com", + "is_top": true + } + ], + "SRI International": [ + { + "domain": "sri.com", + "is_top": true + } + ], + "SRI Quant": [ + { + "domain": "rdi-kvant.ru", + "is_top": true + } + ], + "Star Lab Software": [ + { + "domain": "starlab.io", + "is_top": true + } + ], + "ST Ericsson": [ + { + "domain": "stericsson.com", + "is_top": true + } + ], + "STMicroelectronics": [ + { + "domain": "st.com", + "is_top": true + } + ], + "SUSE": [ + { + "domain": "suse.com", + "is_top": true + }, + { + "domain": "suse.cz", + "is_top": true + }, + { + "domain": "suse.de", + "is_top": true + } + ], + "SW Complete, Inc.": [ + { + "domain": "swcomplete.com", + "is_top": true + } + ], + "SWITCH": [ + { + "domain": "switch.ch", + "is_top": true + } + ], + "SYS TEC electronic GmbH": [ + { + "domain": "systec-electronic.com", + "is_top": true + } + ], + "SYSGO": [ + { + "domain": "sysgo.com", + "is_top": true + } + ], + "Sabayon Linux": [ + { + "domain": "sabayon.org", + "is_top": true + }, + { + "domain": "sabayonlinux.org", + "is_top": true + } + ], + "Safari.to": [ + { + "domain": "safari.to", + "is_top": true + } + ], + "Sage Group PLC": [ + { + "domain": "sage.com", + "is_top": true + } + ], + "Sagem": [ + { + "domain": "sagem.com", + "is_top": true + } + ], + "Sailpoint": [ + { + "domain": "sailpoint.com", + "is_top": true + } + ], + "Salesforce": [ + { + "domain": "salesforce.com", + "is_top": true + } + ], + "SaltStack, Inc.": [ + { + "domain": "saltstack.com", + "is_top": true + } + ], + "Samsung": [ + { + "domain": "samsung.com", + "is_top": true + } + ], + "SanDisk": [ + { + "domain": "sandisk.com", + "is_top": true + } + ], + "Sandia National Laboratories": [ + { + "domain": "sandia.gov", + "is_top": true + } + ], + "Savant Systems": [ + { + "domain": "savantav.com", + "is_top": true + } + ], + "Savoir-faire Linux": [ + { + "domain": "savoirfairelinux.com", + "is_top": true + } + ], + "Saxnet GmbH": [ + { + "domain": "saxnet.de", + "is_top": true + } + ], + "ScaleMP, Inc.": [ + { + "domain": "scalemp.com", + "is_top": true + } + ], + "Scality": [ + { + "domain": "scality.com", + "is_top": true + } + ], + "Scapa Technologies Limited": [ + { + "domain": "scapatech.com", + "is_top": true + } + ], + "ScholarStack": [ + { + "domain": "scholarstack.com", + "is_top": true + } + ], + "Science Fiction Technologies": [ + { + "domain": "sf-tec.de", + "is_top": true + } + ], + "Science and Technology Facilities Council": [ + { + "domain": "stfc.ac.uk", + "is_top": true + } + ], + "Scilab Enterprises": [ + { + "domain": "scilab-enterprises.com", + "is_top": false + } + ], + "Seagate Technology LLC": [ + { + "domain": "evault.com", + "is_top": true + } + ], + "Secretlab": [ + { + "domain": "secretlab.ca", + "is_top": true + } + ], + "Secure Computing": [ + { + "domain": "moreton.com.au", + "is_top": true + }, + { + "domain": "securecomputing.com", + "is_top": true + } + ], + "Seegno": [ + { + "domain": "seegno.com", + "is_top": true + } + ], + "Selectel": [ + { + "domain": "selectel.ru", + "is_top": true + } + ], + "Semaphore": [ + { + "domain": "cse-semaphore.com", + "is_top": true + } + ], + "Semihalf Embedded Systems": [ + { + "domain": "semihalf.com", + "is_top": true + } + ], + "SendFaster": [ + { + "domain": "sendfaster.com", + "is_top": true + } + ], + "SendGrid": [ + { + "domain": "sendgrid.com", + "is_top": true + } + ], + "Sensirion": [ + { + "domain": "sensirion.com", + "is_top": true + } + ], + "Sensoray": [ + { + "domain": "sensoray.com", + "is_top": true + } + ], + "Sensortherm GmbH": [ + { + "domain": "sensortherm.de", + "is_top": true + } + ], + "Sentelic Corporation": [ + { + "domain": "sentelic.com", + "is_top": true + } + ], + "Sequoia IT": [ + { + "domain": "sequoia.it", + "is_top": true + } + ], + "ServerEngines Corporation": [ + { + "domain": "serverengines.com", + "is_top": true + } + ], + "Seven Networks": [ + { + "domain": "seven.com", + "is_top": true + } + ], + "Sferia": [ + { + "domain": "sferia.pl", + "is_top": true + } + ], + "Shawhin Tech": [ + { + "domain": "shawhintech.com", + "is_top": true + } + ], + "Shawn Zhong": [ + { + "domain": "shawnzhong.com", + "is_top": true + } + ], + "Shiny Srl": [ + { + "domain": "shiny.it", + "is_top": true + }, + { + "domain": "shinystat.com", + "is_top": true + } + ], + "Shotgun Software": [ + { + "domain": "shotgunsoftware.com", + "is_top": true + } + ], + "Shutterstock, Inc.": [ + { + "domain": "shutterstock.com", + "is_top": true + } + ], + "Siano Mobile Silicon": [ + { + "domain": "siano-ms.com", + "is_top": true + } + ], + "Sichuan University": [ + { + "domain": "stu.scu.edu.cn", + "is_top": true + } + ], + "Sicortex": [ + { + "domain": "sicortex.com", + "is_top": true + } + ], + "Sidebranch": [ + { + "domain": "sidebranch.com", + "is_top": true + } + ], + "Siemens": [ + { + "domain": "siemens.com", + "is_top": true + } + ], + "Sierra Wireless": [ + { + "domain": "sierrawireless.com", + "is_top": true + } + ], + "Sigfox": [ + { + "domain": "sigfox.com", + "is_top": true + } + ], + "Sigma Designs": [ + { + "domain": "sdesigns.com", + "is_top": true + } + ], + "Signal 11 Software": [ + { + "domain": "signal11.us", + "is_top": true + } + ], + "Signature Research": [ + { + "domain": "signatureresearchinc.com", + "is_top": true + } + ], + "Signips": [ + { + "domain": "signips.com", + "is_top": true + } + ], + "Signove": [ + { + "domain": "signove.com", + "is_top": true + } + ], + "Sigterm": [ + { + "domain": "sigterm.no", + "is_top": true + } + ], + "Simtec Electronics": [ + { + "domain": "simtec.co.uk", + "is_top": true + } + ], + "Sirius International": [ + { + "domain": "siriushk.com", + "is_top": true + } + ], + "Sirrix AG": [ + { + "domain": "sirrix.com", + "is_top": true + } + ], + "Slimlogic, Ltd.": [ + { + "domain": "slimlogic.co.uk", + "is_top": true + } + ], + "Smart Weblications": [ + { + "domain": "smart-weblications.com", + "is_top": true + } + ], + "SmartJog S.A.S.": [ + { + "domain": "smartjog.com", + "is_top": true + } + ], + "Smashing Boxes": [ + { + "domain": "smashingboxes.com", + "is_top": true + } + ], + "Smile": [ + { + "domain": "smile.ci", + "is_top": true + }, + { + "domain": "smile.fr", + "is_top": true + } + ], + "Snabb": [ + { + "domain": "snabb.co", + "is_top": true + } + ], + "SnapTV": [ + { + "domain": "snap.tv", + "is_top": true + } + ], + "Snowflake Computing, Inc.": [ + { + "domain": "snowflake.net", + "is_top": true + } + ], + "Social Physics": [], + "Socrata, Inc.": [ + { + "domain": "socrata.com", + "is_top": true + } + ], + "SodiFrance (formely Mia software)": [ + { + "domain": "sodifrance.fr", + "is_top": true + } + ], + "SofaWare": [ + { + "domain": "sofaware.com", + "is_top": true + } + ], + "SoftLayer": [ + { + "domain": "softlayer.com", + "is_top": true + } + ], + "SoftPLC": [ + { + "domain": "softplc.com", + "is_top": true + } + ], + "Softek Solutions, Inc.": [ + { + "domain": "softekinc.com", + "is_top": true + } + ], + "Software Freedom Law Center": [ + { + "domain": "softwarefreedom.org", + "is_top": true + } + ], + "Sogyo": [ + { + "domain": "sogyo.nl", + "is_top": true + } + ], + "Sohonet": [ + { + "domain": "sohonet.com", + "is_top": true + } + ], + "Solarflare Communications, Inc.": [ + { + "domain": "solarflare.com", + "is_top": true + } + ], + "Solid Boot, Ltd.": [ + { + "domain": "solidboot.com", + "is_top": true + } + ], + "SolidFire": [ + { + "domain": "solidfire.com", + "is_top": true + } + ], + "Solinea": [ + { + "domain": "solinea.com", + "is_top": true + } + ], + "Sonatest Limited": [ + { + "domain": "sonatest.com", + "is_top": true + } + ], + "Sonatype": [ + { + "domain": "sonatype.com", + "is_top": true + } + ], + "Sony": [ + { + "domain": "am.sony.com", + "is_top": false + }, + { + "domain": "sony.co.jp", + "is_top": true + }, + { + "domain": "sony.com", + "is_top": true + }, + { + "domain": "sonycom.com", + "is_top": true + } + ], + "Sony Mobile": [ + { + "domain": "sonyericsson.com", + "is_top": true + }, + { + "domain": "sonymobile.com", + "is_top": true + } + ], + "Sophos": [ + { + "domain": "sophos.com", + "is_top": true + } + ], + "SoundCloud Ltd": [ + { + "domain": "soundcloud.com", + "is_top": true + } + ], + "South Pole AB": [ + { + "domain": "southpole.se", + "is_top": true + } + ], + "Southwest Solar Technologies": [ + { + "domain": "swsolartech.com", + "is_top": true + } + ], + "Soyatec": [ + { + "domain": "soyatec.com", + "is_top": true + } + ], + "Special Communications Systems": [ + { + "domain": "scs-ptc.com", + "is_top": true + } + ], + "Spectra Logic": [ + { + "domain": "spectralogic.com", + "is_top": true + } + ], + "Sphairon Technologies GmbH": [ + { + "domain": "sphairon.com", + "is_top": true + } + ], + "SpiderNet Services": [ + { + "domain": "spidernet.net", + "is_top": true + } + ], + "Spil Games": [ + { + "domain": "spilgames.com", + "is_top": true + } + ], + "Spotify AB": [ + { + "domain": "spotify.com", + "is_top": true + } + ], + "SpringSource, Inc aka VMware now GoPivotal": [], + "Springpath Inc.": [ + { + "domain": "storvisor.com", + "is_top": true + } + ], + "Square, Inc.": [ + { + "domain": "squareup.com", + "is_top": true + } + ], + "Squarespace": [ + { + "domain": "squarespace.com", + "is_top": true + } + ], + "StackMasters": [ + { + "domain": "stackmasters.eu", + "is_top": true + } + ], + "StackOps Technologies": [ + { + "domain": "stackops.com", + "is_top": true + } + ], + "Stackinsider": [ + { + "domain": "stackinsider.com", + "is_top": true + }, + { + "domain": "stackinsider.org", + "is_top": true + }, + { + "domain": "windawn.com", + "is_top": true + } + ], + "Stanford University": [ + { + "domain": "cs.stanford.edu", + "is_top": false + }, + { + "domain": "stanford.edu", + "is_top": true + } + ], + "Star Trac": [ + { + "domain": "startrac.com", + "is_top": true + } + ], + "Starent Networks": [ + { + "domain": "starentnetworks.com", + "is_top": true + } + ], + "SteelEye": [ + { + "domain": "steeleye.com", + "is_top": true + } + ], + "Stepping Stone": [ + { + "domain": "stepping-stone.ch", + "is_top": true + } + ], + "Sterry IT, LLC": [ + { + "domain": "sterryit.com", + "is_top": true + } + ], + "Stiftelsen Chalmers Studenthem": [ + { + "domain": "chalmersstudentbostader.se", + "is_top": true + }, + { + "domain": "csbnet.se", + "is_top": true + } + ], + "Stonesoft Corporation": [ + { + "domain": "stonesoft.com", + "is_top": true + } + ], + "StorPool": [ + { + "domain": "storpool.com", + "is_top": true + } + ], + "Stormshield": [ + { + "domain": "stormshield.eu", + "is_top": true + } + ], + "Storwize": [ + { + "domain": "storwize.com", + "is_top": true + } + ], + "Strandera Corporation": [ + { + "domain": "strandera.com", + "is_top": true + } + ], + "Strato": [ + { + "domain": "strato.de", + "is_top": true + } + ], + "StratoScale": [ + { + "domain": "stratoscale.com", + "is_top": true + } + ], + "Stratosec": [ + { + "domain": "stratosec.co", + "is_top": true + } + ], + "Stream Processors, Inc.": [ + { + "domain": "streamprocessors.com", + "is_top": true + } + ], + "StreamUnlimited": [ + { + "domain": "streamunlimited.com", + "is_top": true + } + ], + "Stripe": [ + { + "domain": "stripe.com", + "is_top": true + } + ], + "StrongLoop": [ + { + "domain": "strongloop.com", + "is_top": true + } + ], + "Substantiel": [ + { + "domain": "substantiel.fr", + "is_top": true + } + ], + "Sumo Logic": [ + { + "domain": "sumologic.com", + "is_top": true + } + ], + "Sun": [], + "Sun Microsystems, Inc.": [ + { + "domain": "sun.com", + "is_top": true + } + ], + "Sun Yat-sen University": [ + { + "domain": "mail2.sysu.edu.cn", + "is_top": true + } + ], + "SunGard": [ + { + "domain": "sungard.com", + "is_top": true + } + ], + "Sunplus Core Technology": [], + "Sunplus Technology Co., Ltd.": [ + { + "domain": "sunplus.com", + "is_top": true + }, + { + "domain": "sunplusct.com", + "is_top": true + } + ], + "Swapp Engineering": [ + { + "domain": "swapp-eng.it", + "is_top": true + } + ], + "Swedish Institute of Computer Science": [ + { + "domain": "sics.se", + "is_top": true + } + ], + "Swedish University of Agricultural Sciences": [ + { + "domain": "data.slu.se", + "is_top": false + }, + { + "domain": "slu.se", + "is_top": true + } + ], + "SwiftStack": [ + { + "domain": "swiftstack.com", + "is_top": true + } + ], + "Sybase": [ + { + "domain": "sybase.com", + "is_top": true + } + ], + "Symantec": [], + "Symantec Corporation": [ + { + "domain": "symantec.com", + "is_top": true + }, + { + "domain": "veritas.com", + "is_top": true + } + ], + "Symas Corporation": [ + { + "domain": "symas.com", + "is_top": true + } + ], + "Synopsys": [ + { + "domain": "synopsys.com", + "is_top": true + } + ], + "Synk": [ + { + "domain": "synk.com", + "is_top": true + } + ], + "System Fabric Works": [ + { + "domain": "systemfabricworks.com", + "is_top": true + } + ], + "TAOS, Inc.": [ + { + "domain": "taosinc.com", + "is_top": true + } + ], + "TBWA": [ + { + "domain": "tbwa.com", + "is_top": true + } + ], + "TCloud Computing": [ + { + "domain": "tcloudcomputing.com", + "is_top": true + } + ], + "TECNA": [ + { + "domain": "tecna.com", + "is_top": true + } + ], + "TES s.r.o.": [ + { + "domain": "tes.eu", + "is_top": true + }, + { + "domain": "tesnet.cz", + "is_top": true + } + ], + "TIBCO Software": [ + { + "domain": "tibco.com", + "is_top": true + }, + { + "domain": "tibco.es", + "is_top": true + } + ], + "TIL Technologies": [ + { + "domain": "til-technologies.fr", + "is_top": true + } + ], + "TIS": [ + { + "domain": "tis.co.jp", + "is_top": true + } + ], + "TOPTICA Photonics": [ + { + "domain": "toptica.com", + "is_top": true + } + ], + "TVGlobo": [ + { + "domain": "tvglobo.com.br", + "is_top": true + } + ], + "TVU Networks": [ + { + "domain": "tvunetworks.com", + "is_top": true + } + ], + "Taktik": [ + { + "domain": "taktik.be", + "is_top": true + } + ], + "Talend": [ + { + "domain": "talend.com", + "is_top": true + } + ], + "Tandberg": [ + { + "domain": "tandberg.com", + "is_top": true + } + ], + "Taobao": [ + { + "domain": "taobao.com", + "is_top": true + } + ], + "Tapestry Systems": [ + { + "domain": "tapsys.com", + "is_top": true + } + ], + "Tasktop": [ + { + "domain": "tasktop.com", + "is_top": true + } + ], + "Tata Consultancy": [ + { + "domain": "tcs.com", + "is_top": true + } + ], + "TecVenture": [ + { + "domain": "tec-venture.de", + "is_top": true + } + ], + "Tech-angels": [ + { + "domain": "tech-angels.com", + "is_top": true + } + ], + "TechNexion, Ltd.": [ + { + "domain": "technexion.com", + "is_top": true + } + ], + "TechPatron": [ + { + "domain": "techpatron.co.in", + "is_top": true + } + ], + "TechniSat Digital GmbH": [ + { + "domain": "technisat.com", + "is_top": true + } + ], + "Technical Solutions, Inc.": [ + { + "domain": "techsol.ca", + "is_top": true + } + ], + "Technische Universitaet Darmstadt": [ + { + "domain": "tu-darmstadt.de", + "is_top": true + } + ], + "Teevity": [ + { + "domain": "teevity.com", + "is_top": true + } + ], + "Telargo, Inc.": [ + { + "domain": "telargo.com", + "is_top": true + } + ], + "Teleca": [ + { + "domain": "teleca.com", + "is_top": true + } + ], + "Telecom Italia": [ + { + "domain": "telecomitalia.com", + "is_top": true + } + ], + "Telecom-Service": [ + { + "domain": "tls.msk.ru", + "is_top": true + } + ], + "Telegent System": [ + { + "domain": "telegent.com", + "is_top": true + } + ], + "Telemotive AG": [ + { + "domain": "telemotive.de", + "is_top": true + } + ], + "Televic": [ + { + "domain": "televic.com", + "is_top": true + } + ], + "Tellabs": [ + { + "domain": "tellabs.com", + "is_top": true + } + ], + "Telly": [ + { + "domain": "telly.com", + "is_top": true + } + ], + "Teltonika": [ + { + "domain": "teltonika.lt", + "is_top": true + } + ], + "Tencent": [ + { + "domain": "tencent.com", + "is_top": true + } + ], + "Tendril": [ + { + "domain": "tendrilinc.com", + "is_top": true + } + ], + "Tensilica": [], + "Tensilica, Inc.": [ + { + "domain": "tensilica.com", + "is_top": true + } + ], + "Terascala": [ + { + "domain": "terascala.com", + "is_top": true + } + ], + "Tesora, Inc.": [ + { + "domain": "parelastic.com", + "is_top": true + }, + { + "domain": "tesora.com", + "is_top": true + } + ], + "Texas Instruments": [ + { + "domain": "ti.com", + "is_top": true + } + ], + "Thales": [ + { + "domain": "thalesgroup.com", + "is_top": true + } + ], + "The Apache Software Foundation": [ + { + "domain": "apache.org", + "is_top": true + } + ], + "The Church of Jesus Christ of Latter-day Saints": [ + { + "domain": "ldschurch.org", + "is_top": true + } + ], + "The Guardian": [ + { + "domain": "guardian.co.uk", + "is_top": true + } + ], + "The Linux Box": [ + { + "domain": "linuxbox.com", + "is_top": true + } + ], + "The Product Engine, Inc.": [ + { + "domain": "productengine.com", + "is_top": true + } + ], + "Think.Web": [ + { + "domain": "think.web.id", + "is_top": true + } + ], + "Thinking Phone Networks": [ + { + "domain": "thinkingphones.com", + "is_top": true + } + ], + "Thinktube": [ + { + "domain": "thinktube.com", + "is_top": true + } + ], + "Thomson Reuters": [ + { + "domain": "thomsonreuters.com", + "is_top": true + } + ], + "Thot-Soft 2002": [ + { + "domain": "thot-soft.com", + "is_top": true + } + ], + "ThoughtWorks, Inc.": [ + { + "domain": "thoughtworks.com", + "is_top": true + } + ], + "Tianjin Zhongke Blue Whale Information Technologies": [ + { + "domain": "nrchpc.ac.cn", + "is_top": false + } + ], + "Tieto": [ + { + "domain": "tieto.com", + "is_top": true + } + ], + "Tilera": [ + { + "domain": "tilera.com", + "is_top": true + } + ], + "Time Warner Cable, Inc.": [ + { + "domain": "twcable.com", + "is_top": true + } + ], + "Timesys": [ + { + "domain": "timesys.com", + "is_top": true + } + ], + "Tk Open Systems, Ltd.": [ + { + "domain": "tkos.co.il", + "is_top": true + } + ], + "TomTom": [ + { + "domain": "tomtom.com", + "is_top": true + } + ], + "Top Bug Net": [ + { + "domain": "topbug.net", + "is_top": true + } + ], + "Tonian": [ + { + "domain": "tonian.com", + "is_top": true + } + ], + "Toshiba": [ + { + "domain": "toshiba.co.jp", + "is_top": true + }, + { + "domain": "toshiba.com", + "is_top": true + }, + { + "domain": "toshiba.es", + "is_top": true + }, + { + "domain": "toshiba.eu", + "is_top": true + } + ], + "Total Knowledge": [ + { + "domain": "total-knowledge.com", + "is_top": true + } + ], + "Tower Technologies": [ + { + "domain": "towertech.it", + "is_top": true + } + ], + "Tracelytics": [ + { + "domain": "tracelytics.com", + "is_top": true + } + ], + "Traffic Management Technologies": [ + { + "domain": "tmtservices.co.za", + "is_top": true + } + ], + "Transitive": [ + { + "domain": "transitive.com", + "is_top": true + } + ], + "Transmode Systems": [ + { + "domain": "transmode.se", + "is_top": true + } + ], + "Traverse Technologies": [ + { + "domain": "traverse.com.au", + "is_top": true + } + ], + "Tremolo Security, Inc.": [ + { + "domain": "tremolosecurity.com", + "is_top": true + } + ], + "Trend Micro": [ + { + "domain": "trendmicro.com", + "is_top": true + }, + { + "domain": "trendmicro.com.cn", + "is_top": true + } + ], + "Tresys": [ + { + "domain": "tresys.com", + "is_top": true + } + ], + "Trinnov Audio": [ + { + "domain": "trinnov.com", + "is_top": true + } + ], + "Tripeaks": [ + { + "domain": "tripeaks.co.jp", + "is_top": true + } + ], + "TriplePoint": [ + { + "domain": "tpi.com", + "is_top": true + } + ], + "Triplemining": [ + { + "domain": "triplemining.com", + "is_top": true + } + ], + "Tripp Lite": [ + { + "domain": "keyspan.com", + "is_top": true + }, + { + "domain": "tripplite.com", + "is_top": true + } + ], + "TrollTech": [ + { + "domain": "trolltech.com", + "is_top": true + } + ], + "TruCoin": [ + { + "domain": "trucoin.com", + "is_top": false + } + ], + "Trusted Computer Solutions": [ + { + "domain": "trustedcs.com", + "is_top": true + } + ], + "Tundra Semiconductor": [ + { + "domain": "tundra.com", + "is_top": true + } + ], + "Tungsten Graphics": [ + { + "domain": "tungstengraphics.com", + "is_top": true + } + ], + "Tuxera": [ + { + "domain": "tuxera.com", + "is_top": true + } + ], + "Twin Sun": [ + { + "domain": "twinsun.com", + "is_top": true + } + ], + "Twitter": [ + { + "domain": "twitter.com", + "is_top": true + } + ], + "Tyro Payments Limited": [ + { + "domain": "tyro.com", + "is_top": true + } + ], + "T\u00e9l\u00e9com Bretagne": [ + { + "domain": "telecom-bretagne.eu", + "is_top": true + } + ], + "U.S. Naval Research Laboratory": [ + { + "domain": "nrl.navy.mil", + "is_top": true + } + ], + "UHU-Linux": [ + { + "domain": "uhulinux.hu", + "is_top": true + } + ], + "UIC": [ + { + "domain": "uic.edu", + "is_top": true + } + ], + "UK National Health Service": [ + { + "domain": "nhs.net", + "is_top": true + }, + { + "domain": "nhs.uk", + "is_top": true + } + ], + "ULYSSIS VZW": [ + { + "domain": "ulyssis.org", + "is_top": true + } + ], + "UNICUS Co., Ltd.": [ + { + "domain": "unicus.jp", + "is_top": true + } + ], + "URSYS Pty, Ltd.": [ + { + "domain": "ursys.com.au", + "is_top": true + } + ], + "US National Security Agency": [ + { + "domain": "nsa.gov", + "is_top": true + }, + { + "domain": "tycho.nsa.gov", + "is_top": false + } + ], + "Uber": [ + { + "domain": "uber.com", + "is_top": true + } + ], + "Ubisoft": [ + { + "domain": "ubisoft.com", + "is_top": true + } + ], + "Ubuntu Kylin": [ + { + "domain": "ubuntukylin.com", + "is_top": true + } + ], + "Uhuru Software, Inc.": [ + { + "domain": "uhurusoftware.com", + "is_top": true + } + ], + "Unicontrol Systemtechnik": [ + { + "domain": "unicontrol.de", + "is_top": true + } + ], + "University of Electronic Science and Technology of China": [ + { + "domain": "std.uestc.edu.cn", + "is_top": true + } + ], + "Berkeley University of California": [ + { + "domain": "berkeley.edu", + "is_top": true + } + ], + "University of Science and Technology of China": [ + { + "domain": "mail.ustc.edu.cn", + "is_top": true + } + ], + "Unilogic Networks B.V.": [ + { + "domain": "unilogicnetworks.net", + "is_top": true + } + ], + "Unique Computing Solutions": [ + { + "domain": "ucs.at", + "is_top": true + } + ], + "Unisys": [ + { + "domain": "unisys.com", + "is_top": true + } + ], + "University of Texas at Austin": [ + { + "domain": "utexas.edu", + "is_top": true + } + ], + "UnitedStack": [ + { + "domain": "unitedstack.com", + "is_top": true + } + ], + "Universal Scientific Industrial Co.": [ + { + "domain": "usish.com", + "is_top": true + } + ], + "Universidad Complutense": [ + { + "domain": "dacya.ucm.es", + "is_top": true + }, + { + "domain": "fdi.ucm.es", + "is_top": true + } + ], + "Universidad Rey Juan Carlos": [ + { + "domain": "gsyc.es", + "is_top": true + }, + { + "domain": "gsyc.urjc.es", + "is_top": false + }, + { + "domain": "libresoft.es", + "is_top": true + } + ], + "Universidad de Cantabria": [ + { + "domain": "ifca.unican.es", + "is_top": false + }, + { + "domain": "unican.es", + "is_top": true + } + ], + "Universidad de Sevilla": [ + { + "domain": "us.es", + "is_top": true + } + ], + "Universitat Polit\u00e8cnica de Catalunya": [ + { + "domain": "entel.upc.edu", + "is_top": true + } + ], + "University of Applied Sciences Rapperswil": [], + "University of Arizona": [ + { + "domain": "arizona.edu", + "is_top": true + } + ], + "University of California, Santa Cruz": [ + { + "domain": "cs.ucsc.edu", + "is_top": false + }, + { + "domain": "soe.ucsc.edu", + "is_top": false + }, + { + "domain": "ucsc.edu", + "is_top": true + } + ], + "University of Cambridge": [ + { + "domain": "cam.ac.uk", + "is_top": true + } + ], + "University of Limerick": [ + { + "domain": "ul.ie", + "is_top": true + } + ], + "University of Manchester": [ + { + "domain": "manchester.ac.uk", + "is_top": true + } + ], + "University of Maryland": [ + { + "domain": "umd.edu", + "is_top": true + } + ], + "University of Melbourne": [ + { + "domain": "unimelb.edu.au", + "is_top": true + } + ], + "University of Michigan": [ + { + "domain": "umich.edu", + "is_top": true + } + ], + "University of Michigan - CITI": [ + { + "domain": "citi.umich.edu", + "is_top": true + } + ], + "University of Minnesota": [ + { + "domain": "umn.edu", + "is_top": true + } + ], + "University of Mississippi": [ + { + "domain": "olemiss.edu", + "is_top": true + } + ], + "University of Nebraska Omaha": [ + { + "domain": "unomaha.edu", + "is_top": true + } + ], + "University of North Carolina at Chapel Hill": [ + { + "domain": "unc.edu", + "is_top": true + } + ], + "University of Queensland": [ + { + "domain": "uq.edu.au", + "is_top": true + } + ], + "University of Missouri": [ + { + "domain": "missouri.edu", + "is_top": true + }, + { + "domain": "mail.missouri.edu", + "is_top": true + } + ], + "University of Toronto": [ + { + "domain": "utoronto.ca", + "is_top": true + }, + { + "domain": "mail.utoronto.ca", + "is_top": true + } + ], + "University of Utah": [ + { + "domain": "cs.utah.edu", + "is_top": false + }, + { + "domain": "utah.edu", + "is_top": true + } + ], + "University of Virginia": [ + { + "domain": "virginia.edu", + "is_top": true + } + ], + "University of Waterloo": [ + { + "domain": "csclub.uwaterloo.ca", + "is_top": true + } + ], + "Universit\u00e4t Osnabr\u00fcck": [ + { + "domain": "uos.de", + "is_top": true + } + ], + "Uppsala University": [ + { + "domain": "uu.se", + "is_top": true + } + ], + "Upstream University": [ + { + "domain": "upstream-university.org", + "is_top": true + } + ], + "VA Linux Systems Japan": [ + { + "domain": "valinux.co.jp", + "is_top": false + } + ], + "VIA Technologies, Inc.": [ + { + "domain": "via.com.tw", + "is_top": true + }, + { + "domain": "viatech.com", + "is_top": true + }, + { + "domain": "viatech.com.cn", + "is_top": true + } + ], + "VIVO Systems": [ + { + "domain": "vivosys.com", + "is_top": true + } + ], + "VMTurbo": [ + { + "domain": "vmturbo.com", + "is_top": true + } + ], + "VMware": [ + { + "domain": "vmware.com", + "is_top": true + } + ], + "VPAC": [ + { + "domain": "vpac.org", + "is_top": true + } + ], + "VPOP Technologies, Inc.": [ + { + "domain": "vpop.net", + "is_top": true + } + ], + "VRT Systems": [ + { + "domain": "vrt.com.au", + "is_top": true + } + ], + "VU University Amsterdam": [ + { + "domain": "vu.nl", + "is_top": true + } + ], + "Value Team SpA": [ + { + "domain": "valueteam.com", + "is_top": true + } + ], + "Varnish Software": [ + { + "domain": "varnish-software.com", + "is_top": true + } + ], + "VayavyaLabs": [ + { + "domain": "vayavyalabs.com", + "is_top": true + } + ], + "Venatech AB": [ + { + "domain": "venatech.se", + "is_top": true + } + ], + "Verismo": [ + { + "domain": "verismonetworks.com", + "is_top": true + } + ], + "Verizon": [ + { + "domain": "verizon.com", + "is_top": true + } + ], + "Vernier Software and Technology": [ + { + "domain": "vernier.com", + "is_top": true + } + ], + "Vertafore, Inc.": [ + { + "domain": "vertafore.com", + "is_top": true + } + ], + "VexxHost": [ + { + "domain": "vexxhost.com", + "is_top": true + } + ], + "Viafoura": [ + { + "domain": "viafoura.com", + "is_top": true + } + ], + "Vianet Internet Solutions": [ + { + "domain": "vianet.ca", + "is_top": true + }, + { + "domain": "zing-net.ca", + "is_top": true + } + ], + "Vidible": [ + { + "domain": "vidible.tv", + "is_top": true + } + ], + "Viettel": [ + { + "domain": "viettel.com.vn", + "is_top": true + } + ], + "Vimeo, LLC": [ + { + "domain": "vimeo.com", + "is_top": true + } + ], + "VinaKom": [ + { + "domain": "vinakom.com", + "is_top": true + } + ], + "Violin Memory": [ + { + "domain": "vmem.com", + "is_top": true + } + ], + "Viprinet GmpH": [ + { + "domain": "viprinet.com", + "is_top": true + } + ], + "Virginia Tech": [ + { + "domain": "vt.edu", + "is_top": true + } + ], + "Virtual Bridges": [ + { + "domain": "vbridges.com", + "is_top": true + } + ], + "Virtual Computer": [ + { + "domain": "virtualcomputer.com", + "is_top": true + } + ], + "Virtual Scale": [ + { + "domain": "virtualscale.fr", + "is_top": true + } + ], + "Virtual Security Research": [ + { + "domain": "vsecurity.com", + "is_top": true + } + ], + "VirtualLogix, Inc.": [ + { + "domain": "virtuallogix.com", + "is_top": true + } + ], + "VirtualTech": [ + { + "domain": "virtualtech.jp", + "is_top": true + } + ], + "Virtuata": [ + { + "domain": "virtuata.com", + "is_top": true + } + ], + "Vision Engraving Systems": [ + { + "domain": "visionengravers.com", + "is_top": true + } + ], + "Vision Service Plan": [ + { + "domain": "vsp.com", + "is_top": true + } + ], + "Vision Systems GmbH": [ + { + "domain": "visionsystems.de", + "is_top": true + } + ], + "Vista-Silicon S.L.": [ + { + "domain": "vista-silicon.com", + "is_top": true + } + ], + "Vivecode": [ + { + "domain": "vivecode.com", + "is_top": true + } + ], + "Vizuri": [ + { + "domain": "vizuri.com", + "is_top": true + } + ], + "Volkswagen": [ + { + "domain": "volkswagen.de", + "is_top": true + } + ], + "Voltaire": [ + { + "domain": "voltaire.com", + "is_top": true + } + ], + "Voxelbrain UG": [ + { + "domain": "voxelbrain.com", + "is_top": true + } + ], + "Vyatta": [ + { + "domain": "vyatta.com", + "is_top": true + } + ], + "WANdisco": [ + { + "domain": "wandisco.com", + "is_top": true + } + ], + "WE7": [ + { + "domain": "we7.com", + "is_top": true + } + ], + "WORK Microwave GmbH": [ + { + "domain": "work-microwave.de", + "is_top": true + } + ], + "WPR Medical": [ + { + "domain": "wprmedical.com", + "is_top": true + } + ], + "WSO2": [ + { + "domain": "wso2.com", + "is_top": true + } + ], + "Wabtec Railway Electronics": [ + { + "domain": "wabtec.com", + "is_top": true + } + ], + "Wacom": [ + { + "domain": "wacom.com", + "is_top": true + } + ], + "WalmartLabs": [ + { + "domain": "walmartlabs.com", + "is_top": true + } + ], + "Warpnet B.V.": [ + { + "domain": "warpnet.nl", + "is_top": true + } + ], + "WatchGuard Video": [ + { + "domain": "WatchGuardVideo.com", + "is_top": true + } + ], + "Web Drive": [ + { + "domain": "webdrive.co.nz", + "is_top": true + } + ], + "Websense": [ + { + "domain": "websense.com", + "is_top": true + } + ], + "Webtrends": [ + { + "domain": "webtrends.com", + "is_top": true + } + ], + "Weigle Wilczek GmbH": [ + { + "domain": "w11k.de", + "is_top": true + } + ], + "Weinmann Medical Technology": [ + { + "domain": "weinmann.de", + "is_top": true + } + ], + "Westell": [ + { + "domain": "westell.com", + "is_top": true + } + ], + "Westermo": [ + { + "domain": "westermo.co.uk", + "is_top": true + }, + { + "domain": "westermo.com", + "is_top": true + } + ], + "Western Digital": [ + { + "domain": "wdc.com", + "is_top": true + } + ], + "Whamcloud, Inc.": [ + { + "domain": "whamcloud.com", + "is_top": true + } + ], + "Whatever": [ + { + "domain": "knowledgeplaza.net", + "is_top": true + }, + { + "domain": "whatever-company.com", + "is_top": true + } + ], + "WiMobilis": [ + { + "domain": "wimobilis.com.br", + "is_top": true + } + ], + "WikiWorks": [ + { + "domain": "wikiworks.com", + "is_top": true + } + ], + "Wikia, Inc.": [ + { + "domain": "wikia.com", + "is_top": true + } + ], + "Wikimedia Deutschland": [ + { + "domain": "wikimedia.de", + "is_top": true + } + ], + "Wikimedia Foundation": [ + { + "domain": "wikimedia.org", + "is_top": true + } + ], + "Willow Garage": [ + { + "domain": "willowgarage.com", + "is_top": true + } + ], + "Winbond Electronics": [ + { + "domain": "winbond.com", + "is_top": true + }, + { + "domain": "winbond.com.tw", + "is_top": true + } + ], + "Wincor Nixdorf": [ + { + "domain": "wincor-nixdorf.com", + "is_top": true + } + ], + "Wind River": [ + { + "domain": "windriver.com", + "is_top": true + } + ], + "Wipro": [ + { + "domain": "wipro.com", + "is_top": true + } + ], + "Wize Commerce, Inc.": [ + { + "domain": "wizecommerce.com", + "is_top": true + } + ], + "Wizery, Ltd.": [ + { + "domain": "wizery.com", + "is_top": true + } + ], + "Wolfson Microelectronics": [ + { + "domain": "wolfsonmicro.com", + "is_top": true + } + ], + "Woods Hole Oceanographic Institution": [ + { + "domain": "whoi.edu", + "is_top": true + } + ], + "Workday": [ + { + "domain": "workday.com", + "is_top": true + } + ], + "Worldline": [ + { + "domain": "worldline.com", + "is_top": true + } + ], + "Wotif Holdings Limited": [ + { + "domain": "wotifgroup.com", + "is_top": true + } + ], + "Wytron Technology": [ + { + "domain": "wytron.com.tw", + "is_top": true + } + ], + "X-IO": [ + { + "domain": "x-io.com", + "is_top": true + } + ], + "X-ION": [ + { + "domain": "x-ion.de", + "is_top": true + } + ], + "XBMC Foundation": [ + { + "domain": "xbmc.org", + "is_top": true + } + ], + "XIV Information Systems": [ + { + "domain": "xiv.co.il", + "is_top": true + }, + { + "domain": "xivstorage.com", + "is_top": true + } + ], + "XLAB": [ + { + "domain": "xlab.si", + "is_top": true + } + ], + "XMotra": [ + { + "domain": "xmotra.com", + "is_top": true + } + ], + "XTech": [ + { + "domain": "xtech.com.ar", + "is_top": true + }, + { + "domain": "xtech.com", + "is_top": true + } + ], + "Xelerated, Inc.": [ + { + "domain": "xelerated.com", + "is_top": true + } + ], + "Xemeti": [ + { + "domain": "xemeti.com", + "is_top": true + } + ], + "Xentech Solutions, Ltd.": [ + { + "domain": "xentech.co.uk", + "is_top": true + } + ], + "Xerox": [ + { + "domain": "xerox.com", + "is_top": true + } + ], + "Xilinx, Inc.": [ + { + "domain": "xilinx.com", + "is_top": true + } + ], + "Xi’an Jiaotong University": [ + { + "domain": "stu.xjtu.edu.cn", + "is_top": true + } + ], + "Xidian University": [ + { + "domain": "mail.xidian.edu.cn", + "is_top": true + }, + { + "domain": "stu.xidian.edu.cn", + "is_top": true + } + ], + "Xiotech Corporation": [ + { + "domain": "xiostorage.com", + "is_top": true + }, + { + "domain": "xiotech.com", + "is_top": true + } + ], + "Xiph.Org Foundation": [ + { + "domain": "xiph.org", + "is_top": true + } + ], + "Xorcom": [ + { + "domain": "xorcom.com", + "is_top": true + } + ], + "Xored Software Inc": [ + { + "domain": "xored.com", + "is_top": true + } + ], + "YOPESO": [ + { + "domain": "yopeso.com", + "is_top": true + } + ], + "Yahoo, Inc.": [ + { + "domain": "yahoo-inc.com", + "is_top": true + } + ], + "Yatta Solutions GmbH": [ + { + "domain": "yatta.de", + "is_top": true + } + ], + "Yelp, Inc.": [ + { + "domain": "yelp.com", + "is_top": true + } + ], + "Yepa S.r.l.": [ + { + "domain": "yepa.com", + "is_top": true + } + ], + "Yext": [ + { + "domain": "yext.com", + "is_top": true + } + ], + "Yokogawa Electric": [ + { + "domain": "yokogawa.com", + "is_top": true + } + ], + "You/Com Audiocommunicatie BV": [ + { + "domain": "youcom.nl", + "is_top": true + } + ], + "YouScribe": [ + { + "domain": "youscribe.com", + "is_top": true + }, + { + "domain": "youscribe.fr", + "is_top": true + } + ], + "Ysance": [ + { + "domain": "ysance.com", + "is_top": true + } + ], + "ZE Powergroup, Inc.": [ + { + "domain": "ze.com", + "is_top": true + } + ], + "ZOHO Corporation": [ + { + "domain": "zoho.com", + "is_top": true + } + ], + "ZTE Corporation": [ + { + "domain": "zte.com.cn", + "is_top": true + } + ], + "Zadara Storage": [ + { + "domain": "zadarastorage.com", + "is_top": true + } + ], + "Zalando": [ + { + "domain": "zalando.de", + "is_top": true + } + ], + "Zafar Takhirov": [ + { + "domain": "zafar.cc", + "is_top": true + } + ], + "Zane Benefits, Inc.": [ + { + "domain": "zanebenefits.com", + "is_top": true + } + ], + "Zend": [ + { + "domain": "zend.com", + "is_top": true + } + ], + "Zentific": [ + { + "domain": "zentific.com", + "is_top": true + } + ], + "Zeugma Systems": [ + { + "domain": "zeugmasystems.com", + "is_top": true + } + ], + "Zhejiang University": [ + { + "domain": "zju.edu.cn", + "is_top": true + } + ], + "Zilogic Systems": [ + { + "domain": "zilogic.com", + "is_top": true + } + ], + "Zinkov": [ + { + "domain": "zinkov.com", + "is_top": true + } + ], + "Zing Systems": [ + { + "domain": "zing.net", + "is_top": true + } + ], + "Zmanda": [ + { + "domain": "zmanda.com", + "is_top": true + } + ], + "Zonbu": [ + { + "domain": "zonbu.com", + "is_top": true + } + ], + "ZTE": [ + { + "domain": "zte.com.cn", + "is_top": true + } + ], + "ZyXel": [ + { + "domain": "zyxel.com", + "is_top": true + } + ], + "Zynga, Inc.": [ + { + "domain": "zynga.com", + "is_top": true + } + ], + "aizo ag": [ + { + "domain": "aizo.com", + "is_top": true + } + ], + "ams": [ + { + "domain": "ams.com", + "is_top": true + } + ], + "caiaq": [ + { + "domain": "caiaq.de", + "is_top": true + } + ], + "cloudControl, Inc.": [ + { + "domain": "cloudcontrol.com", + "is_top": true + }, + { + "domain": "dotcloud.com", + "is_top": true + } + ], + "codecentric AG": [ + { + "domain": "codecentric.de", + "is_top": true + } + ], + "compeople AG": [ + { + "domain": "compeople.de", + "is_top": true + } + ], + "cozybit": [ + { + "domain": "cozybit.com", + "is_top": true + } + ], + "eBay": [ + { + "domain": "ebay.com", + "is_top": true + }, + { + "domain": "ebaysf.com", + "is_top": true + } + ], + "eInfochips": [ + { + "domain": "einfochips.com", + "is_top": true + } + ], + "eInstruction": [ + { + "domain": "einstruction.com", + "is_top": true + } + ], + "eNovance": [ + { + "domain": "enovance.com", + "is_top": true + } + ], + "eOriginal": [ + { + "domain": "eoriginal.com", + "is_top": true + } + ], + "eSATURNUS": [ + { + "domain": "esaturnus.com", + "is_top": true + } + ], + "eSentire": [ + { + "domain": "esentire.com", + "is_top": true + } + ], + "eXponent Technologies": [ + { + "domain": "exponent.gr", + "is_top": true + } + ], + "eZ Systems AS": [ + { + "domain": "ez.no", + "is_top": true + } + ], + "edX, Inc.": [ + { + "domain": "edx.org", + "is_top": true + } + ], + "emlix GmbH": [ + { + "domain": "emlix.com", + "is_top": true + } + ], + "enStratus": [ + { + "domain": "enstratius.com", + "is_top": true + } + ], + "eteration A.S.": [ + { + "domain": "eteration.com", + "is_top": true + } + ], + "ev-i Informationstechnologie": [ + { + "domain": "ev-i.at", + "is_top": true + } + ], + "exceet electronics": [ + { + "domain": "exceet-electronics.com", + "is_top": true + } + ], + "filoo": [ + { + "domain": "filoo.de", + "is_top": true + } + ], + "fuel7": [ + { + "domain": "fuel7.com", + "is_top": true + } + ], + "hbz": [], + "hjk engineering": [ + { + "domain": "hansjkoch.de", + "is_top": true + } + ], + "iDa Mobile": [ + { + "domain": "idamob.com", + "is_top": true + } + ], + "iNic": [ + { + "domain": "inic.no", + "is_top": true + } + ], + "iPlant Collaborative": [ + { + "domain": "iplantcollaborative.org", + "is_top": true + } + ], + "iTel Networks, Inc.": [ + { + "domain": "itel.com", + "is_top": true + } + ], + "iWeb": [ + { + "domain": "iweb.com", + "is_top": true + } + ], + "igel": [ + { + "domain": "igel.co.jp", + "is_top": true + } + ], + "imapp, ltd.": [ + { + "domain": "imapp.pl", + "is_top": true + } + ], + "internet24 GmbH": [ + { + "domain": "internet24.de", + "is_top": true + } + ], + "iomart Group": [ + { + "domain": "iomart.com", + "is_top": true + } + ], + "ipb (uk), Ltd.": [ + { + "domain": "ibp.de", + "is_top": true + } + ], + "iptelorg GmbH": [ + { + "domain": "iptel.org", + "is_top": true + } + ], + "isis-mpp": [ + { + "domain": "isismpp.fr", + "is_top": false + } + ], + "itemis AG": [ + { + "domain": "itemis.com", + "is_top": true + } + ], + "jmicron.com": [ + { + "domain": "jmicron.com", + "is_top": true + } + ], + "jusst technologies GmbH": [ + { + "domain": "jusst.de", + "is_top": true + } + ], + "Koneksys": [ + { + "domain": "koneksys.com", + "is_top": true + } + ], + "kt NexR": [ + { + "domain": "nexr.co.kr", + "is_top": true + } + ], + "linutronix": [ + { + "domain": "linutronix.de", + "is_top": true + } + ], + "m-privacy GmbH": [ + { + "domain": "m-privacy.de", + "is_top": true + } + ], + "medisite Systemhaus GmbH": [ + { + "domain": "medisite.de", + "is_top": true + } + ], + "neteffect technologies": [ + { + "domain": "ne-t.com", + "is_top": true + }, + { + "domain": "neteffect.com", + "is_top": false + } + ], + "nexB Inc.": [ + { + "domain": "nexb.com", + "is_top": true + } + ], + "novero GmbH": [ + { + "domain": "novero.com", + "is_top": true + } + ], + "nsfocus": [ + { + "domain": "nsfocus.com", + "is_top": true + } + ], + "oDesk Corporation": [ + { + "domain": "odesk.com", + "is_top": true + } + ], + "pair Networks": [ + { + "domain": "pair.com", + "is_top": true + } + ], + "picoChip Designs": [ + { + "domain": "picochip.com", + "is_top": true + } + ], + "productOps": [ + { + "domain": "productops.com", + "is_top": true + } + ], + "rPath, Inc.": [ + { + "domain": "rpath.com", + "is_top": true + } + ], + "raw engineering, Inc.": [ + { + "domain": "built.io", + "is_top": true + }, + { + "domain": "contentstack.io", + "is_top": true + }, + { + "domain": "raweng.com", + "is_top": true + } + ], + "reliablesolutions": [ + { + "domain": "reliablesolutions.de", + "is_top": true + } + ], + "section5": [ + { + "domain": "section5.ch", + "is_top": true + } + ], + "secunet": [ + { + "domain": "secunet.com", + "is_top": true + } + ], + "skinnyCorp LLC": [ + { + "domain": "skinnycorp.com", + "is_top": true + } + ], + "taskit": [ + { + "domain": "taskit.de", + "is_top": true + } + ], + "team(ix) GmbH": [ + { + "domain": "teamix.de", + "is_top": true + } + ], + "teamf1": [ + { + "domain": "teamf1.com", + "is_top": true + } + ], + "testing": [], + "txtr GmbH": [ + { + "domain": "txtr.com", + "is_top": true + } + ], + "universit\u00e9 Libre de Bruxelles": [ + { + "domain": "ulb.ac.be", + "is_top": true + } + ], + "vArmour": [ + { + "domain": "varmour.com", + "is_top": true + } + ], + "verit Informationssysteme GmbH": [ + { + "domain": "verit.de", + "is_top": true + } + ], + "weLaika": [ + { + "domain": "welaika.com", + "is_top": true + } + ], + "webERP Africa": [ + { + "domain": "weberpafrica.com", + "is_top": true + } + ], + "who Ingenieurgesellschaft mbH": [ + { + "domain": "who-ing.de", + "is_top": false + } + ], + "\u00c9cole polytechnique f\u00e9d\u00e9rale de Lausanne": [ + { + "domain": "epfl.ch", + "is_top": true + } + ], + "Peking University": [ + { + "domain": "pku.edu.cn", + "is_top": true + } + ], + "Beijing Institute of Technology": [ + { + "domain": "bit.edu.cn", + "is_top": true + } + ], + "Beijing Jiaotong University": [ + { + "domain": "bjtu.edu.cn", + "is_top": true + } + ], + "Wuhan University": [ + { + "domain": "whu.edu.cn", + "is_top": true + } + ], + "Beijing University of Posts and Telecommunications": [ + { + "domain": "bupt.edu.cn", + "is_top": true + } + ], + "Tsinghua University": [ + { + "domain": "mail.tsinghua.edu.cn", + "is_top": true + } + ], + "Shanghai Jiao Tong University": [ + { + "domain": "sjtu.edu.cn", + "is_top": true + } + ], + "Boston University": [ + { + "domain": "bu.edu", + "is_top": true + } + ], + "Xi'an Jiaotong University": [ + { + "domain": "tiaozhan.com", + "is_top": true + } + ], + "Cambrian": [ + { + "domain": "cambricon.com", + "is_top": true + } + ], + "Legato Health Technologies": [ + { + "domain": "legatohealth.com", + "is_top": true + } + ], + "PolyMage Labs": [ + { + "domain": "polymagelabs.com", + "is_top": true + } + ], + "Netaji Subhash Engineering College": [ + { + "domain": "nsec.ac.in", + "is_top": true + } + ], + "sparkfun": [ + { + "domain": "sparkfun.com", + "is_top": true + } + ], + "Himax Technologies": [ + { + "domain": "himax.com.tw", + "is_top": true + } + ], + "bytedance": [ + { + "domain": "bytedance.com", + "is_top": true + }, + { + "domain": "BYTEDANCE.COM", + "is_top": true + } + ], + "MAXAR": [ + { + "domain": "maxar.com", + "is_top": true + } + ], + "infineon": [ + { + "domain": "infineon.com", + "is_top": true + } + ], + "Cal Poly": [ + { + "domain": "calpoly.edu", + "is_top": true + } + ], + "espressif": [ + { + "domain": "espressif.com", + "is_top": true + } + ], + "Illinois": [ + { + "domain": "illinois.edu", + "is_top": true + } + ], + "Noble.AI": [ + { + "domain": "noble.ai", + "is_top": true + } + ], + "XMOS": [ + { + "domain": "xmos.com", + "is_top": true + } + ], + "Edge Impulse": [ + { + "domain": "edgeimpulse.com", + "is_top": true + } + ], + "SensiML": [ + { + "domain": "sensiml.com", + "is_top": true + } + ], + "Ravelin": [ + { + "domain": "ravelin.com", + "is_top": true + } + ], + "Brainscode": [ + { + "domain": "brainscode.com", + "is_top": true + } + ], + "University of Victoria": [ + { + "domain": "uvic.ca", + "is_top": true + } + ], + "Eyedea Recognition": [ + { + "domain": "eyedea.cz", + "is_top": true + } + ], + "University of Southampton": [ + { + "domain": "soton.ac.uk", + "is_top": true + } + ], + "Stylight": [ + { + "domain": "stylight.com", + "is_top": true + } + ], + "Artec 3D": [ + { + "domain": "artec-group.com", + "is_top": true + } + ], + "Criteo": [ + { + "domain": "criteo.com", + "is_top": true + } + ], + "Fizyr": [ + { + "domain": "fizyr.com", + "is_top": true + } + ], + "Hi Auto": [ + { + "domain": "hi.auto", + "is_top": true + } + ], + "Insoundz": [ + { + "domain": "insoundz.com", + "is_top": true + } + ], + "Peritiae": [ + { + "domain": "peritiae.it", + "is_top": true + } + ], + "University of Aveiro": [ + { + "domain": "ua.pt", + "is_top": true + } + ], + "Universidad Complutense de Madrid": [ + { + "domain": "ucm.es", + "is_top": true + } + ], + "Electrical and Electronics Engineering InstituteUniversity of the Philippines": [ + { + "domain": "eee.upd.edu.ph", + "is_top": true + } + ], + "ESI: Accueil": [ + { + "domain": "esi.dz", + "is_top": true + } + ], + "Georgia Tech": [ + { + "domain": "gatech.edu", + "is_top": true + } + ], + "Lambda": [ + { + "domain": "lambdal.com", + "is_top": true + } + ], + "Recogni": [ + { + "domain": "recogni.com", + "is_top": true + } + ], + "Reveal Technology": [ + { + "domain": "revealtech.ai", + "is_top": true + } + ], + "TCL": [ + { + "domain": "tcl.com", + "is_top": true + } + ], + "Western University": [ + { + "domain": "uwo.ca", + "is_top": true + } + ], + "Berkeley University Of California": [ + { + "domain": "berkeley.edu", + "is_top": true + } + ], + "Butterfly Network": [ + { + "domain": "butterflynetinc.com", + "is_top": true + } + ], + "Departamento de Ciência da Computação da UFMG": [ + { + "domain": "dcc.ufmg.br", + "is_top": true + } + ], + "Dropbox": [ + { + "domain": "dropbox.com", + "is_top": true + } + ], + "Illuminate": [ + { + "domain": "goilluminate.com", + "is_top": true + } + ], + "Hello": [ + { + "domain": "hello.com", + "is_top": true + } + ], + "KaiHong": [ + { + "domain": "kaihongdigi.com", + "is_top": true + }, + { + "domain": "kaihong.com", + "is_top": true + } + ], + "HOPERUN": [ + { + "domain": "hoperun.com", + "is_top": true + } + ], + "ISoftStone": [ + { + "domain": "isoftstone.com", + "is_top": true + } + ], + "ThunderSoft": [ + { + "domain": "thundersoft.com", + "is_top": true + } + ], + "ISCAS": [ + { + "domain": "iscas.ac.cn", + "is_top": true + } + ], + "ICS&S": [ + { + "domain": "chinasoftinc.com", + "is_top": true + }, + { + "domain": "chinasofti.com", + "is_top": true + } + ], + "Midea": [ + { + "domain": "midea.com", + "is_top": true + } + ], + "Neusoft": [ + { + "domain": "neusoft.com", + "is_top": true + } + ], + "KOTEI": [ + { + "domain": "kotei-info.com", + "is_top": true + } + ], + "Talkweb": [ + { + "domain": "talkweb.com.cn", + "is_top": true + } + ], + "Bestechnic": [ + { + "domain": "bestechnic.com", + "is_top": true + } + ], + "HOLD": [ + { + "domain": "holdiot.com", + "is_top": true + } + ], + "Southeast University": [ + { + "domain": "seu.edu.cn", + "is_top": true + } + ], + "UNIONMAN": [ + { + "domain": "unionman.com.cn", + "is_top": true + } + ], + "Telink": [ + { + "domain": "telink-semi.com", + "is_top": true + } + ], + "NUCLEI": [ + { + "domain": "nucleisys.com", + "is_top": true + } + ], + "CHIPSEA": [ + { + "domain": "chipsea.com", + "is_top": true + } + ], + "SUPER RED": [ + { + "domain": "superred.com.cn", + "is_top": true + } + ], + "ARCHERMIND": [ + { + "domain": "archermind.com", + "is_top": true + } + ], + "Kika Tech": [ + { + "domain": "archermind.com", + "is_top": true + } + ], + "UBTECH": [ + { + "domain": "ub-tech.cn", + "is_top": true + } + ], + "Antiy": [ + { + "domain": "antiy.cn", + "is_top": true + } + ], + "GOODIX": [ + { + "domain": "goodix.com", + "is_top": true + } + ], + "ASR": [ + { + "domain": "asrmicro.com", + "is_top": true + } + ], + "BILLJC": [ + { + "domain": "billjc.com", + "is_top": true + } + ], + "Digital China": [ + { + "domain": "digitalchina.com", + "is_top": true + } + ], + "H-Lab Informatikai Kft.": [ + { + "domain": "h-lab.eu", + "is_top": true + } + ], + "Glandium": [ + { + "domain": "glandium.org", + "is_top": true + } + ], + "Bananium": [ + { + "domain": "bananium.fr", + "is_top": true + } + ], + "Karunya": [ + { + "domain": "karunya.edu.in", + "is_top": true + } + ], + "NC State University": [ + { + "domain": "ncsu.edu", + "is_top": true + } + ] + }, + "time": "2019-09-09 07:00:00", + "uidentities": {} +} \ No newline at end of file diff --git a/project-gitee.json b/project-gitee.json new file mode 100644 index 0000000..7f05871 --- /dev/null +++ b/project-gitee.json @@ -0,0 +1,55 @@ +{ + "gitee": { + "gitee-software-artifact": [ + "https://gitee.com/paradigm4/OpenMLDB", + "https://gitee.com/mindspore/mindspore", + "https://gitee.com/opengauss/openGauss-server", + "https://gitee.com/mindspore/mindinsight", + "https://gitee.com/mindspore/mindscience", + "https://gitee.com/mymagicpower/AIAS", + "https://gitee.com/fastnlp/fastNLP", + "https://gitee.com/secretflow/secretflow", + "https://gitee.com/apitable/APITable", + "https://gitee.com/dromara/go-view", + "https://gitee.com/Armink/FlashDB", + "https://gitee.com/mqttsnet/thinglinks", + "https://gitee.com/IoTSharp/IoTSharp", + "https://gitee.com/Runner-Go-Team/RunnerGo", + "https://gitee.com/zzdevelop/lenosp", + "https://gitee.com/opengoofy/hippo4j", + "https://gitee.com/secretflow/secretflow", + "https://gitee.com/seagull1985/LuckyFrameClient", + "https://gitee.com/acl-dev/acl", + "https://gitee.com/actframework/actframework", + "https://gitee.com/actionview/av", + "https://gitee.com/agile-bpm/agile-bpm-basic", + "https://gitee.com/mymagicpower/AIAS", + "https://gitee.com/AirtestProject/Airtest", + "https://gitee.com/anji-plus/captcha", + "https://gitee.com/anji-plus/report", + "https://gitee.com/baidu/amis", + "https://gitee.com/ant-design/ant-design", + "https://gitee.com/ant-design-blazor/ant-design-blazor", + "https://gitee.com/ant-design/ant-design-pro", + "https://gitee.com/ant-design-vue/ant-design-vue", + "https://gitee.com/iresty/apisix", + "https://gitee.com/Sharding-Sphere/sharding-sphere", + "https://gitee.com/apiadmin/ApiAdmin", + "https://gitee.com/Tencent/APIJSON", + "https://gitee.com/apioak/apioak", + "https://gitee.com/apitable/APITable", + "https://gitee.com/ApolloAuto/apollo", + "https://gitee.com/apolloconfig/apollo", + "https://gitee.com/rtttte/Archery", + "https://gitee.com/arthas/arthas", + "https://gitee.com/jd-platform-opensource/asyncTool", + "https://gitee.com/goatom/atomci", + "https://gitee.com/qiujiayu/AutoLoadCache", + "https://gitee.com/smallweigit/avue", + "https://gitee.com/zlgopen/awtk", + "https://gitee.com/notrynohigh/BabyOS" + ], + "gitee-governance": [ + ] + } +} \ No newline at end of file diff --git a/project-gitee.yaml b/project-gitee.yaml new file mode 100644 index 0000000..ec1f369 --- /dev/null +++ b/project-gitee.yaml @@ -0,0 +1,27 @@ +url: + "http://localhost:9200" + +params: + { + 'git_index': 'git_chaoss_enriched', + 'git_aoc_index': 'git-aoc_chaoss_enriched', + 'git_onion_index':'git-onion_enriched', + 'cocom_index':'cocom_chaoss_enrich', + 'colic_index':'colic_chaoss_enrich', + 'issue_index': 'gitee_issues_chaoss_enriched', + 'pr_index':'gitee_pulls_chaoss_enriched', + 'repo_index':'gitee_repo_enriched', + 'issue_comments_index':'gitee2-issues_enriched', + 'pr_comments_index':'gitee2-pull_enriched', + 'json_file': '/home/ruoxuan/metrics-model/project-gitee.json', + 'git_branch': None, + 'from_date': '2023-05-01', + 'end_date': '2023-06-30', + 'out_index': 'health_metric_model', + 'risk_index': 'risk_model', + 'community': 'gitee', + 'level': 'repo', + 'company': 'gitee', + 'identities_config_file': '/home/ruoxuan/metrics-model/identities.yml', + 'organizations_config_file': '/home/ruoxuan/metrics-model/organizations.json' + } \ No newline at end of file diff --git a/project-github copy.json b/project-github copy.json new file mode 100644 index 0000000..0b69862 --- /dev/null +++ b/project-github copy.json @@ -0,0 +1,58 @@ +{ + "github": { + "github-software-artifact": [ + "https://github.com/ayamir/nvimdots", + "https://github.com/oceanbase/oceanbase", + "https://github.com/PaddlePaddle/Paddle", + "https://github.com/microsoft/CNTK", + "https://github.com/keras-team/keras", + "https://github.com/apache/mxnet", + "https://github.com/onnx/onnx", + "https://github.com/redis/redis", + "https://github.com/tikv/tikv", + "https://github.com/google/leveldb", + "https://github.com/hivedb/hive", + "https://github.com/apache/spark", + "https://github.com/apache/flink", + "https://github.com/apache/hive", + "https://github.com/apache/hadoop", + "https://github.com/apache/kafka", + "https://github.com/spring-projects/spring-batch", + "https://github.com/lf-edge/ekuiper", + "https://github.com/apache/pulsar", + "https://github.com/apache/hudi", + "https://github.com/apache/iceberg", + "https://github.com/Delta-ML/delta", + "https://github.com/delta-io/delta", + "https://github.com/apache/storm", + "https://github.com/confluentinc/ksql", + "https://github.com/lencx/ChatGPT", + "https://github.com/PlexPt/awesome-chatgpt-prompts-zh", + "https://github.com/acheong08/ChatGPT", + "https://github.com/transitive-bullshit/chatgpt-api", + "https://github.com/nltk/nltk", + "https://github.com/explosion/spaCy", + "https://github.com/stanfordnlp/CoreNLP", + "https://github.com/apache/opennlp", + "https://github.com/RaRe-Technologies/gensim", + "https://github.com/huggingface/transformers", + "https://github.com/allenai/allennlp", + "https://github.com/PetrochukM/PyTorch-NLP", + "https://github.com/facebookresearch/fastText", + "https://github.com/hankcs/HanLP", + "https://github.com/fxsjy/jieba", + "https://github.com/facebookresearch/pytext", + "https://github.com/nexB/scancode-toolkit", + "https://github.com/DependencyTrack/dependency-track", + "https://github.com/XmirrorSecurity/OpenSCA-cli", + "https://github.com/murphysecurity/murphysec", + "https://github.com/mergebase/log4j-detector", + "https://github.com/AppThreat/dep-scan", + "https://github.com/stevespringett/nist-data-mirror", + "https://github.com/pytorch/pytorch", + "https://github.com/tensorflow/tensorflow" + ], + "github-governance": [ + ] + } +} \ No newline at end of file diff --git a/project-github.json b/project-github.json new file mode 100644 index 0000000..0b69862 --- /dev/null +++ b/project-github.json @@ -0,0 +1,58 @@ +{ + "github": { + "github-software-artifact": [ + "https://github.com/ayamir/nvimdots", + "https://github.com/oceanbase/oceanbase", + "https://github.com/PaddlePaddle/Paddle", + "https://github.com/microsoft/CNTK", + "https://github.com/keras-team/keras", + "https://github.com/apache/mxnet", + "https://github.com/onnx/onnx", + "https://github.com/redis/redis", + "https://github.com/tikv/tikv", + "https://github.com/google/leveldb", + "https://github.com/hivedb/hive", + "https://github.com/apache/spark", + "https://github.com/apache/flink", + "https://github.com/apache/hive", + "https://github.com/apache/hadoop", + "https://github.com/apache/kafka", + "https://github.com/spring-projects/spring-batch", + "https://github.com/lf-edge/ekuiper", + "https://github.com/apache/pulsar", + "https://github.com/apache/hudi", + "https://github.com/apache/iceberg", + "https://github.com/Delta-ML/delta", + "https://github.com/delta-io/delta", + "https://github.com/apache/storm", + "https://github.com/confluentinc/ksql", + "https://github.com/lencx/ChatGPT", + "https://github.com/PlexPt/awesome-chatgpt-prompts-zh", + "https://github.com/acheong08/ChatGPT", + "https://github.com/transitive-bullshit/chatgpt-api", + "https://github.com/nltk/nltk", + "https://github.com/explosion/spaCy", + "https://github.com/stanfordnlp/CoreNLP", + "https://github.com/apache/opennlp", + "https://github.com/RaRe-Technologies/gensim", + "https://github.com/huggingface/transformers", + "https://github.com/allenai/allennlp", + "https://github.com/PetrochukM/PyTorch-NLP", + "https://github.com/facebookresearch/fastText", + "https://github.com/hankcs/HanLP", + "https://github.com/fxsjy/jieba", + "https://github.com/facebookresearch/pytext", + "https://github.com/nexB/scancode-toolkit", + "https://github.com/DependencyTrack/dependency-track", + "https://github.com/XmirrorSecurity/OpenSCA-cli", + "https://github.com/murphysecurity/murphysec", + "https://github.com/mergebase/log4j-detector", + "https://github.com/AppThreat/dep-scan", + "https://github.com/stevespringett/nist-data-mirror", + "https://github.com/pytorch/pytorch", + "https://github.com/tensorflow/tensorflow" + ], + "github-governance": [ + ] + } +} \ No newline at end of file diff --git a/project-github.yaml b/project-github.yaml new file mode 100644 index 0000000..1b33663 --- /dev/null +++ b/project-github.yaml @@ -0,0 +1,27 @@ +url: + "http://localhost:9200" + +params: + { + 'git_index': 'git_chaoss_enriched', + 'git_aoc_index': 'git-aoc_chaoss_enriched', + 'git_onion_index':'git-onion_enriched', + 'cocom_index':'cocom_chaoss_enrich', + 'colic_index':'colic_chaoss_enrich', + 'issue_index': 'github_issues_chaoss_enriched', + 'pr_index':'github_pulls_chaoss_enriched', + 'repo_index':'github_repo_enriched', + 'issue_comments_index':'github2-issues_enriched', + 'pr_comments_index':'github2-pull_enriched', + 'json_file': '/home/ruoxuan/metrics-model/project-github.json', + 'git_branch': None, + 'from_date': '2023-05-01', + 'end_date': '2023-06-30', + 'out_index': 'health_metric_model', + 'risk_index': 'risk_model', + 'community': 'github', + 'level': 'repo', + 'company': 'github', + 'identities_config_file': '/home/ruoxuan/metrics-model/identities.yml', + 'organizations_config_file': '/home/ruoxuan/metrics-model/organizations.json' + } \ No newline at end of file diff --git a/run.py b/run.py new file mode 100644 index 0000000..6005265 --- /dev/null +++ b/run.py @@ -0,0 +1,103 @@ +from metrics_model.codeDevActivityModel import CodeDevActivityModel +from metrics_model.codeDevQualityModel import CodeDevQualityModel +from metrics_model.codeSecurityModel import CodeSecurityModel +from metrics_model.communityActivityModel import CommunityActivityModel +from metrics_model.humanDiversityModel import HumanDiversityModel +from metrics_model.techDiversityModel import TechDiversityModel +from metrics_model.summaryModel import SummaryModel +from metrics_model.statModel import ( + CodeDevActivityStatistic, + CodeDevQualityStatistic, + CodeSecurityStatistic, + CommunityActivityStatistic, + HumanDiversityStatistic, + TechDiversityStatistic +) + +import yaml + +def process(cofig_url, elastic_url, params): + # 代码开发活动 + kwargs = {} + for item in ['git_index', 'issue_index', 'repo_index', 'pr_index', 'pr_comments_index', 'json_file', 'out_index', 'git_branch', 'from_date', 'end_date', 'community', 'level', 'company']: + kwargs[item] = params[item] + model_CodeDevActivity = CodeDevActivityModel(**kwargs) + model_CodeDevActivity.metrics_model_metrics(elastic_url) + + # 代码开发效率 + kwargs = {} + for item in ['git_index', 'issue_index', 'repo_index', 'pr_index', 'pr_comments_index', 'json_file', 'out_index', 'git_branch', 'from_date', 'end_date', 'community', 'level', 'company']: + kwargs[item] = params[item] + model_CodeDevQuality = CodeDevQualityModel(**kwargs) + model_CodeDevQuality.metrics_model_metrics(elastic_url) + + # 代码安全保障 + kwargs = {} + for item in ['git_index', 'issue_index', 'repo_index', 'pr_index', 'pr_comments_index', 'cocom_index', 'colic_index', 'json_file', 'out_index', 'git_branch', 'from_date', 'end_date', 'community', 'level', 'company']: + kwargs[item] = params[item] + model_CodeSecurity = CodeSecurityModel(**kwargs) + model_CodeSecurity.metrics_model_metrics(elastic_url) + + # 社区活跃度 + kwargs = {} + for item in ['git_index', 'issue_index', 'repo_index', 'pr_index', 'issue_comments_index', 'pr_comments_index', 'json_file', 'out_index', 'git_branch', 'from_date', 'end_date', 'community', 'level', 'company']: + kwargs[item] = params[item] + model_communityActivity = CommunityActivityModel(**kwargs) + model_communityActivity.metrics_model_metrics(elastic_url) + + # 人员多样性 + kwargs = {} + for item in ['git_index', 'issue_index', 'repo_index', 'pr_index', 'issue_comments_index', 'pr_comments_index', 'json_file', 'out_index', 'git_branch', 'from_date', 'end_date', 'community', 'level', 'company']: + kwargs[item] = params[item] + model_humanDiversity = HumanDiversityModel(**kwargs) + model_humanDiversity.metrics_model_metrics(elastic_url) + + # 技术多样性 + kwargs = {} + for item in ['git_index', 'issue_index', 'repo_index', 'pr_index', 'pr_comments_index', 'git_aoc_index', 'colic_index','json_file', 'out_index', 'git_branch', 'from_date', 'end_date', 'community', 'level', 'company']: + kwargs[item] = params[item] + model_techDiversity = TechDiversityModel(**kwargs) + model_techDiversity.metrics_model_metrics(elastic_url) + + # 总结 + kwargs = {} + for item in ['issue_index', 'git_index', 'json_file', 'out_index', 'risk_index', 'git_branch', 'from_date', 'end_date', 'community', 'level', 'company']: + kwargs[item] = params[item] + model_summary = SummaryModel(**kwargs) + model_summary.metrics_model_metrics(elastic_url) + +if __name__ == '__main__': + cofig_urls = ["/home/ruoxuan/metrics-model/community-gitee-openeuler.yaml", "/home/ruoxuan/metrics-model/community-gitee-openharmony.yaml", "/home/ruoxuan/metrics-model/project-gitee.yaml", "/home/ruoxuan/metrics-model/project-github.yaml"] + # cofig_urls = ["/home/ruoxuan/metrics-model/project-github.yaml"] + + for cofig_url in cofig_urls: + CONF = yaml.safe_load(open(cofig_url)) + # print(CONF) + elastic_url = CONF['url'] + params = CONF['params'] + process(cofig_url, elastic_url, params) + + + # 代码开发活动 + stat_CodeDevActivity = CodeDevActivityStatistic(params['out_index'], 'Code develop activity', params['from_date'], params['end_date'], params['out_index']) + stat_CodeDevActivity.metrics_model_statistic(elastic_url) + + # 代码开发效率 + stat_CodeDevQuality = CodeDevQualityStatistic(params['out_index'], 'Code develop Quality', params['from_date'], params['end_date'], params['out_index']) + stat_CodeDevQuality.metrics_model_statistic(elastic_url) + + # 代码开发质量 + stat_CodeSecurity = CodeSecurityStatistic(params['out_index'], 'Code security', params['from_date'], params['end_date'], params['out_index']) + stat_CodeSecurity.metrics_model_statistic(elastic_url) + + # 社区活跃度 + stat_CommunityActivity = CommunityActivityStatistic(params['out_index'], 'community activity', params['from_date'], params['end_date'], params['out_index']) + stat_CommunityActivity.metrics_model_statistic(elastic_url) + + # 人员多样性 + stat_HumanDiversity = HumanDiversityStatistic(params['out_index'], 'human Diversity', params['from_date'], params['end_date'], params['out_index']) + stat_HumanDiversity.metrics_model_statistic(elastic_url) + + # 技术多样性 + stat_TechDiversity = TechDiversityStatistic(params['out_index'], 'technology Diversity', params['from_date'], params['end_date'], params['out_index']) + stat_TechDiversity.metrics_model_statistic(elastic_url) \ No newline at end of file